ApachePig—如何提高使用datafu的hyperloglog来估计基数的pig作业的性能?

cunj1qz1  于 2021-06-25  发布在  Pig
关注(0)|答案(1)|浏览(352)

我使用datafu的hyperloglogudf来估计数据集中唯一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小时后我杀了他们。
我觉得超日志比真的更有效。这里出了什么问题?

vshtjzan

vshtjzan1#

在datafu1.3.0中,增加了hyperloglog的代数实现。这使得udf可以使用组合器,并且可能会在倾斜的情况下提高性能。
但是,在jira问题的评论中,讨论了使用hyperloglog时可能出现的一些其他性能问题。相关报价如下:
要记住的是,hyperlogplus的每个示例都分配一个相当大的字节数组。我记不清确切的数字了,但我认为默认的精度是20,它是几百kb。因此,在您的示例中,如果“a”的基数很大,您将分配大量的大字节数组,这些数组将需要从合并器传输到缩减器。所以我会避免在“分组”的情况下使用它,除非你知道关键基数非常小。这个自定义项更适合于“分组所有”场景,在这些场景中,您有大量的输入数据。另外,如果输入数据比字节数组小得多,那么使用这个udf可能会更糟。如果可以接受更差的精度,那么字节数组可能会变小。

相关问题