我有一个应用程序,我很难找到最有效的编写方法。我们希望使用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
的所有记录都在一个分区中。我还需要担心排序顺序。
我目前最好的猜测是使用repartitionAndSortWithinPartitions
按group_id
进行分区,然后使用mapPartitions
来迭代已排序的数据。
我是在正确的轨道上,还是我离开了?有没有人在批处理Spark作业中处理大型的订单敏感数据?