【发布时间】:2013-12-20 08:56:20
【问题描述】:
我有一个场景,我不确定要在哪个位置减少处理器。
i) 我有一个输入文本文件,它有 1000 个整数,介于 1 和 4 之间的平衡范围内。
ii) 假设有一个 4 节点集群,每个节点有 12 个槽,其中 4 个被分配为减速器 - 总共有 16 个减速槽
iii) 我已经在驱动中设置了减速器的数量:
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 个其他本地减速器空闲)而不是在每个节点上运行多个减速器来处理 reduce IE 如何确保在一个节点上不使用 4 个插槽并且在节点 2,3&4 上有 12 个空闲槽。
二。 Hadoop MR 是否管理资源说:“节点 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;
}
}
这对偏斜有用吗?
【问题讨论】: