【发布时间】:2016-03-06 12:50:09
【问题描述】:
我们知道 Hadoop 中的映射器(以及化简器)只能处理键值对作为输入和输出。 RecordReader 是将原始输入从文件转换为键值对的东西。您可以编写自己的“RecordReader”。
Hadoop 提供的默认RecordReader 称为TextInputFormat,它读取文本文件的行。它为每个拆分记录发出的键是读取行的字节偏移量(作为LongWritable),值是直到终止\n 字符的行的内容(作为文本对象)。
我们还知道,每个输入文件拆分的一个映射器由平台实例化。
假设有一个巨大的文件F 存储在 HDFS 上,其拆分存储在几个不同的节点上;文件F 是行分隔的,并且正在由默认为RecordReader 的某个作业处理。我的问题是:每行的字节偏移量(用作该行的键)是相对于拆分在本地计算的,还是相对于整个文件全局计算的?
简单地说,假设我有一个由 4 行分割的两个文件。为了简洁起见,让每行正好是 1 个字节,这样前四行的字节偏移量是 0,1,2,3:
0 - Line 1
1 - Line 2
2 - Line 3
3 - Line 4
因此,在处理此拆分的映射器中,Line i 默认提供密钥 i-1 RecordReader。第二次分裂可能在另一个节点:
? - Line 5
? - Line 6
? - Line 7
? - Line 8
问题是字节偏移量是 4,5,6,7 还是从头开始 0,1,2,3。
【问题讨论】:
标签: java hadoop mapreduce hadoop2