来自Hadoop MapReduce InputFormat界面上的Apache文档:
" 基于输入大小的[L]逻辑分割不足 应用程序,因为记录边界将得到尊重。在这样的 在某些情况下,应用程序还必须实施RecordReader 谁有责任尊重记录边界并提出一个 面向记录的个人逻辑InputSplit视图 任务"
WordCount示例应用程序是否基于输入大小的逻辑拆分不足?如果是这样,源代码中的哪个位置是RecordReader的实现?
答案 0 :(得分:3)
输入拆分是对数据的逻辑引用。如果查看API,您会发现它对记录边界一无所知。为每个输入拆分启动映射器。为每条记录运行映射器map()
(在WordCount程序中,文件中的每一行)。
但是映射器如何知道记录边界的位置?
这是Hadoop MapReduce InputFormat接口引用的地方 -
应用程序还必须实现一个RecordReader 负责尊重记录边界并提出一个 面向记录的逻辑InputSplit视图到单个任务
每个映射器都与一个InputFormat相关联。 InputFormat
包含RecordReader
要使用的信息。查看API,您会发现它知道输入拆分以及要使用的记录阅读器。
如果您想了解更多有关输入拆分和记录阅读器的信息,请阅读this回答。
RecordReader
定义记录边界是什么; InputFormat
定义了RecordReader
使用的内容。
WordCount程序未指定任何InputFormat
,因此默认为使用LineRecordReader的TextInputFormat
,并将每行作为不同的记录。并this您的源代码
基于输入大小的[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 g
和h i j
视为不同的记录;显然,这不是大多数应用程序所需要的。
回答你的问题,在WordCount程序中,记录边界是什么并不重要,但是同一个词有可能被分成不同的逻辑分裂。因此,基于大小的逻辑分割对于WordCount程序来说是不够的。
每个MapReduce程序都“尊重”记录边界。否则,它用处不大。
答案 1 :(得分:0)
您无法在WordCount示例中看到RecorderReader实现,因为它使用默认的RecordReader和框架中指定的默认InputSplit。
如果您想查看它们的实现,可以在Hadoop源代码中找到它。
有关Recorder读者及其工作原理的更多信息,请参阅。参考:https://hadoopi.wordpress.com/2013/05/27/understand-recordreader-inputsplit/