我正在尝试为有点偏斜的输入数据编写新的Hadoop作业。对此的类比将是Hadoop教程中的单词计数示例,除非让我们说很多次出现一个特定的单词。
我想要一个分区功能,其中一个密钥将根据其通常的哈希分区映射到多个reducer和剩余密钥。这可能吗?
提前致谢。
答案 0 :(得分:6)
不要以为在Hadoop中可以将相同的密钥映射到多个reducer。但是,可以对键进行分区,以便减少器或多或少地均匀加载。为此,应对输入数据进行采样,并对键进行适当分区。有关自定义分区程序的详细信息,请查看Yahoo Paper。 Yahoo Sort代码位于org.apache.hadoop.examples.terasort包中。
假设密钥A有10行,B有20行,C有30行,D在输入中有60行。然后,键A,B,C可以被发送到减速器1,键D可以被发送到减速器2,以使减速器上的负载均匀分布。要对键进行分区,必须进行输入采样以了解键的分布方式。
以下是一些更快速完成工作的建议。
在Combiner上指定JobConf以减少发送到reducer的密钥数量。这还可以减少映射器和reducer任务之间的网络流量。虽然,不能保证Hadoop框架会调用组合器。
此外,由于数据是倾斜的(一些键会一次又一次地重复,让我们说'工具'),您可能希望increase the # of reduce tasks更快地完成作业。这确保了当reducer处理'工具'时,其他数据将被其他Reducer并行处理。
答案 1 :(得分:1)
如果出于性能原因将数据拆分为多个Reducer,则需要第二个reducer将数据聚合到最终结果集中。
Hadoop内置了一个类似的功能:组合器。
组合器是一种“减速器”类型的功能。 这样可以确保在map任务中可以对数据进行部分缩减,从而减少以后需要处理的记录数。
在基本的wordcount示例中,组合器与reducer完全相同。 请注意,对于这两种算法,您需要使用不同的算法。 我还有一个项目,由于算法,无法使用合并器。