我在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!如果不同,则设置两个环境,不共享/继承配置.
谢谢.
新版本的Spark Cassandra Connector使用更现代的Cassandra内部的System表来估计分割大小.虽然您看到的分割数量非常大,但每个(当前为5分钟)更新此表.从此表中读取的值除以拆分大小.如果您使用的C *小于2.1.5,则此表不存在,并且需要手动完成分区.
https://github.com/datastax/spark-cassandra-connector/blob/master/doc/FAQ.md#what-does-inputsplitsize_in_mb-use-to-determine-size
如果您继续查看问题,可以通过ReadConf手动传入拆分数.