Hadoop MapReduce RecordReader 实施是否必要?

Hadoop MapReduce RecordReader Implementation Necessary?

来自 Hadoop MapReduce 上的 Apache 文档 InputFormat 接口:

"[L]ogical splits based on input-size is insufficient for many applications since record boundaries are to be respected. In such cases, the application has to also implement a RecordReader on whom lies the responsibilty to respect record-boundaries and present a record-oriented view of the logical InputSplit to the individual task."

WordCount 示例应用程序中基于输入大小的逻辑拆分是否不足?如果是这样,在源代码的何处找到 RecordReader 的实现?

您看不到 WordCount 示例中的 RecorderReader 实现,因为它使用框架中指定的默认 RecordReader 和默认 InputSplit。

如果您想查看它们的实现,可以在 Hadoop 源代码中找到它。

有关 Recorder 阅读器及其工作原理的更多信息,请访问 pl。参考:https://hadoopi.wordpress.com/2013/05/27/understand-recordreader-inputsplit/

输入拆分是对数据的逻辑引用。如果您查看 API,您会发现它对记录边界一无所知。为每个输入拆分启动一个映射器。对于每条记录(在 WordCount 程序中,文件中的每一行),映射器的 map() 是 运行。

但是映射器如何知道记录边界在哪里?

这是您引用 Hadoop MapReduce InputFormat 接口的地方 -

the application has to also implement a RecordReader on whom lies the responsibilty to respect record-boundaries and present a record-oriented view of the logical InputSplit to the individual task

每个映射器都与一个 InputFormat 相关联。 InputFormat 有关于 RecordReader 使用的信息。查看API,你会发现它知道输入拆分和使用什么记录reader。 如果您想了解更多关于输入拆分和记录 reader 的信息,您应该阅读 this 答案。

A RecordReader 定义记录边界是什么; InputFormat 定义使用什么 RecordReader

WordCount 程序未指定任何 InputFormat,因此默认为 TextInputFormat,它使用 LineRecordReader and gives out every line as a different record. And this 您的源代码


[L]ogical splits based on input-size is insufficient for many applications since record boundaries are to be respected.

这意味着,对于示例文件,例如

a b c d e
f g h i j
k l m n o

我们希望每一行都是一条记录。当逻辑拆分基于输入大小时,可能会有两个拆分,例如:

a b c d e
f g 

    h i j 
k l m n 0 

如果不是 RecordReader,它会认为 f gh i j 是不同的记录;显然,这不是大多数应用程序想要的。

回答你的问题,在WordCount程序中,记录边界是什么并不重要,但有可能将同一个词拆分成不同的逻辑拆分。因此,基于大小的逻辑拆分对于 WordCount 程序来说是不够的。

每个 MapReduce 程序 'respects' 记录边界。不然用处不大。