在Spark Streaming应用程序中联接Cassandra表数据的最佳方法是什么?

问题描述 投票:0回答:1

我们几乎最终确定要使用spark-sql 2.4.x版本,对于Cassandra-3.x版本使用datastax-spark-cassandra-connector。

但是在以下情况下,有一个关于效率的基本问题。

对于流数据记录(即streamingDataSet,我需要从Cassandra(C *)表中查找现有记录(即cassandraDataset)。

Dataset<Row> streamingDataSet = //kafka read dataset

Dataset<Row> cassandraDataset= //loaded from C* table those records loaded earlier from above.

要查找我需要加入以上数据集的数据

Dataset<Row> joinDataSet = cassandraDataset.join(cassandraDataset).where(//somelogic)

进一步处理joinDataSet以实现业务逻辑...

在上述情况下,我的理解是,对于收到的每条记录从kafka流中,它将查询C *表,即数据库调用。

如果C *表包含以下内容,则不会花费大量时间和网络带宽数十亿条记录?方法/程序应该是什么然后改进查找C *表?

在这种情况下最好的解决方案是什么?我无法从加载一次C *表并在数据不断添加到C *表中时进行查找...即新的查找可能需要新保存的数据。

如何处理这种情况?任何建议请..

apache-spark cassandra apache-spark-sql spark-streaming datastax-enterprise
1个回答
0
投票

cassandraDataset联接时,应在联接条件下使用其PK。 PK用作分区密钥,并且基于此密钥在节点之间分布数据。想象发生了多个并发连接操作,如果数据落在不同的节点上,那么许多节点将并行运行以快速返回结果(即可伸缩性)。在加入条件下没有PK的情况下,将扫描所有节点上的所有数据,并且可伸缩性将遭受重大打击。这是一本好书-https://www.datastax.com/blog/2016/02/most-important-thing-know-cassandra-data-modeling-primary-key

此外,您应该在代表cassandraDataset的表上创建一个二级索引。它在索引列上有数据的那些节点上充当本地索引。这将有助于在给定节点上更快地查找数据。

PK可帮助扩展规模,二级索引可帮助更快地查找。对于流应用程序,都需要在连接条件下使用它们。

如果您不能这样做,那将会非常慢。在这种情况下,您唯一的选择是在联接之前将更多数据累积到“ streamingDataSet”中,以提高效率。这会好一些,但仍然不适合流应用程序,在这种情况下,批处理会更好。

© www.soinside.com 2019 - 2024. All rights reserved.