jmd*_*dev 5 hadoop hbase mapreduce hdfs
我正在尝试理解与Hadoop的Map/Reduce框架相关的数据位置.特别是我试图了解哪个组件处理数据局部性(即它是输入格式?)
雅虎的开发者网络页面声明"然后,Hadoop框架使用分布式文件系统的知识,在数据/记录的位置附近安排这些过程." 这似乎意味着HDFS输入格式可能会查询名称节点以确定哪些节点包含所需数据,并且如果可能,将在这些节点上启动映射任务.可以想象,通过查询确定哪些区域正在为某些记录提供服务,可以采用类似的方法.
如果开发人员编写自己的输入格式,他们是否负责实现数据局部性?
你是对的.如果您正在查看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界面查询.
| 归档时间: |
|
| 查看次数: |
2626 次 |
| 最近记录: |