如何快速从 TB 级别的数据中过滤出有用数据

2015-10-16 15:08:00 +08:00
 snopy

数据源是从华为 XDR 导过来的,每天数据量大概 3.5TB ,目前想从中过滤出一些有用信息(方法是限定大类 ID 、小类 ID ),我用的是 shell 脚本去执行:

!/bin/bash

work_dir=dirname $0
cd ${work_dir}
my_log=count_103.log
LANG=C
my_conf=ls -l /ftp/S1U-103-20151013*.txt|awk '{print $9}'
for x in $my_conf
do
echo $x >>$my_log
awk -F "|" '{if ($24 =="8" && $25 == "162") print $0}' $x >>$my_log
done
目前脚本跑的情况来看,速度非常慢,两天只过滤出了 90M 左右的数据(预测过滤出的数据量应该在 GB 级别),想问一下有没有更好更快的方法去实现对文本数据的过滤?

3870 次点击
所在节点    程序员
18 条回复
bigtan
2015-10-16 15:18:14 +08:00
这种场景语言差异很大,试试 c/c++自己写
Andiry
2015-10-16 15:19:46 +08:00
mapreduce
aheadlead
2015-10-16 15:25:36 +08:00
jstorm ?
songco
2015-10-16 15:33:03 +08:00
如果格式固定, 过滤条件比较简单, io 密集型的, 随便什么语言写个程序效率应该都差不多.

这种的处理主要瓶颈是磁盘的性能, 比如之考虑读取, 单机器单普通硬盘, 按 50MB/s 的速度来过滤, 一天差不多 50MB*3600*24/1024/1024≈4.12T

实际上数据导出还要考虑网络, 导出数据的磁盘写入之类的.

用 hadoop 之类的效率会差很多.

lz 的需求不是很明确, 比如数据存在哪里, 有多少台机器可以用之类的最好说明一下.
crazyboy2014
2015-10-16 15:51:42 +08:00
尝试 gun parallel
xfspace
2015-10-16 15:57:55 +08:00
用 SSD 组 RAID10 试试
inter
2015-10-16 16:04:13 +08:00
用 perl 就行,就你这处理条件,速度基本就是你的磁盘速度。普通家用硬盘速度 10 个小时跑完一天数据,刚刚好
motopig
2015-10-16 16:25:37 +08:00
spring bath
aver4vex
2015-10-16 16:31:55 +08:00
my_conf=ls -l /ftp/S1U-103-20151013*.txt|awk '{print $9}'
这句太生猛了,机器内存扛得住吗
goodryb
2015-10-16 17:18:43 +08:00
你这能快就见鬼了,哈哈
for x in $my_conf
do
echo $x >>$my_log
awk -F "|" '{if ($24 =="8" && $25 == "162") print $0}' $x >>$my_log
done
你知道一次 IO 要耗时多久吗?
居然还要分两次写进去

就算你没有大数据处理经验,难道就不能分割,然后并行处理吗?

一台机器慢就不能多用几台机器吗?

好吧,我之前处理过几百 GB 级别的,分在 12 台机器上 8 核机器上,然后并发 8 个进程

用 shell 来处理,核心还是要减少 IO
ryd994
2015-10-16 20:23:24 +08:00
@goodryb 有写入缓存也差不了多少吧……又不是 sync
binux
2015-10-16 20:29:56 +08:00
@goodryb 前面写一句文件名到 log 里面怎么了嘛! 一个文件就写一次有多大的开销啊!

另外吐槽一下 awk, 直接写 awk -F "|" '$24 =="8" && $25 == "162"' 就可以了, 不用 if
402124773
2015-10-16 20:32:45 +08:00
在使用 shell 脚本之前,是否考虑过把大文件分成几块,然后再执行,应该能稍微缓解下
snopy
2015-10-17 12:53:49 +08:00
@402124773 @goodryb 用“ nohup 脚本 &”放在后台执行,同时执行好几个脚本,那么它们是并行执行吗?我感觉同时执行几个脚本效率也很低,难道真的是磁盘 IO 影响很大?
htc502
2015-10-17 14:08:36 +08:00
昨天就想回你,自己作死,被 V2EX 禁言了 1800 秒。。。

1. 并行。切开$x 文件,并行任务。循环也可以部分并行, google ‘ gnu parallel ’有惊喜
2. 敢问那个 LANG = C 是啥意思?没懂。。。撸个 c 版本
或者用 perl 搞一搞, c 的也应该不难啊,,,几十行应该能够搞定。。
光撸 awk 。。。。>>$my_log 那一行就行,其他还用 bash 或 perl 。 perl 也挺快
3. 预测滤出数据量。。。兴许你这两天跑的数据都是那 0.05 的奇葩部分也说不定啊。。
goodryb
2015-10-18 11:13:51 +08:00
@ryd994 从我个人实际操作来看,影响还是挺大的,我是指用 shell 来处理,我当时也没有记录数据,所以现在只是说个人感受
goodryb
2015-10-18 11:17:16 +08:00
@binux if 的问题你要问楼主,我直接 copy 过来的。写上也几乎不影响不到楼主问题的处理效率
既然现在是讨论效率的问题,当然是要减少不利因素,如果你觉得没影响,也可以不用管
goodryb
2015-10-18 11:18:51 +08:00
@snopy 并发的前提是要对文件进行分割,然后每个脚本处理不同的文件,这样就会快一些

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/228553

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX