1

我有一个场景,我不确定减少处理器将发生在什么位置。

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;
    }
}

这对偏斜有用吗?

4

1 回答 1

1

这不是您可以控制的——将 map 和 reducer 任务分配给节点是由 JobTracker 处理的。

有一个 O'Reilly Answer 详细说明了任务分配的细节:

http://answers.oreilly.com/topic/459-anatomy-of-a-mapreduce-job-run-with-hadoop/

默认行为是为 Job Tracker 的每次更新迭代分配一个任务,因此您通常不应看到同一节点满足所有 reduce 任务 - 但如果您的集群忙于其他任务并且只有一个节点具有可用的 reducer 插槽那么你所有的reduce任务都可能被分配到那个节点。

至于处理倾斜,这将减轻单个已知大容量密钥的所有数据可能被发送到单个节点(同样不能保证这一点),但您仍然会遇到一个问题,您需要将这个倾斜键的三个减速器输出到最终答案中。

于 2013-12-20T00:56:20.247 回答