Apache spark Spark对历史流数据的批处理
我脑子里有一个应用程序,我很难想出最有效的方法来编写它。我们有一个实时的数据源,我们希望通过Spark Streaming进行处理 我们正在为一组项目保持运行状态 比如说,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
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)
,并按时间进行聚类。