Hadoop 对于大文件是如何切分的?是按照行进行切分吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
RangerWolf
V2EX    Hadoop

Hadoop 对于大文件是如何切分的?是按照行进行切分吗?

  •  
  •   RangerWolf 2014-09-11 07:39:35 +08:00 10326 次点击
    这是一个创建于 4048 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有一个文件,虽然每行一条记录,但是上下几行之间都是有相关关系的,相当于一个Session。session之间通过空行分隔。

    刚用上Hadoop,不太了解内部机制。看书说大文件会被切分成64MB一个block。我想会不会一个session被分到不同的block? 如果希望按照空行进行切分,当然block的size还是尽量大,有什么参考资料吗?

    多谢啦!
    13 条回复    2014-09-13 08:01:49 +08:00
    forest520
        1
    forest520  
       2014-09-11 08:34:17 +08:00
    默认情况下,可能会一行分到不同的block。
    如果希望按自己的方式切分块,需要自定义相关的类。
    bbx
        2
    bbx  
       2014-09-11 09:32:47 +08:00
    这个问题最简单的解决方法就是,你把你有关联的行,都放在一行,用分隔符分割,读到mapper里面再分割。
    harrychuh
        3
    harrychuh  
       2014-09-11 09:39:19 +08:00 via Android
    hdfs对于客户端是透明的,文件是以什么形式分块存储的,是64MB还是其他大小,从哪里开始分割,客户端无需关心,一次全部读入内存或者逐行读取,你都不需要关心文件是否半截在另外一个block中,关注自己程式的逻辑即可
    RangerWolf
        4
    RangerWolf  
    OP
       2014-09-11 10:16:14 +08:00
    @forest520
    @bbx
    @harrychuh 汗啊~ 楼上几位讲的好像都不太一样
    flynnX
        5
    flynnX  
       2014-09-11 11:45:41 +08:00   1
    可以参考下这个,hadoop如何处理跨block的行, http://stackoverflow.com/questions/14291170/how-does-hadoop-process-records-records-split-across-block-boundaries 按照@bbx的方法比较简单些,一行就是一个session
    bbx
        6
    bbx  
       2014-09-11 12:39:13 +08:00   1
    @RangerWolf 如果你是随便玩儿玩儿,那就随便搞,无所谓。如果你明天deadline,就按照我说的搞就行了。。。工作中,肯定是怎么方便正确怎么来
    YORYOR
        7
    YORYOR  
       2014-09-11 15:07:03 +08:00   1
    自定义一个writable类包含这写相关联的行的信息即可
    RangerWolf
        8
    RangerWolf  
    OP
       2014-09-11 17:28:19 +08:00
    @flynnX 这个我之前也搜到了~ 我看上面的描述是Hadoop默认会针对行进行处理 但是不同的行,类似这样的一个session,简单的还会按照@bbx来好了~ 只是首先还要将全文处理一边。
    20150517
        9
    20150517  
       2014-09-11 18:00:09 +08:00 via Android
    我用hive的,感觉block是透明的,数据是以partiton为单位的
    firstway
        10
    firstway  
       2014-09-12 11:06:43 +08:00   2
    如果block设置为64M,那么每个block就是64M,除了最后一个block可能不满64M,
    block是不会考虑一行几行的,行或session概念是业务层面,hdfs是不会涉及的。
    那么怎么在map阶段怎么处理行或session的边界问题,实际上由reader来处理的。
    代码参考:
    org.apache.hadoop.mapred.LineRecordReader.LineReader

    简要来说,如果一行跨越了block,比如一行10个字节,前4个字节在第N个block,后6个在N+1个block里面,reader来处理,怎么处理?
    因为reader是per block,就是一个block一个(准确的说是一个split一个),
    第N个reader会留下最后4个字节不读,第N+1个reader会网络读取第N个block末尾一部分数据,足以包含那4个字节就行了。
    到底是前面不读后面读, 还是前面读,后面不读,其实都行,在reader里面实现一种就行了。

    本人有hadoop应用和hadoop本身开发不少经验,不会有错的。
    RangerWolf
        11
    RangerWolf  
    OP
       2014-09-12 12:41:26 +08:00
    @firstway 赞! 那如果在业务层面要处理的是session或者说是几行字符串为一个单位,那是不是要自己实现一个Reader? 比如默认的是LineReader,我这边的情况就需要自己搞定一个SessionReader ? 问题比较多~ 经验不足,见谅~
    firstway
        12
    firstway  
       2014-09-13 05:59:20 +08:00
    @RangerWolf
    是的,如果你们有自己分割逻辑,需要自己定义SessionReader,不过很简单,读懂LineReader,仿照写,花不了多少功夫,写完后对这些认识会更进一步。
    RangerWolf
      &bsp; 13
    RangerWolf  
    OP
       2014-09-13 08:01:49 +08:00
    @firstway 非常非常感谢!
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3918 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 00:16 PVG 08:16 LAX 17:16 JFK 20:16
    Do have faith in what you're doing.
    ubao 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