我正在使用 Spark SQL 1.6.1 并且正在执行一些连接。
查看 spark UI,我看到有一些作业描述为“在 ThreadPoolExecutor.java:1142 运行”
我想知道为什么一些 Spark 工作会得到这样的描述?
最佳答案
经过一番调查,我发现运行在 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 选项卡时,您应该会看到 已完成的查询 部分及其职位 (在右侧)。
在我的情况下,运行在“运行在 ThreadPoolExecutor.java:1142”上的 Spark 作业,其中 id 为 12 和 16。
它们都对应于
join
查询。如果您想知道“这是有道理的,我的一个联接导致此作业出现,但据我所知,联接是一个随机转换而不是一个 Action ,那么为什么使用 ThreadPoolExecutor 而不是我的 Action 来描述作业(如我的其他工作也是如此)?”,那么我的回答通常是这样的:
Spark SQL 是 Spark 的扩展,具有自己的抽象(
Dataset
s 只是快速想到的那个),它们有自己的执行运算符。一个“简单”的 SQL 操作可以运行一个或多个 Spark 作业。运行或提交多少 Spark 作业由 Spark SQL 的执行引擎自行决定(但它们确实使用 RDD)——您不必知道如此低级的细节,因为它......嗯...... .too low-level ...假设您使用 Spark SQL 的 SQL 或 Query DSL 的级别如此之高。
关于apache-spark - Web UI Spark 作业中的 ThreadPoolExecutor 作业是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40852622/