Hadoop MapReduce RecordReader实现是否必要?

4

以下是关于Hadoop MapReduce的Apache文档中InputFormat接口的内容:

"基于输入大小的逻辑分割对许多应用程序来说是不足够的,因为必须尊重记录边界。在这种情况下,应用程序还必须实现一个RecordReader,它负责尊重记录边界,并向各个任务提供面向记录的逻辑InputSplit视图."

WordCount示例应用程序是否是基于输入大小的逻辑分割不足够的应用程序?如果是,那么在源代码的哪个位置可以找到RecordReader的实现?

2个回答

3
输入拆分是对数据的逻辑引用。如果您查看API,您会发现它并不知道记录边界的任何信息。每个输入拆分都会启动一个映射器。在一个单词计数程序中,每个记录(即文件中的每一行)都会运行映射器的map()
但是,映射器如何知道记录边界在哪里?
这就是您从Hadoop MapReduce InputFormat接口引用的地方 -

应用程序还必须实现RecordReader,其责任是尊重记录边界,并向各个任务呈现逻辑InputSplit的面向记录的视图

每个映射器都与一个InputFormat相关联。该InputFormat包含有关要使用哪个RecordReader的信息。查看API,您会发现它了解输入拆分和要使用的记录读取器。 如果您想了解更多有关输入拆分和记录读取器的信息,请阅读this答案。
RecordReader定义记录边界是什么;InputFormat定义使用哪个RecordReader。
WordCount程序没有指定任何InputFormat,因此默认使用TextInputFormat,它使用LineRecordReader并将每行作为不同的记录输出。这是你的源代码
逻辑分割仅基于输入大小对许多应用程序来说是不足够的,因为需要尊重记录边界。这意味着,例如文件,必须按记录边界进行处理。
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 程序都“尊重”记录边界。否则,它就没有多大用处。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接