【问题标题】:Hadoop java file that contains a mapper reading from a block包含从块读取的映射器的 Hadoop java 文件
【发布时间】:2023-03-09 01:59:01
【问题描述】:

正如我们在 Hadoop 的 MapReduce 中所知道的,映射器从存储在 HDFS 的节点中的块中读取数据。但是映射器实际上是如何从块中读取的呢?块是否连续向映射器发送字节,直到映射器达到其拆分大小?还是它做其他事情?

如果是这样,这发生在哪个 java 文件上? 另外,我使用的是 Hadoop 2.7.1,以防万一。

【问题讨论】:

    标签: java hadoop mapreduce hadoop2


    【解决方案1】:

    Hadoop MapReduce 作业输入格式包含两个主要组件:

    InputSplit :将输入数据源(例如,输入文件)划分为片段,这些片段构成了各个地图任务的输入。这些片段被称为“分裂”。例如,大多数文件在 HDFS 中底层块的边界上被分割,并由 FileInputSplit 类的实例表示。分割文件背后的逻辑是通过InputSplit实现的。

    RecordReader : 从 Split 读取数据并发送到 Map-Reduce 作业。 TextInputFormat 严格按照字节偏移量将文件分成多个部分。一个分割的结束偏移量可以在一行的中间,在这种情况下,我们应该在 RecordReader 中实现逻辑,从下一个分割中读取数据,直到到达行尾并将其传递给当前的映射器。

    更多详情请参考link

    【讨论】:

    • 我检查了 RecordReader.java 和 InputSplit.java 并且没有一段代码显示任何提示的某种 while 循环读取到文件末尾。
    • RecordReader.java 和 InputSplit.java 都是接口,你必须检查实现这些接口的类的任何输入格式的实现,例如 TextInputFormat。
    【解决方案2】:

    InputFormat 描述了 Map-Reduce 作业的输入规范。 Map-Reduce 框架依赖作业的 InputFormat 来:

    1. 验证作业的输入规范。
    2. 将输入文件拆分为逻辑 InputSplits,然后将每个文件分配给单独的 Mapper。
    3. 提供RecordReader 实现以用于从逻辑InputSplit 收集输入记录,以供映射器处理。

    InputSplit代表个人Mapper要处理的数据。

    查看FileInputFormat 代码以了解拆分的工作原理。

    API:

    public List<InputSplit> getSplits(JobContext job
                                        ) throws IOException {
    

    RecordReader 将数据分解为键/值对以输入到 Mapper。

    RecordReader 有多种类型。

    CombineFileRecordReader, CombineFileRecordReaderWrapper, ComposableRecordReader, 
    DBRecordReader, KeyValueLineRecordReader, SequenceFileAsTextRecordReader, 
    SequenceFileRecordReader
    

    最常用的一个:KeyValueLineRecordReader

    查看相关的 SE 问题,以更好地了解 read 的内部结构: How does Hadoop process records split across block boundaries?

    【讨论】:

    • 我将一个压缩文本文件传输到 HDFS,当我在其上运行 WordCount 作业时它使用哪个 RecordReader?
    • CustomFileInputFormat 和 CustomLineReader。看看这两篇文章:hadoopi.wordpress.com/2013/05/27/…cutler.io/2012/07/hadoop-processing-zip-files-in-mapreduce
    • 我似乎无法找到 CustomFileInputFormat 和 CustomLineReader (Hadoop 2.7.1)。我知道这是其中一个链接使用的,但 Hadoop 使用的是哪一个?
    • Custom FileInputFormat 和 Custom LineReader 不是现有的类。新课程已编写完毕,可在上述链接中找到。
    猜你喜欢
    • 1970-01-01
    • 2014-03-18
    • 2015-07-17
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    相关资源
    最近更新 更多