我有一个场景,我不确定处理器的位置。
i) 我有一个输入文本文件,它有1000个整数,在1到4之间的平衡范围内。
ii)假设有一个4节点的集群,每个节点有12个插槽,其中4个作为reducer分配,总共有16个reduce插槽
iii)我已设置驱动器中减速器的数量:
jobConf.setNumReduceTasks(4);
iii)最后给出了一个partitioner方法
public class MyPartitioner extends Partitioner<Text,Text>{
@Override
public int getPartition(Text key, Text value, int numPartitions) {
return Integer.parseInt(key.toString());
}
}
1) 一。我如何强制它在每个节点上使用1个reducer来处理reduce(让其他3个本地reducer空闲),而不是在每个节点上运行多个reducer,即如何确保在一个节点上不使用4个插槽,在节点2、3和4上有12个插槽空闲。
二。hadoop mr管理资源是否说:“node x是最空闲的,我将在那里生成一个reducer…”
2) 如果您对一个键有倾斜,但打算对其进行分组,您能为该键生成多个缩减器吗?例如,向值“4”的种子值添加一个随机整数,并使用分区器添加3个额外的缩减器来处理缩减器4、5、6和7中的值“4”?
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;
}
}
这对skew有用吗?
1条答案
按热度按时间ev7lccsx1#
这不是您可以控制的—将map和reducer任务分配给节点是由jobtracker处理的。
有一个o'reilly的答案详细地描述了任务分配的细节:
http://answers.oreilly.com/topic/459-anatomy-of-a-mapreduce-job-run-with-hadoop/
默认行为是为job tracker的每个更新迭代分配一个任务,因此通常不应该看到同一节点满足所有reduce任务-但是如果集群忙于其他任务,并且只有一个节点有可用的reducer插槽,那么所有reduce任务都可能被分配到该节点。
至于处理skew,这将减轻一个已知的高容量密钥可能被发送到单个节点的所有数据(同样也不能保证这一点),但您仍然会遇到一个问题,即您需要将这个skew密钥的三个reducer输出合并到最终答案中。