我们几乎最终确定要使用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 *表中时进行查找...即新的查找可能需要新保存的数据。
如何处理这种情况?任何建议请..
与cassandraDataset
联接时,应在联接条件下使用其PK。 PK用作分区密钥,并且基于此密钥在节点之间分布数据。想象发生了多个并发连接操作,如果数据落在不同的节点上,那么许多节点将并行运行以快速返回结果(即可伸缩性)。在加入条件下没有PK的情况下,将扫描所有节点上的所有数据,并且可伸缩性将遭受重大打击。这是一本好书-https://www.datastax.com/blog/2016/02/most-important-thing-know-cassandra-data-modeling-primary-key
此外,您应该在代表cassandraDataset
的表上创建一个二级索引。它在索引列上有数据的那些节点上充当本地索引。这将有助于在给定节点上更快地查找数据。
PK可帮助扩展规模,二级索引可帮助更快地查找。对于流应用程序,都需要在连接条件下使用它们。
如果您不能这样做,那将会非常慢。在这种情况下,您唯一的选择是在联接之前将更多数据累积到“ streamingDataSet”中,以提高效率。这会好一些,但仍然不适合流应用程序,在这种情况下,批处理会更好。