正如我们在Hadoop的MapReduce中所知,映射器从存储在HDFS中的节点中的块中读取。但是映射器如何从块中读取?块是否连续向映射器发送字节,直到映射器达到其分割大小?或者它做了别的什么?
如果是这样,哪个java文件会发生这种情况? 另外,我正在使用Hadoop 2.7.1,以防万一。
答案 0 :(得分:2)
Hadoop MapReduce作业输入格式包含两个主要组件:
InputSplit:将输入数据源(例如,输入文件)划分为组成各个地图任务输入的片段。这些片段称为“分裂”。例如,大多数文件在HDFS中的底层块的边界上分开,并由FileInputSplit类的实例表示。如何拆分文件的逻辑是通过InputSplit实现的。
RecordReader:从Split读取数据并发送到Map-Reduce作业。 TextInputFormat严格按字节偏移将文件划分为分割。分割的结束偏移可以在一行的中间。在这种情况下,我们应该在RecordReader中实现逻辑,以便从下一个分割中读取数据,直到重新生成行结束并将其传递给当前的映射器。
请参阅此link了解详情。
答案 1 :(得分:2)
InputFormat
描述了Map-Reduce作业的输入规范。
Map-Reduce框架依赖于作业的InputFormat:
InputSplits
,然后将每个文件分配给单个Mapper。RecordReader
实现,用于从逻辑InputSplit
收集输入记录,以供Mapper处理。 InputSplit
表示个人Mapper
要处理的数据。
查看FileInputFormat代码,了解拆分的工作原理。
API:
public List<InputSplit> getSplits(JobContext job
) throws IOException {
RecordReader将数据分成键/值对,以输入Mapper。
有多种RecordReader
类型。
CombineFileRecordReader, CombineFileRecordReaderWrapper, ComposableRecordReader,
DBRecordReader, KeyValueLineRecordReader, SequenceFileAsTextRecordReader,
SequenceFileRecordReader
最常用的一个:KeyValueLineRecordReader
查看相关的SE问题,以便更好地理解阅读内部: How does Hadoop process records split across block boundaries?