如何获得最统一的分区结果?

时间:2015-02-08 05:48:20

标签: hadoop partitioning partition data-partitioning hadoop-partitioning

我不知道是否有任何算法可以获得基于密钥的数据分区的最佳分区(需要确保相同结果数据集中的相同密钥记录)。

例如:我有一个数据集需要分为两部分:

key  num_of_records
k1 20
k2 15
k3 2
k4 3
k5 5

有2 ^ 5种不同的分区。比如

part1: k1 k3 k4 (total records: 25)
part2: k2 k5 (total records 20)

另一个分区是:

part1: k1 k4 (total records 23)
part2: k2 k3 k5 (total revords 22)

后一个分区比前一个更好,因为它允许在两个部分中更均匀地分配记录的数量。

所以,我需要一个algrithm来找到最佳分区。

有人能就这个话题给我一些建议吗?我怎么能解决这个问题?

感谢。

2 个答案:

答案 0 :(得分:1)

Java的默认hashCode()方法适用于此。显然,如果样本量为45,您可能会得到一些差异,但在大数据量表上,它是无关紧要的,并且趋向于均匀分布。

答案 1 :(得分:1)

除非您对每个密钥的预期基数有一些先验知识(基于历史结果或其他),否则最好坚持使用“随机”分区方案,如默认分区方案(基于对象哈希码) - 正如@ benwatsondata的回答所示。

但是,如果您使用的是非常小的密钥(例如国家或大陆)以及它们之间的基数差异(假设您有欧洲或北美数百万的价值,而南美只有数千种价值) ,你需要提出一个基于关键“排名”的分区器。

作为一个简单示例,您可以使用一个分区程序,只需将每个密钥映射到一个分区,然后再回到未知密钥的哈希码默认值。针对3个减速器调整的映射将是:

Europe -> P1
North America -> P2
Asia -> P3
South America -> P3
Australia -> P2
Africa -> P1
__default__ -> hashCode-based

上述更智能的版本将获得减速器数量和排序列表作为参数,它将找出最佳分区方案本身。