spark-sql 与 spark-shell REPL 中的 Spark SQL 性能差异

Posted

技术标签:

【中文标题】spark-sql 与 spark-shell REPL 中的 Spark SQL 性能差异【英文标题】:Spark SQL performance difference in spark-sql vs spark-shell REPL 【发布时间】:2016-02-11 14:43:38 【问题描述】:

Spark 新手问题:我在 spark-sqlspark-shell 中进行完全相同的 Spark SQL 查询。 spark-shell 版本大约需要 10 秒,而spark-sql 版本大约需要 20 秒。

spark-sql REPL 直接获取查询:

spark-sql> SELECT .... FROM .... LIMIT 20

spark-shell REPL 命令如下:

scala> val df = sqlContext.sql("SELECT ... FROM ... LIMIT 20 ") 
scala> df.show()

在这两种情况下,它是完全相同的查询。此外,由于显式LIMIT 20,查询仅返回几行。

从不同 CLI 执行相同查询的方式有何不同?

如果有帮助,我正在 Hortonworks 沙盒 VM (Linux CentOS) 上运行。

【问题讨论】:

对于 spark-shell 版本,df.show() 调用是 10 秒还是 sqlContext.sql 调用和 df.show 调用都是 10 秒? DataFrame 初始化不是免费的(取决于数据源),因此即使在调用诸如收集/显示之类的操作之前,您也可以花费大量时间进行初始化。 spark-sql 调用可能会像 spark-shell 调用一样执行这两个步骤,因此将苹果与苹果进行比较很重要。 DataFrame 的初始化几乎是瞬间完成的——时间都在df.show spark 可能正在推迟初始化。 (在 show 执行查询时访问之前不会加载表) 【参考方案1】:

我认为更多的是两个部分,

    首先,它可能与订单有关。如果您首先运行 spark-sql,则 spark 将能够从头开始构建解释计划。但是,如果您再次运行相同的查询。它可能比第一个从 shell 或 sql 中花费的时间少,因为解释计划很容易被检索到

    其次,可能与spark-sql转换为资源排序有关。它发生了多次。 Spark-shell 比 spark-sql 更快地获取资源并启动进程。您可以从 UI 或 top 进行检查,您会发现 spark-shell 的实际启动速度比 spark-sql 快。

【讨论】:

以上是关于spark-sql 与 spark-shell REPL 中的 Spark SQL 性能差异的主要内容,如果未能解决你的问题,请参考以下文章

Spark-SQL CLI:未调用 SupportsPushDownFilters.pushFilters

基于spark2.0整合spark-sql + mysql + parquet + HDFS

寒假第九天

Spark-Shell的启动与运行

Spark-Shell的启动与运行

presto,dremio,spark-sql与ranger的整合记录