4

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

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

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

4

2 回答 2

3

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

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

这就是你从 Hadoop MapReduce InputFormat Interface 中引用的地方 -

应用程序还必须实现一个 RecordReader,它负责尊重记录边界并向单个任务提供逻辑 InputSplit 的面向记录的视图

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

ARecordReader定义记录边界是什么;InputFormat定义了使用的内容RecordReader

WordCount 程序没有指定任何InputFormat,因此它默认TextInputFormat使用LineRecordReader并将每一行作为不同的记录给出。这是你的源代码


[L] 基于输入大小的逻辑拆分对于许多应用程序来说是不够的,因为要遵守记录边界。

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

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 程序都“尊重”记录边界。否则,它没有多大用处。

于 2015-08-10T22:39:34.253 回答
0

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

如果你想看他们的实现,你可以在 Hadoop Source code 中找到。

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

于 2015-08-10T21:26:18.180 回答