【问题标题】:How to get the most uniform partition results?如何得到最均匀的分区结果?
【发布时间】:2015-04-08 02:02:44
【问题描述】:

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

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

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)

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

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

谁能给我一些关于这个话题的建议?我该如何解决这个问题?

谢谢。

【问题讨论】:

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


    【解决方案1】:

    Java 的默认 hashCode() 方法可以满足此要求。显然,对于 45 的样本量,您可能会得到一些差异,但在大数据规模上,它是无关紧要的,并且会趋向于均匀分布。

    【讨论】:

    • 虽然我同意你的说法,但问题(有点)暗示 OP 对默认分区器不满意,所以我认为推荐一个不是有用的答案.
    • 认为他不开心。这并不影响我的答案是否正确。
    • 我想值得补充的是,盲目地将hashCode() 应用于整个键并不适用于所有场景,对于示例中提供的简单文本键来说很好。
    • 您对您的建议表示赞成,尽管只有当键的数量预计会随着数据集的大小而增长时才适用。如果键是大陆怎么办?
    • 是的,我也可以按记录数对所有键进行排序,然后我可以使用贪心策略来做到这一点。在大多数情况下,它会趋向于均匀分布。我想知道是否有一种算法可以获得理论上的最优解。也许一些分配计划的算法,但我不确定。所以寻求帮助
    【解决方案2】:

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

    但是,如果您使用的键集非常少(例如国家或大陆)并且它们之间的基数差异很大(假设您在欧洲或北美有数百万个值,而对于南美只有数千个值) ,你需要想出一个基于键“排名”的分区器。

    举个简单的例子,你可以有一个分区器,它简单地将你的每个键映射到一个分区,并回退到未知键的哈希码默认值。为 3 个 reducer 调整的映射将是:

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

    上面的一个更智能的版本会同时获取 reducer 的数量和排名列表作为参数,它会自己找出最佳的分区方案。

    【讨论】:

      猜你喜欢
      • 2019-10-25
      • 2011-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-21
      • 1970-01-01
      相关资源
      最近更新 更多