我已经使用Spark Streaming从Cassandra和Tutorial-1和Tutorial-2链接进行阅读。
可以说,Cassandra-Spark集成当前没有提供任何开箱即用的东西来连续获取Cassandra并将其流式传输到HDF等其他系统?
?连续地,我的意思是,自从Spark上一次提取以来,在表中只能将这些行变为已更改(插入或更新)的表。如果这样的行太多,则应该有一个选项来限制行的数量,随后的火花获取应从其关闭的位置开始。至少保证还可以,但正好是一个巨大的欢迎。
如果不支持它,一种支持的方法可能是在每个Cassandra-table中使用辅助列updated_time
,需要通过暴风雨查询,然后将该列用于查询。或每个表包含ID的辅助表,该行更改的行的时间戳。有人尝试过吗?
我不认为Apache Cassandra可以开箱即用。在内部(一段时间内),它以依次的方式存储所有操作,但它是每个节点,最终被压实(以节省空间)。坦白说,卡桑德拉(与大多数其他数据库)的承诺是提供最新的数据视图(本身在分布式环境中可能非常棘手),但对于数据如何变化而言,这不是完整的历史记录。
因此,如果您仍然想在Cassandra中拥有此类信息(并在Spark中处理),则必须自己做一些其他工作:设计专用表(S)(或添加合成列),请照顾分区,保存偏移以跟踪进度等等。
Cassandra可以使用时间序列数据,但是在您的情况下,我会考虑仅使用流媒体解决方案(例如Kafka)而不是发明它。
我同意罗尔基所说的话,但如果您与C*与此用例相关,但想提出一个解决方案。该解决方案假设您对模式和摄入也有完全控制。这不是流媒体解决方案,尽管它可能会尴尬地将其分解为一个。
您是否考虑过使用由TimeBucket以及murmur_hash_of_one_or_more_clustering_columns
%some_int_designed_limit_row_width
组成的复合密钥?通过这种方式,您可以将时间表设置为1分钟,5分钟1小时等,具体取决于您需要分析/存档数据的"实时"。需要基于一个或多个聚类列的杂音哈希来帮助C*群集中的数据(如果您经常查找特定的聚类列,这是一个可怕的解决方案)。
例如,以一个物联网用例,传感器每分钟报告,并具有一些传感器读数,可以表示为整数。
create table if not exists iottable {
timebucket bigint,
sensorbucket int,
sensorid varchar,
sensorvalue int,
primary key ((timebucket, sensorbucket), sensorid)
} with caching = 'none'
and compaction = { 'class': 'com.jeffjirsa.cassandra.db.compaction.TimeWindowedCompaction' };
请注意使用TimeWindowedCompaction。我不确定您正在使用哪种版本的C*;但是有了2.x系列,我会远离数据列表。我无法谈论它在3.x中的表现如何。任何价格,您都应在解决模式和压实策略之前进行广泛的测试和基准测试。
还要注意,此架构可能会导致热点,因为它容易受到比其他传感器更频繁的传感器的影响。同样,不知道用例,很难提供完美的解决方案 - 这只是一个例子。如果您不在乎曾经阅读过特定传感器(或列)的C*,则根本不必使用聚类列,您只需使用timeuuid或随机的东西来用于杂音哈希桶。p>不管您如何决定分区数据,类似的架构都将允许您使用repartitionByCassandraReplica
和joinWithCassandraTable
在给定时数期间提取所编写的数据。