我在Spark / Cassandra集群上运行一个简单的应用程序。自从迁移到新的环境(Spark 1.5而不是1.2以及Cassandra版本的次级升级)以来,观察到了相当大的性能降级(从4秒到1-5米,对于相同的任务和相同数量的数据)。
经过初步调查后看来,对于完全相同的代码,从火花驱动程序的角度来看,还有更多的任务生成(20 + k,以前它们最多为5),而执行程序末端的日志也反映了相同的情况:
在不同分区上对同一查询进行了许多顺序执行:
...
CassandraTableScanRDD: Fetched 0 rows from x.y for partition 20324 in 0.138 s.
CassandraTableScanRDD: Fetched 0 rows from x.y for partition 20327 in 0.058 s.
CassandraTableScanRDD: Fetched 0 rows from x.y for partition 20329 in 0.053 s.
...
曾经只是一个人:
CassandraTableScanRDD: Fetched 905 rows from x.y for partition 0 in 2.992 s.
由于应用程序代码是相同的,我想知道什么可能导致分区行为的这种差异以及可以采取哪些措施来修复它?
NB!如果不同,则设置两个环境,不共享/继承配置。
感谢。
答案 0 :(得分:5)
新版本的Spark Cassandra Connector使用更现代的Cassandra内部的System表来估算分割大小。虽然您看到的分割数量非常大,但每个(当前为5分钟)更新此表。从此表中读取的值除以拆分大小。
如果您使用的C *小于2.1.5,则此表不存在,并且需要手动完成分区。
如果您继续查看问题,可以通过ReadConf手动传入拆分数。