使用IN作为复合分区键时,Spark-Cassandra非常慢

时间:2017-01-25 21:47:12

标签: apache-spark cassandra datastax-enterprise spark-cassandra-connector

我有一个带有复合分区键的cassandra表(time_bucket timestamp,node int)。 time_bucket值是插入数据的时间,秒数转换为00,节点值范围为0到100

每分钟都会运行一个火花作业,从表中获取数据。该表包含近2500万条记录,每分钟都会添加记录。

如果我的spark作业每次运行时选择所有记录,则作业在2分钟内完成。但如果我查询使用:

取值c.cassandraTable(keyspace_name,table_name).where("time_bucket = ? ", from).where("nodeid_bucket IN ? ", nodeid_bucket_range)

其中val nodeid_bucket_range = 0到100,

这项工作需要10分钟才能完成。

我的群集有6个节点,我正在使用DSE 4.8.9。每个执行程序使用8个内核和20GB内存。增加这些值无助于使火花加工更快。

知道为什么我的工作需要10分钟?使用IN子句时spark-cassandra不能正常工作吗?

2 个答案:

答案 0 :(得分:1)

你可能想要joinWithCassandraTable。如果你有大量的值,那么通过连接几乎总能得到In子句。这将在不同的执行程序上并行执行所有请求。

https://github.com/datastax/spark-cassandra-connector/blob/master/doc/2_loading.md#using-joinwithcassandratable

答案 1 :(得分:0)

IN语句转换为key OR key OR key3 ... OR key100,这对于优化程序创建有用的内容来说效率非常低。在您的情况下,您可以使用:

sc.cassandraTable(keyspace_name,table_name).where("time_bucket = ? ", from).where("nodeid_bucket > ? AND nodeid_bucket < ? ", nodeid_bucket_range)

观察范围的边缘,当然这假设您的范围是连续的。