这个问题与我的另一个问题Hadoop handling data skew in reducer有关。 但是,我想询问是否有一些可用的配置设置,以便如果达到最大减速器内存,那么在另一个数据节点上产生一个新的减速器,其余数据在上下文中? 或者甚至可能在相同的数据节点上,以便在reduce方法中读取上下文中的某些x记录达到某个限制,然后在新的reducer中读取剩余的x记录?
答案 0 :(得分:1)
你可以尝试一个组合器,通过在进入reducer之前进行可能的聚合来减少处理更多键值对的单个reducer的工作量。如果您正在进行加入,那么您可以在Pig中尝试skewed join
。它涉及2个MR作业。在第一个MR中,它对一个输入进行采样,如果找到一个偏斜的键,使其能够适应内存,则将该键拆分为多个减速器。对于除样本中标识的记录之外的其他记录,它执行默认连接。对于偏斜输入,它复制输入并将其发送到两个缩减器。
答案 1 :(得分:1)
无法生成新的辅助减速器来平衡作业运行中的负载。
相反,您可以从记录中选择另一个关键元素,这有助于在整个缩减器中对数据进行混洗。
另外,作为一个选项,您可以扩展现有的reducer的内存设置,以适应更多的洗牌记录,并更快地完成排序/合并。请参考以下属性,
mapreduce.reduce.memory.mb
mapreduce.reduce.java.opts
mapreduce.reduce.merge.inmem.threshold
mapreduce.reduce.shuffle.input.buffer.percent
mapreduce.reduce.shuffle.merge.percent
mapreduce.reduce.input.buffer.percent
我记得,有一个扩展的mapreduce库skewtune,用于在作业运行过程中对数据偏差进行负载平衡。但我从来没有尝试过这个,请检查它是否有用。
答案 2 :(得分:0)
这是不可能的。减速器的数量在驱动程序配置中是固定的。