输入格式是否负责在Hadoop的MapReduce中实现数据局部性?

jmd*_*dev 5 hadoop hbase mapreduce hdfs

我正在尝试理解与Hadoop的Map/Reduce框架相关的数据位置.特别是我试图了解哪个组件处理数据局部性(即它是输入格式?)

雅虎的开发者网络页面声明"然后,Hadoop框架使用分布式文件系统的知识,在数据/记录的位置附近安排这些过程." 这似乎意味着HDFS输入格式可能会查询名称节点以确定哪些节点包含所需数据,并且如果可能,将在这些节点上启动映射任务.可以想象,通过查询确定哪些区域正在为某些记录提供服务,可以采用类似的方法.

如果开发人员编写自己的输入格式,他们是否负责实现数据局部性?

Tho*_*lut 8

你是对的.如果您正在查看FileInputFormat课程和getSplits()方法.它搜索Blocklocations:

BlockLocation[] blkLocations = fs.getFileBlockLocations(file, 0, length);

这意味着FileSystem查询.这发生在里面JobClient,结果被写入SequenceFile(实际上它只是原始字节代码).因此,Jobtracker稍后在初始化作业时读取此文件,并且几乎只是将任务分配给inputsplit.

但是数据的分布是NameNodes作业.

现在回答你的问题:通常你是从FileInputFormat.因此,您将被迫返回一个列表InputSplit,并且在初始化步骤中需要这样的事情来设置拆分的位置.例如FileSplit:

public FileSplit(Path file, long start, long length, String[] hosts)
Run Code Online (Sandbox Code Playgroud)

实际上,您实际上并没有实现数据局部性,您只是告诉可以找到拆分的主机.这很容易通过FileSystem界面查询.