【发布时间】:2023-03-09 01:59:01
【问题描述】:
正如我们在 Hadoop 的 MapReduce 中所知道的,映射器从存储在 HDFS 的节点中的块中读取数据。但是映射器实际上是如何从块中读取的呢?块是否连续向映射器发送字节,直到映射器达到其拆分大小?还是它做其他事情?
如果是这样,这发生在哪个 java 文件上? 另外,我使用的是 Hadoop 2.7.1,以防万一。
【问题讨论】:
标签: java hadoop mapreduce hadoop2
正如我们在 Hadoop 的 MapReduce 中所知道的,映射器从存储在 HDFS 的节点中的块中读取数据。但是映射器实际上是如何从块中读取的呢?块是否连续向映射器发送字节,直到映射器达到其拆分大小?还是它做其他事情?
如果是这样,这发生在哪个 java 文件上? 另外,我使用的是 Hadoop 2.7.1,以防万一。
【问题讨论】:
标签: java hadoop mapreduce hadoop2
Hadoop MapReduce 作业输入格式包含两个主要组件:
InputSplit :将输入数据源(例如,输入文件)划分为片段,这些片段构成了各个地图任务的输入。这些片段被称为“分裂”。例如,大多数文件在 HDFS 中底层块的边界上被分割,并由 FileInputSplit 类的实例表示。分割文件背后的逻辑是通过InputSplit实现的。
RecordReader : 从 Split 读取数据并发送到 Map-Reduce 作业。 TextInputFormat 严格按照字节偏移量将文件分成多个部分。一个分割的结束偏移量可以在一行的中间,在这种情况下,我们应该在 RecordReader 中实现逻辑,从下一个分割中读取数据,直到到达行尾并将其传递给当前的映射器。
更多详情请参考link。
【讨论】:
InputFormat 描述了 Map-Reduce 作业的输入规范。
Map-Reduce 框架依赖作业的 InputFormat 来:
InputSplits,然后将每个文件分配给单独的 Mapper。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?
【讨论】: