如何快速从 TB 级别的数据中过滤出有用数据 - V2EX
请不要在回答技术问题时复制粘贴 AI 生成的内容
snopy

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

  •  
  •   snopy Oct 16, 2015 4574 views
    This topic created in 3865 days ago, the information mentioned may be changed or developed.

    数据源是从华为 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 '{prnt $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 级别),想问一下有没有更好更快的方法去实现对文本数据的过滤?

    18 replies    2015-10-18 11:18:51 +08:00
    bigtan
        1
    bigtan  
       Oct 16, 2015
    这种场景语言差异很大,试试 c/c++自己写
    Andiry
        2
    Andiry  
       Oct 16, 2015 via Android
    mapreduce
    aheadlead
        3
    aheadlead  
       Oct 16, 2015
    jstorm ?
    songco
        4
    songco  
       Oct 16, 2015   1
    如果格式固定, 过滤条件比较简单, io 密集型的, 随便什么语言写个程序效率应该都差不多.

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

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

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

    lz 的需求不是很明确, 比如数据存在哪里, 有多少台机器可以用之类的最好说明一下.
    crazyboy2014
        5
    crazyboy2014  
       Oct 16, 2015
    尝试 gun parallel
    xfspace
        6
    xfspace  
       Oct 16, 2015
    用 SSD 组 RAID10 试试
    inter
        7
    inter  
       Oct 16, 2015
    用 perl 就行,就你这处理条件,速度基本就是你的磁盘速度。普通家用硬盘速度 10 个小时跑完一天数据,刚刚好
    motopig
        8
    motopig  
       Oct 16, 2015
    spring bath
    aver4vex
        9
    aver4vex  
       Oct 16, 2015
    my_cOnf=ls -l /ftp/S1U-103-20151013*.txt|awk '{print $9}'
    这句太生猛了,机器内存扛得住吗
    goodryb
        10
    goodryb  
       Oct 16, 2015
    你这能快就见鬼了,哈哈
    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
        11
    ryd994  
       Oct 16, 2015 via Android
    @goodryb 有写入缓存也差不了多少吧……又不是 sync
    binux
        12
    binux  
       Oct 16, 2015
    @goodryb 前面写一句文件名到 log 里面怎么了嘛! 一个文件就写一次有多大的开销啊!

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

    1. 并行。切开$x 文件,并行任务。循环也可以部分并行, google ‘ gnu parallel ’有惊喜
    2. 敢问那个 LANG = C 是啥意思?没懂。。。撸个 c 版本
    或者用 perl 搞一搞, c 的也应该不难啊,,,几十行应该能够搞定。。
    光撸 awk 。。。。>>$my_log 那一行就行,其他还用 bash 或 perl 。 perl 也挺快
    3. 预测滤出数据量。。。兴许你这两天跑的数据都是那 0.05 的奇葩部分也说不定啊。。
    goodryb
        16
    goodryb  
       Oct 18, 2015
    @ryd994 从我个人实际操作来看,影响还是挺大的,我是指用 shell 来处理,我当时也没有记录数据,所以现在只是说个人感受
    goodryb
        17
    goodryb  
       Oct 18, 2015
    @binux if 的问题你要问楼主,我直接 copy 过来的。写上也几乎不影响不到楼主问题的处理效率
    既然现在是讨论效率的问题,当然是要减少不利因素,如果你觉得没影响,也可以不用管
    goodryb
        18
    goodryb  
       Oct 18, 2015
    @snopy 并发的前提是要对文件进行分割,然后每个脚本处理不同的文件,这样就会快一些
    About     Help     Advertise     Blog     API     FAQ     Solana     2950 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 57ms UTC 14:58 PVG 22:58 LAX 07:58 JFK 10:58
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86