我正在努力获得地图缩减架构的洞察力。我正在查阅这篇http://answers.oreilly.com/topic/2141-how-mapreduce-works-with-hadoop/文章。我对mapreduce框架的JobClient组件有一些疑问。我的问题是:
JObClient如何计算数据的输入拆分?
根据我咨询的内容,Job Client计算在运行作业时指定的HDFS上的输入路径中的数据的输入拆分。文章说,然后Job Client将资源(jar和compued输入拆分)复制到HDFS。现在我的问题是,当输入数据在HDFS中时,为什么jobClient会将计算出的输入分段复制到HDFS中。
让我们假设Job Client将输入拆分复制到HDFS,现在当JOb被提交到Job Tracker并且Job跟踪器为什么从HDFS检索输入拆分时,它会将作业重新填入?
如果我的问题不明确,请道歉。我是初学者。 :)
答案 0 :(得分:0)
没有JobClient不会将输入拆分复制到HDFS。你已经引用了自己的答案:
Job Client计算位于输入路径中的数据的输入拆分 在运行作业时指定的HDFS上。文章说那时约伯 客户端将资源(jar和计算输入拆分)复制到HDFS。
输入本身依赖于群集。客户端仅计算从namenode获得的元信息(块大小,数据长度,块位置)。这些computed
输入拆分将元信息传递给任务,例如。块偏移量和要计算的长度。
查看org.apache.hadoop.mapreduce.lib.input.FileSplit
,它包含文件路径,起始偏移量和单个任务将作为输入操作的块的长度。
您可能还需要查看的可序列化类是:org.apache.hadoop.mapreduce.split.JobSplit.SplitMetaInfo
。
将为将要运行的每个任务计算此元信息,并将其与jar一起复制到将实际执行此任务的节点。
答案 1 :(得分:0)
输入分割的计算取决于输入格式。对于典型的文本输入格式,计算拆分大小的通用公式为
max(mapred.min.split.size, min(mapred.max.split.size, dfs.block.size))
或默认
输入拆分大小= mapred.min.split.size< dfs.block.size< mapred.max.split.size
其中
mapred.min.split.size =最小分割尺寸
mapred.max.split.size - 最大分割尺寸
dfs.block.size = DFS块大小
对于DB输入格式,分割尺寸为
(总记录/映射器数量)
如上所述,输入分割和大小的数量是给予映射器任务和记录阅读器的元信息。