【问题标题】:Hadoop Reducers: How to ensure the reducers are evenly running over a number of nodesHadoop Reducers:如何确保 reducer 在多个节点上均匀运行
【发布时间】: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;
    }
}

这对偏斜有用吗?

【问题讨论】:

    标签: hadoop skew reducers


    【解决方案1】:

    这不是您可以控制的 - 将 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 key 的三个 reducer 输出组合成最终答案。

    【讨论】:

    • 优秀的参考 - 我错过了这些陈述的含义,最初感谢您强调这一点。我假设这是可以在之后完成的密钥对的微不足道的减少
    • 是的 - 没有自定义分区器的身份映射器和您当前使用的相同减速器
    猜你喜欢
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 2016-09-03
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    • 2023-02-18
    相关资源
    最近更新 更多