【发布时间】:2016-11-28 20:09:14
【问题描述】:
我正在使用 Spark SQL 1.6.1 并且正在执行一些连接。
查看 spark UI,我看到有一些作业描述为“在 ThreadPoolExecutor.java:1142 运行”
我想知道为什么某些 Spark 作业会得到这样的描述?
【问题讨论】:
标签: apache-spark apache-spark-sql
我正在使用 Spark SQL 1.6.1 并且正在执行一些连接。
查看 spark UI,我看到有一些作业描述为“在 ThreadPoolExecutor.java:1142 运行”
我想知道为什么某些 Spark 作业会得到这样的描述?
【问题讨论】:
标签: apache-spark apache-spark-sql
经过一番调查,我发现 run at ThreadPoolExecutor.java:1142 Spark 作业与带有 join 运算符的查询相关,这些运算符符合 BroadcastHashJoin 的定义,其中一个连接端被广播到加入的执行者。
BroadcastHashJoin 运算符使用ThreadPool 进行异步广播(请参阅this 和this)。
scala> spark.version
res16: String = 2.1.0-SNAPSHOT
scala> val left = spark.range(1)
left: org.apache.spark.sql.Dataset[Long] = [id: bigint]
scala> val right = spark.range(1)
right: org.apache.spark.sql.Dataset[Long] = [id: bigint]
scala> left.join(right, Seq("id")).show
+---+
| id|
+---+
| 0|
+---+
当您切换到 SQL 选项卡时,您应该会看到 Completed Queries 部分及其Jobs(在右侧)。
在我的情况下,Spark 作业在“运行在 ThreadPoolExecutor.java:1142”上运行,其中 id 为 12 和 16。
它们都对应于join 查询。
如果您想知道“我的一个联接导致此作业出现是有道理的,但据我所知,联接是一个随机转换而不是一个动作,那么为什么使用 ThreadPoolExecutor 而不是我的行动(就像我的其他工作一样)?”,那么我的回答通常是这样的:
Spark SQL 是 Spark 的扩展,它有自己的抽象(Datasets 只是快速想到的那个),它们有自己的执行运算符。一个“简单”的 SQL 操作可以运行一个或多个 Spark 作业。运行或提交多少 Spark 作业由 Spark SQL 的执行引擎自行决定(但它们确实使用 RDD)——您不必知道如此低级的细节,因为它......嗯...... .too low-level...give you are so high-level using Spark SQL's SQL or Query DSL.
【讨论】:
读取和写入 csv 时也会发生这种情况。
在这些操作中,我第一次目睹了这个线程池执行器。
【讨论】: