排序—在hadoop中将数据发送到reducer时如何实现负载平衡

suzh9iv8  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(344)

我们知道,在hadoop的复制阶段,每个reduce worker进程从所有Map器节点读取数据,并对已经排序的数据(在Map器端的内存排序期间排序)执行合并,并处理它们的键和值共享。
现在,我们还知道,与某个特定数据相对应的所有数据将只流向一个reducer。
我的问题是:如何将分割的数据传输到缩减器,即如何决定分区大小,以及在使用拉机制而不是推机制传输数据时由什么过程决定。这里要对付的一个有趣的挑战是,当数据驻留在多个节点上时,如何确定数据的总体大小(我猜job tracker/master进程可能知道所有节点的数据大小和位置,但我对此也不确定)。
如果数据是高度倾斜的,并且大部分数据都属于一个键,其中有10个或更多的缩减器,那么对于并行处理来说,这不是一个性能损失吗。在这种情况下,只有一个reducer进程以顺序方式处理大部分数据。这种情况是用hadoop处理的吗?如果是,怎么做?

wpcxdonn

wpcxdonn1#

如何将分割的数据传输到缩减器,即如何决定分区大小,以及在使用拉机制而不是推机制传输数据时,通过什么过程来决定分区大小。这里要对付的一个有趣的挑战是,当数据驻留在多个节点上时,如何确定数据的总体大小(我猜job tracker/master进程可能知道所有节点的数据大小和位置,但我对此也不确定)。
将数据拆分为分区是由在partitioner抽象类中的getpartition(key k,value v,int numofreducers)内部编写的逻辑控制的。默认的hadoop分区器是hashpartitioner。其行为是使用键的object.hashcode()方法并对numofpartitions执行模运算。如果您发现hashpartitioner在您的情况下效率不高,那么可以编写分区器。
当Map任务成功完成时,它们会将状态更新通知其父tasktracker,然后通知jobtracker。这些通知通过心跳通信机制传输。这就是一切保持同步的方式。
如果数据是高度倾斜的,并且大部分数据都属于一个键,其中有10个或更多的缩减器,那么对于并行处理来说,这不是一个性能损失吗。在这种情况下,只有一个reducer进程以顺序方式处理大部分数据。这种情况是用hadoop处理的吗?如果是,怎么做?
对。这是真的。mapreduce框架提供了不同类型的分区器,您可以根据需要进行选择:
hashpartitioner,默认的分区器
totalorderpartitioner。它提供了一种按范围划分的方法
基于关键字的分区器。分区器提供了一种按部分键对数据进行分区的方法。
如果你仍然不满意,你可以实现你自己的逻辑。如果您需要一些关于如何编写自定义分区器的帮助,请参阅本文。
hth公司
p、 学生:我不太明白你第一个问题的第二部分。如果答案不清楚或需要进一步澄清,请告诉我。

相关问题