首页 文章

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

提问于
浏览
2

我有一个带有复合分区键的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 回答

  • 1

    你可能想要 joinWithCassandraTable . 如果你有大量的值,几乎总是通过连接更好地服务 In 子句 . 这将在不同的执行程序上并行执行所有请求 .

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

  • 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)

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

相关问题