假设我有一个输入文件,并且在HDFS中为此文件创建了三个块。假设我有三个数据节点,每个数据节点存储一个块。如果我有3个输入拆分,则3个映射器将并行运行以处理各个数据节点的本地数据。每个映射器使用输入格式和记录读取器以键值对的形式输入。这个场景使用TextInputFormat,其中记录是文件中完整的文本行。
这里的问题是如果在第一个块的末尾有记录中断会发生什么。
1)在这种情况下Hadoop如何读取完整记录?
2)数据节点1是否与数据节点2联系以获取完整记录?
3)如果数据节点2开始处理数据并在第一行中识别不完整记录,会发生什么?
答案 0 :(得分:4)
希望有所帮助
答案 1 :(得分:1)
如果您有“Hadoop:The Definitive Guide”,请查看第246页(最新版本),该页面讨论了这个确切的问题(不过很简单,不幸的是)。
答案 2 :(得分:0)
从LineRecordReader.java的hadoop源代码构造函数: 我找到了一些意见:
// If this is not the first split, we always throw away first record
// because we always (except the last split) read one extra line in
// next() method.
if (start != 0) {
start += in.readLine(new Text(), 0, maxBytesToConsume(start));
}
this.pos = start;
从此我相信(未确认)hadoop将为每个分割读取一个额外的行(在当前分割结束时,在下一个分割中读取下一行),如果不是第一次分割,则第一行将被丢弃。 所以没有行记录会丢失和不完整