【发布时间】:2011-10-25 22:26:06
【问题描述】:
我正在尝试为有些倾斜的输入数据编写一个新的 Hadoop 作业。一个类比是 Hadoop 教程中的字数统计示例,除了让我们说一个特定的单词出现很多次。
我想要一个分区函数,其中一个键将根据它们通常的哈希分区映射到多个减速器和剩余键。这可能吗?
提前致谢。
【问题讨论】:
标签: hadoop mapreduce partitioning
我正在尝试为有些倾斜的输入数据编写一个新的 Hadoop 作业。一个类比是 Hadoop 教程中的字数统计示例,除了让我们说一个特定的单词出现很多次。
我想要一个分区函数,其中一个键将根据它们通常的哈希分区映射到多个减速器和剩余键。这可能吗?
提前致谢。
【问题讨论】:
标签: hadoop mapreduce partitioning
不要以为在 Hadoop 中同一个键可以映射到多个 reducer。但是,可以对键进行分区,以便减速器或多或少地均匀加载。为此,应该对输入数据进行采样,并对键进行适当的分区。检查Yahoo Paper 以获取有关自定义分区器的更多详细信息。 Yahoo 排序代码在 org.apache.hadoop.examples.terasort 包中。
假设输入中的键 A 有 10 行,B 有 20 行,C 有 30 行,D 有 60 行。然后可以将密钥 A、B、C 发送到减速器 1,并将密钥 D 发送到减速器 2,以使减速器上的负载均匀分布。要对键进行分区,必须进行输入采样以了解键的分布情况。
这里还有一些建议可以让作业更快地完成。
在JobConf 上指定Combiner 以减少发送到reducer 的key 数量。这也减少了 mapper 和 reducer 任务之间的网络流量。不过,不能保证 Hadoop 框架会调用组合器。
此外,由于数据有偏差(某些键会反复重复,比如“工具”),您可能需要increase the # of reduce tasks 以更快地完成作业。这样可以确保在 reducer 处理“工具”时,其他数据由其他 reducer 并行处理。
【讨论】:
如果出于性能原因将数据拆分到多个 reducer,那么您需要第二个 reducer 将数据聚合到最终结果集中。
Hadoop 有一个内置功能可以做类似的事情:组合器。
combiner 是一种“reducer”类型的功能。 这确保了在 map 任务中可以对数据进行部分归约,从而减少需要稍后处理的记录数量。
在基本的 wordcount 示例中,combiner 与 reducer 完全相同。 请注意,某些算法您需要对这两种算法进行不同的实现。 我也有一个项目,由于算法的原因,组合器是不可能的。
【讨论】: