Hadoop 中的默认记录 Reader,全局或本地字节偏移量
Default Record Reader in Hadoop, global or local byte offset
我们知道 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。
这是"global"偏移量。
You can see it in the code 位置从文件拆分偏移量初始化。如果是一个非常大的文件,它将是发生拆分的字节偏移量。然后该位置从那里递增并沿线传递给您的映射器代码。
我们知道 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。
这是"global"偏移量。
You can see it in the code 位置从文件拆分偏移量初始化。如果是一个非常大的文件,它将是发生拆分的字节偏移量。然后该位置从那里递增并沿线传递给您的映射器代码。