2016-02-24 25 views
3

我有一个实时填充Cassandra表的Spark Streaming进程。我想对该Cassandra表进行查询,以访问底层数据。在用Spark Streaming填充的Cassandra表上生成Spark

CQL在它的语法(仅限有条件的地方,没有GROUP BY),所以我想用在它上面的星火SQL的相当有限。

但是,一旦我加载数据框,它不会看到底层数据的任何变化。如何不断保持刷新数据帧,使他们始终看到数据更改?

Srdjan

回答

1

我知道这是一个较旧的帖子,但似乎这里有一个反复出现的主题。需要对已被摄入NoSQL存储的数据进行全功能查询,Spark SQL提供了实现这一功能的能力。需要考虑的事情之一

1>如果直接使用Spark连接器直接使用Spark连接器来处理数据存储,即使使用谓词下推,相关列也必须从Cassandra /其他NoSQL存储中移入Spark,以便运行查询。存在缓存因为即席查询保证下一个查询需要一组不同的数据,这意味着再次重复该过程,并导致在火花过程流失已经移动到火花数据小点,并抑制性能

2>如果有人简单地将数据存储区中的所有数据加载到Spark中,则会出现上面提到的陈旧问题,因为Spark是不可变的高速缓存。一种解决方案是在Spark中对数据设置TTL(生存时间),并且每隔一段时间从头开始删除和重新创建数据帧,这是浪费和低效的,并且不清楚在查询时会发生什么做

一个最好的品种溶液(SnappyData是一个我知道的),只是将dataframes成可变的实体,这样的变化在的NoSQL数据存储可以在星火被CDCed,您可以用星火SQL执行查询,不留Spark群集或必须将数据移动到每个查询的Spark中。这具有显着的性能优势(可以以列格式存储数据,可以修剪查询,避免不必要的序列化成本,利用Spark中的代码生成更快地运行查询),降低整个系统的复杂性并允许您构建连续的应用程序与最新的数据一起工作。

相关问题