我有一个带有复合分区键的cassandra表(time_bucket timestamp,node int) . time_bucket值是插入数据的时间,秒数转换为00,节点值范围为0到100
火花作业每分钟都会从表格中获取数据 . 该表包含近2500万条记录,每分钟都会添加记录 .
如果我的spark作业每次运行时都选择所有记录,则作业将在2分钟内完成 . 但如果我查询使用:
s 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 . 每个 Actuator 使用8个内核和20GB内存 . 增加这些值无助于使火花加工更快 .
知道为什么我的工作需要10分钟吗?使用IN子句时spark-cassandra不能正常工作吗?
2 回答
你可能想要
joinWithCassandraTable
. 如果你有大量的值,几乎总是通过连接更好地服务In
子句 . 这将在不同的执行程序上并行执行所有请求 .https://github.com/datastax/spark-cassandra-connector/blob/master/doc/2_loading.md#using-joinwithcassandratable
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)
观察范围的边缘,当然这假设您的范围是连续的 .