【问题标题】:How is load balancing achieved while sending data to the reducers in Hadoop向 Hadoop 中的 reducer 发送数据时如何实现负载平衡
【发布时间】:2013-09-15 09:12:38
【问题描述】:

我们知道,在 hadoop 的复制阶段,每个 reduce worker 进程从所有 mapper 节点读取数据,并对已经排序的数据执行合并(在 mapper 端的内存排序期间进行排序)和研究他们的密钥份额和价值。

现在,我们也知道所有对应于特定数据的数据都只会发送到一个 reducer。

我的问题是:如何将数据拆分传输到减速器,即分区大小是如何决定的,以及它是由什么过程决定的,因为数据是使用拉机制而不是推机制传输的。这里要解决的一个有趣的挑战是确定数据的总体大小,因为数据驻留在多个节点上(我猜作业跟踪器/主进程可能知道所有节点的数据大小和位置,但我也不确定)。

如果数据高度倾斜并且大部分数据属于有 10 个或更多 reducer 的单个 key,这不会在并行处理方面造成性能损失。在这种情况下,只有一个 reducer 进程会以顺序方式处理大部分数据。 这种情况是否在 Hadoop 中处理?如果是,怎么做?

【问题讨论】:

    标签: sorting hadoop mapreduce shuffle reduce


    【解决方案1】:

    如何将数据拆分传输到reducer,即分区大小是如何决定的,以及在使用拉机制而不是推机制传输数据时,它是由什么进程决定的。这里要解决的一个有趣的挑战是确定数据的总体大小,因为数据驻留在多个节点上(我猜作业跟踪器/主进程可能知道所有节点的数据大小和位置,但我也不确定)。

    将数据划分为分区由 Partitioner 抽象类中的 getPartition(KEY k, VALUE v, int numOfReducers) 内部编写的逻辑控制。默认的 Hadoop 分区器是 HashPartitioner。行为是利用键的 Object.hashCode() 方法并对 numOfPartitions 执行模运算。如果您发现 HashPartitioner 在您的情况下效率不高,您可以编写您的 Partitioner。

    当地图任务成功完成时,它们会将状态更新通知其父 TaskTracker,而后者又会通知 JobTracker。这些通知通过心跳通信机制传输。这就是一切保持同步的方式。

    如果数据高度倾斜并且大部分数据属于一个有 10 个或更多 reducer 的单个 key,这不会在并行处理方面造成性能损失。在这种情况下,只有一个 reducer 进程会以顺序方式处理大部分数据。这种情况是否在 Hadoop 中处理?如果是,如何?

    是的。是真的。 MapReduce 框架提供了不同类型的 Partitioner,您可以根据需要选择:

    • HashPartitioner,默认分区器
    • TotalOrderPartitioner。它提供了一种按范围分区的方法
    • KeyFieldBasedPartitioner。 Thie partitioner 提供了一种按部分键对数据进行分区的方法。

    如果您仍然不满意,您可以实现自己的逻辑。如果您需要有关如何编写自定义分区程序的帮助,请参阅 this

    HTH

    附: : 你的第一个问题的第二部分我不太明白。如果答案不清楚或者您需要进一步澄清,请告诉我。

    【讨论】:

    • 感谢您的回答。我知道自定义分区器,但上述解释没有回答我的问题。我说,分区大小是如何决定的,即要发送到每个减速器的数据大小。是否有平衡进入每个 reducer 的数据分布的趋势?我的问题的第二部分说,如果我没有选择在任何其他键上拆分数据(使用自定义分区器),并且我的数据偏向一个键,Hadoop 是否会在 reducer 端进行任何性能优化在那种情况下?
    • 好的,模部分确实回答了我关于负载平衡的问题的第一部分。但是第二部分仍然没有答案。
    • 它自己不会做任何事情。
    猜你喜欢
    • 2012-07-19
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 2015-05-15
    • 1970-01-01
    • 2012-08-18
    • 2012-12-18
    • 2015-08-01
    相关资源
    最近更新 更多