使用Spark

时间:2016-06-23 00:40:31

标签: apache-spark pyspark spark-streaming

我有一个应用程序,我很难找到最有效的编写方法。我们希望使用Spark Streaming处理数据的实时数据。

我们保持一组物品的运行状态。

例如,

group_id,item_id,timestamp,state
1,1,'2016-01-01 00:00:00+0000',1    -> group 1 has 1 items in state 1
2,1,'2016-01-01 00:00:01+0000',0    -> group 2 has 0 items in state 1
1,2,'2016-01-01 00:00:10+0000',1    -> group 1 has 2 items in state 1
2,3,'2016-01-01 00:01:01+0000',1    -> group 2 has 1 items in state 1
1,4,'2016-01-01 00:05:00+0000',0    -> group 1 has 2 items in state 1
2,2,'2016-01-01 00:07:00+0000',1    -> group 2 has 2 items in state 1

火花流应用非常适合updateStateByKey

但是,我们还将所有这些数据记录到Cassandra。由于某些数据可能会迟到,因此我们必须运行定期(每日,每周等)修复作业,查看所有已记录的Cassandra数据并计算相同的运行状态。

这是我的架构:

CREATE TABLE state_tracking (
    group_id,
    year int,
    time timestamp,
    item_id int,
    state int,
    PRIMARY KEY ((group_id, year), time, item_id)
) WITH CLUSTERING ORDER BY (time DESC);

这是我遇到麻烦的部分。

如果可能的话,我想尽可能多地重用流代码。我也希望这份工作有合理的表现。

整个数据集非常大,但是,有数千个组。一组肯定会适合单一执行者的记忆。

我正在使用pypark-cassandra

似乎使用groupByKey将为我提供与group_id相关联的所有事件的列表,然后可以对其进行排序和迭代。

mapPartitions看起来也很有用,但我需要确保group_id的所有记录都在一个分区中。我还需要担心排序顺序。

我目前最好的猜测是使用repartitionAndSortWithinPartitionsgroup_id进行分区,然后使用mapPartitions来迭代已排序的数据。

我是在正确的轨道上,还是我离开了?有没有人在批处理Spark作业中处理大型的订单敏感数据?

0 个答案:

没有答案