V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
snopy
V2EX  ›  程序员

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

  •  
  •   snopy · 2015-10-16 15:08:00 +08:00 · 3868 次点击
    这是一个创建于 3353 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

    另外吐槽一下 awk, 直接写 awk -F "|" '$24 =="8" && $25 == "162"' 就可以了, 不用 if
    402124773
        13
    402124773  
       2015-10-16 20:32:45 +08:00
    在使用 shell 脚本之前,是否考虑过把大文件分成几块,然后再执行,应该能稍微缓解下
    snopy
        14
    snopy  
    OP
       2015-10-17 12:53:49 +08:00
    @402124773 @goodryb 用“ nohup 脚本 &”放在后台执行,同时执行好几个脚本,那么它们是并行执行吗?我感觉同时执行几个脚本效率也很低,难道真的是磁盘 IO 影响很大?
    htc502
        15
    htc502  
       2015-10-17 14:08:36 +08:00   ❤️ 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  
       2015-10-18 11:13:51 +08:00
    @ryd994 从我个人实际操作来看,影响还是挺大的,我是指用 shell 来处理,我当时也没有记录数据,所以现在只是说个人感受
    goodryb
        17
    goodryb  
       2015-10-18 11:17:16 +08:00
    @binux if 的问题你要问楼主,我直接 copy 过来的。写上也几乎不影响不到楼主问题的处理效率
    既然现在是讨论效率的问题,当然是要减少不利因素,如果你觉得没影响,也可以不用管
    goodryb
        18
    goodryb  
       2015-10-18 11:18:51 +08:00
    @snopy 并发的前提是要对文件进行分割,然后每个脚本处理不同的文件,这样就会快一些
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2438 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 01:45 · PVG 09:45 · LAX 17:45 · JFK 20:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.