Apache spark Spark对历史流数据的批处理

Apache spark Spark对历史流数据的批处理,apache-spark,pyspark,spark-streaming,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 i

我脑子里有一个应用程序,我很难想出最有效的方法来编写它。我们有一个实时的数据源,我们希望通过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
spark streaming应用程序非常适合
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\u id
相关的所有事件的列表,然后可以对其进行排序和迭代

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

我目前的最佳猜测是使用
repartitionAndSortWithinPartitions
group\u id
进行分区,然后使用
mapPartitions
对排序后的数据进行迭代


我是在正确的轨道上,还是走得太远了?有人在批处理Spark作业中处理过大量订单敏感数据吗?

您的模式如何?您需要排列Cassandra表模式,以获得最佳的批处理获取。否则,您将进行永久性的全表扫描。我已添加了我的Cassandra模式。我使用的分区键是
(group\u id,year)
,并按
时间进行聚类。您的模式看起来怎么样?您需要排列Cassandra表模式,以获得最佳的批处理获取。否则,您将进行永久性的全表扫描。我已添加了我的Cassandra模式。我使用的分区键是
(group\u id,year)
,并按
时间进行聚类。