假设我有一个输入文件,在hdfs中为这个文件创建了三个块。假设我有三个数据节点,每个数据节点存储一个块。如果我有3个输入拆分,那么3个Map器将并行运行,以处理各个数据节点的本地数据。每个Map器使用输入格式和记录读取器以键值对的形式获取输入。此场景使用textinputformat,其中记录是来自文件的完整文本行。
这里的问题是,如果第一个街区的尽头打破了记录,会发生什么。
1) 在这个场景中,hadoop如何读取完整的记录?
2) 数据节点1是否与数据节点2联系以获取完整的记录?
3) 如果数据节点2开始处理数据并在第一行中标识不完整的记录,会发生什么情况?
3条答案
按热度按时间nr9pn0ug1#
hadoop将对节点2进行远程读取,以获取其余的记录
对
据我所知,节点2将忽略不完整的记录
如果您有“hadoop:权威指南”,请查看第246页(最新版本),该页讨论了这个确切的问题(尽管非常简短,但很不幸)。
3z6pesqy2#
hadoop将继续读取第一个块的末尾,直到到达eol字符或eof为止。
数据节点在数据复制之外不相互通信(当名称节点指示时)。hdfs客户机将从node1然后从node2读取数据
举例说明
如果有一条单行记录跨越一个300mb的文件,其块大小为128mb,那么mapper 2和mapper 3将从该文件的给定分割偏移量(分别为128mb和256mb)开始读取。他们都会向前跳,试图找到下一个下线字符,并从该点开始记录。在本例中,两个Map器实际上都将处理0条记录。
一个300mb的文件,两行长150mb,块大小128MB,Mapper1将处理第一行,在块2中查找eol字符。Map器2将从偏移量128mb(块2)开始,向前扫描以找到偏移量150mb处的eol字符。它将向前扫描并在块3之后找到eof并处理此数据。Map器3将从偏移量256mb(块3)开始,在命中eol字符之前向前扫描到eof,因此处理0个记录
300mb文件,6行,每行50mb长:
Map器1-偏移量0->128mb,行1(0->50),2(50->100),3(100->150)
Map器2-偏移128 mb->256 mb,第4行(150->200),第5行(200->250),第6行(250->300)
Map器3-偏移量256 mb->300 mb,0行
希望有帮助
lsmepo6l3#
从linerecordreader.java的hadoop源代码中,我发现了一些注解:
由此我相信(未确认)hadoop会为每个split读取一个额外的行(在当前split的末尾,在下一个split中读取下一行),如果不是第一个split,第一行将被丢弃。这样就不会有行记录丢失和不完整