Apache Spark SQL将永远花费数十亿行来自Cassandra?

时间:2016-11-24 05:54:20

标签: apache-spark apache-spark-sql spark-cassandra-connector

我有以下代码

我按如下方式调用spark-shell

./spark-shell --conf spark.cassandra.connection.host=170.99.99.134 --executor-memory 15G --executor-cores 12 --conf spark.cassandra.input.split.size_in_mb=67108864

scala> val df = spark.sql("SELECT test from hello") // Billion rows in hello and test column is 1KB

df: org.apache.spark.sql.DataFrame = [test: binary]

scala> df.count

[Stage 0:>   (0 + 2) / 13] // I dont know what these numbers mean precisely.

如果我按如下方式调用spark-shell

./spark-shell --conf spark.cassandra.connection.host=170.99.99.134

val df = spark.sql("SELECT test from hello") // This has about billion rows

scala> df.count


[Stage 0:=>  (686 + 2) / 24686] // What are these numbers precisely?

这两个版本都不起作用Spark一直在运行,我一直在等待超过15分钟而没有响应。关于什么可能是错的以及如何解决这个问题的任何想法?

我使用的是Spark 2.0.2 和spark-cassandra-connector_2.11-2.0.0-M3.jar

1 个答案:

答案 0 :(得分:4)

Dataset.count很慢,因为它涉及外部数据源时不是很聪明。它将查询重写为(很好):

SELECT COUNT(1) FROM table

但不是按下COUNT,而是执行:

SELECT 1 FROM table

反对来源(在你的情况下它将获取十亿个),然后在本地聚合以获得最终结果。你看到的数字是任务计数器。

cassandraCount上有一个优化的CassandraRDD操作:

sc.cassandraTable(keyspace, table).cassandraCount

有关服务器端操作的更多信息,请参见the documentation