2

我正在使用 Datafu 的 Hyperloglog UDF 来估计我的数据集中唯一 ID 的计数。在这种情况下,我有 3.2 亿个唯一 ID,它们可能会在我的数据集中多次出现。

Dataset : Country, ID.

这是我的代码:

REGISTER datafu-1.2.0.jar;

DEFINE  HyperLogLogPlusPlus datafu.pig.stats.HyperLogLogPlusPlus();

-- id is a UUID, for example : de305d54-75b4-431b-adb2-eb6b9e546014 
all_ids =
LOAD '$data'
USING PigStorage(';') AS (country:chararray, id:chararray);

estimate_unique_ids =
FOREACH (GROUP all_ids BY country)
GENERATE
    'Total Ids' as label,
    HyperLogLogPlusPlus(all_ids) as reach;

STORE estimate_unique_ids INTO '$output' USING PigStorage();

使用 120 个减速器,我注意到其中大部分在几分钟内完成。然而,少数减速器因数据过载而永远运行。我在 24 小时后杀死了他们。

我认为 Hyperloglog 比计数更有效。这里出了什么问题?

4

1 回答 1

0

在 DataFu 1.3.0 中,添加了 HyperLogLog 的代数实现。这允许 UDF 使用组合器,并且可能会在倾斜情况下提高性能。

但是,在Jira 问题的评论中,讨论了使用 HyperLogLog 时可能出现的其他一些性能问题。相关报价如下:

要记住的是,HyperLogLogPlus 的每个实例都分配了一个相当大的字节数组。我不记得确切的数字,但我认为默认精度 20 是数百 KB。因此,在您的示例中,如果“a”的基数很大,您将分配大量需要从组合器传输到减速器的大字节数组。因此,除非您知道关键基数非常小,否则我会避免在“分组”情况下使用它。此 UDF 更适合您有大量输入数据的“全部分组”场景。此外,如果输入数据远小于字节数组,那么使用此 UDF 可能会更糟。如果您可以接受更差的精度,则可以使字节数组更小。

于 2016-03-07T09:47:56.967 回答