V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
RangerWolf
V2EX  ›  Hadoop

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

  •  
  •   RangerWolf · 2014-09-11 07:39:35 +08:00 · 9991 次点击
    这是一个创建于 3728 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有一个文件,虽然每行一条记录,但是上下几行之间都是有相关关系的,相当于一个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
        13
    RangerWolf  
    OP
       2014-09-13 08:01:49 +08:00
    @firstway 非常非常感谢!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3220 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 13:22 · PVG 21:22 · LAX 05:22 · JFK 08:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.