如何提高计算聚合的性能?

时间:2015-07-30 20:55:01

标签: apache-spark statistics real-time analytics hyperloglog

我想解决的问题似乎微不足道。我有大量的活动(实际上它们来自移动应用程序,所以它们是移动事件)。每个事件都由几个属性描述:

 operating_system create_time version resolution model brand network_type etc.

我将这些事件存储在hdfs上,我试图解决的问题是允许用户近乎实时地分析这些事件。通过分析,我的意思是只能选择特定的列,有趣的日期范围,以及查看来自不同手机型号的事件数量。例如,假设我有以下数据集:

 os1 2015-07-30 v1 200x200 model1 brand1 provider1
 os1 2015-07-30 v1 200x200 model1 brand1 provider1
 os1 2015-07-30 v1 200x200 model1 brand1 provider2
 os1 2015-07-30 v1 200x200 model1 brand2 provider2
 os1 2015-07-29 v1 200x200 model1 brand1 provider1
 os2 2015-07-30 v1 200x200 model1 brand1 provider1
 os1 2015-06-30 v1 200x200 model1 brand1 provider1

让我们假设用户想要从2015年7月开始查找不同手机的活动数量。他正在寻找的答案如下:

 os1 2015-07-30 v1 200x200 model1 brand1 provider1 4
 os1 2015-07-30 v1 200x200 model1 brand1 provider2 1
 os1 2015-07-30 v1 200x200 model1 brand2 provider2 1

因为事件的数量巨大,我试图计算聚合并将它们存储在cassandra中。每天计算聚合,给出前面的示例数据集,我的聚合看起来像这样:

 os1 2015-06-30 v1 200x200 model1 brand1 provider1 1
 os1 2015-07-29 v1 200x200 model1 brand1 provider1 1
 os1 2015-07-30 v1 200x200 model1 brand1 provider1 3
 os1 2015-07-30 v1 200x200 model1 brand1 provider2 1
 os1 2015-07-30 v1 200x200 model1 brand2 provider2 1

问题是它们仍然太多了。我仍然需要spark来运行按需任务来从所请求的日期范围中汇总聚合。它很慢,需要大量的网络传输。我读了很多关于HyperLogLog和其他类似算法的内容,但我不知道如何在这里使用它们。我并不真正关心确切的结果,估计对我来说非常好。谁能建议我能做什么?

1 个答案:

答案 0 :(得分:0)

为您的数据添加其他字段。这个附加字段会将您的数据分解为较小的数据块(我们将其称为分箱数据)。例如1000记录给它一个bin。然后在每个bin中进行聚合。像:

1 os1 2015-06-30 v1 200x200 model1 brand1 provider1 1
1 os1 2015-07-29 v1 200x200 model1 brand1 provider1 1
1 os1 2015-07-30 v1 200x200 model1 brand1 provider1 3
.
.
2 os1 2015-07-30 v1 200x200 model1 brand1 provider2 1
2 os1 2015-07-30 v1 200x200 model1 brand2 provider2 1
.

这会减少你的洗牌次数并给你近似的结果。为了获得完整的结果,请执行额外的步骤来聚合来自垃圾箱的结果。

相关问题