【问题标题】:Split input to a reducer in hadoop将输入拆分到hadoop中的reducer
【发布时间】:2015-12-14 18:15:12
【问题描述】:
这个问题与我的另一个问题Hadoop handling data skew in reducer 有点相关。
但是,我想问一下是否有一些配置设置可用,以便如果说达到最大减速器内存然后在另一个数据节点上生成一个新的减速器,剩余数据在上下文中?
或者甚至可能在同一个数据节点上,这样说在reduce方法中读取上下文中的一些x记录达到某个限制,然后在新的reducer中读取剩余的记录?
【问题讨论】:
标签:
hadoop
mapreduce
hadoop-partitioning
reducers
【解决方案1】:
这是不可能的。 reducer 的数量在 Driver 配置中是固定的。
【解决方案2】:
您可以尝试一个组合器,该组合器可以减少单个 reducer 处理更多键值对的工作量,方法是在它通过 reducer 之前进行可能的聚合。如果您正在加入,那么您可以在 Pig 中尝试skewed join。它涉及 2 个 MR 作业。在第一个 MR 中,它对一个输入进行采样,如果它发现一个偏斜的 key 以至于它能够放入内存中,它会将该 key 拆分为多个 reducer。对于样本中标识的记录以外的其他记录,它会执行默认连接。对于倾斜的输入,它复制输入并将其发送到两个减速器。
【解决方案3】:
不可能产生一个新的辅助减速器来平衡作业运行的负载。
相反,您可以从记录中挑选另一个关键元素,这将有助于在 reducer 中对数据进行混洗。
作为一个选项,您可以扩展现有 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,用于在作业运行过程中对数据倾斜进行负载平衡。但我从未尝试过这个,请检查它是否有帮助。