Hadoop中的默认记录读取器,全局或本地字节偏移量

时间:2016-03-06 12:50:09

标签: java hadoop mapreduce hadoop2

我们知道Hadoop中的映射器(以及reducer)只能处理键值对作为输入和输出。 RecordReader是将原始输入从文件转换为键值对的东西。你可以编写自己的`RecordReader'。

Hadoop提供的默认RecordReader称为TextInputFormat,它读取文本文件行。它为每个拆分记录发出的关键是读取行的字节偏移量(作为LongWritable),该值是直到终止的行的内容{{ 1}}字符(作为Text对象)。

我们也知道每个输入文件拆分的一个映射器由平台实例化。

假设在HDFS上存储了一个巨大的文件\n,其分割存储在几个不同的节点上;文件F是行分隔的,正由某个默认F的作业处理。我的问题是:每行的字节偏移量(用作该行的键)是相对于拆分本地计算的,还是相对于整个文件全局计算的?

简单地说,假设我有一个两个分裂的文件,每个分为4行。为了简单起见,让每一行精确地为1个字节,以便前四行的字节偏移为0,1,2,3:

RecordReader

因此,在处理此拆分的映射器中,0 - Line 1 1 - Line 2 2 - Line 3 3 - Line 4 默认提供密钥Line i i-1。第二个拆分可能在另一个节点中:

RecordReader

问题是字节偏移是4,5,6,7还是从零开始0,1,2,3。

1 个答案:

答案 0 :(得分:1)

这是"全球"偏移量。

You can see it in the code其中位置是从文件拆分偏移量初始化的。如果是一个非常大的文件,它将是分裂发生的位置的字节偏移量。然后该位置从那里递增并沿着该行传递给您的映射器代码。