我有一个场景,我不知道减少处理器的位置会发生什么。
i)我有一个输入文本文件,它有一个1000的整数,平衡范围在1到4之间。
ii)让我们假设每个节点有一个4节点集群,有12个插槽,其中4个被分配为reducer - 总共减少了16个插槽
iii)我已在驱动程序中设置了reducer的数量:
jobConf.setNumReduceTasks(4);
iii)最后我给出了一个
的分区方法public class MyPartitioner extends Partitioner<Text,Text>{
@Override
public int getPartition(Text key, Text value, int numPartitions) {
return Integer.parseInt(key.toString());
}
}
1) 一世。 我如何强制它在每个节点上使用1个减速器来处理减少(让其他3个本地减速器空闲)而不是在每个节点上运行多个减速器IE如何确保不使用4个插槽一个节点在节点2,3和4空闲时有12个插槽。
II。 Hadoop MR是否管理资源说:&#34;节点X是最空闲的,我会在那里产生一个减速器......&#34;
2)如果你对一个键有偏斜但是打算对其进行分组,你可以为该键产生多个reducer,例如将一个随机整数添加到值&#34; 4&#34;的种子值中。并使用分区器添加3个额外的reducer以处理值&#34; 4&#34;在减速机4,5,6和7?
jobConf.setNumReduceTasks(7);
和
public class MyPartitioner2 extends Partitioner<Text,Text>{
@Override
public int getPartition(Text key, Text value, int numPartitions) {
int p = Integer.parseInt(key.toString());
if (p == 4){return p + (new Random()).nextInt(4);}//extra 3 partitions...
return p;
}
}
是否适用于偏斜?
答案 0 :(得分:1)
这不是你可以控制的东西 - 将地图和减速器任务分配给节点由JobTracker处理。
有一个O'Reilly答案详细说明了任务分配的具体内容:
http://answers.oreilly.com/topic/459-anatomy-of-a-mapreduce-job-run-with-hadoop/
默认行为是为Job Tracker的每次更新迭代分配一个任务,因此您通常不应该看到同一节点满足所有reduce任务 - 但是如果您的群集忙于其他任务并且只有一个节点具有可用的减速器插槽然后可以将所有减少任务的任务都委托给该节点。
至于处理偏斜,这将减轻可能被发送到单个节点的单个已知高音量键的所有数据(同样不能保证这一点),但是您仍然会遇到需要的问题将这个倾斜键的三个减速器输出组合成最终答案。