以下是关于Hadoop MapReduce的Apache文档中InputFormat接口的内容:
"基于输入大小的逻辑分割对许多应用程序来说是不足够的,因为必须尊重记录边界。在这种情况下,应用程序还必须实现一个RecordReader,它负责尊重记录边界,并向各个任务提供面向记录的逻辑InputSplit视图."
WordCount示例应用程序是否是基于输入大小的逻辑分割不足够的应用程序?如果是,那么在源代码的哪个位置可以找到RecordReader的实现?
以下是关于Hadoop MapReduce的Apache文档中InputFormat接口的内容:
"基于输入大小的逻辑分割对许多应用程序来说是不足够的,因为必须尊重记录边界。在这种情况下,应用程序还必须实现一个RecordReader,它负责尊重记录边界,并向各个任务提供面向记录的逻辑InputSplit视图."
WordCount示例应用程序是否是基于输入大小的逻辑分割不足够的应用程序?如果是,那么在源代码的哪个位置可以找到RecordReader的实现?
map()
。每个映射器都与一个InputFormat相关联。该InputFormat包含有关要使用哪个RecordReader的信息。查看API,您会发现它了解输入拆分和要使用的记录读取器。 如果您想了解更多有关输入拆分和记录读取器的信息,请阅读this答案。应用程序还必须实现RecordReader,其责任是尊重记录边界,并向各个任务呈现逻辑InputSplit的面向记录的视图
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 g
和 h i j
是不同的记录; 很明显,这不是大多数应用程序想要的。在WordCount示例中,您无法看到RecorderReader的实现,因为它使用框架中指定的默认RecordReader和默认InputSplit。
如果您想查看它们的实现,可以在Hadoop源代码中找到它们。
有关Recorder读取器及其工作原理的更多信息,请参见:https://hadoopi.wordpress.com/2013/05/27/understand-recordreader-inputsplit/