我有一个场景,我不确定减少处理器将发生在什么位置。
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 个插槽。
ii. Hadoop MR 是否管理资源说:“节点 X 是最空闲的,我将在那里生成一个减速器......”
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;
}
}
这对偏斜有用吗?