0

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

 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 和其他类似算法的信息,但我不知道如何在这里使用它们。我并不关心确切的结果,估计对我来说非常好。谁能建议我能做什么?

4

1 回答 1

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
.

这将大大减少你的洗牌并给你近似的结果。要获得完整结果,请执行额外的步骤来汇总 bin 中的结果。

于 2015-07-31T08:57:49.647 回答