Web UI的Spark Jobs中的ThreadPoolExecutors作业是什么?

Gid*_*eon 16 apache-spark apache-spark-sql

我正在使用Spark SQL 1.6.1并且正在执行一些连接.

看看火花UI我看到有一些工作描述"在ThreadPoolExecutor.java:1142运行"

其中一些工作的例子

我想知道为什么一些Spark工作会得到这种描述?

Jac*_*ski 29

经过一些调查后我发现在ThreadPoolExecutor.java:1142运行 Spark作业与join运算符的查询有关,这些运算符符合BroadcastHashJoin一个连接方向执行者广播的位置的定义.

BroadcastHashJoin运算符使用a ThreadPool进行此异步广播(请参阅).

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|
+---+
Run Code Online (Sandbox Code Playgroud)

当您切换到SQL选项卡时,您应该看到已完成查询部分及其作业(在右侧).

具有已完成查询的Web UI中的SQL选项卡

在我的例子中,Spark作业运行在"在ThreadPoolExecutor.java:1142上运行",其中id为12和16.

Web UI中的

它们都对应于join查询.

如果你想知道"我的连接之一导致这个工作出现是有道理的,但据我所知,join是一个shuffle转换而不是一个动作,那么为什么用ThreadPoolExecutor描述这个工作而不是我的动作(如是我的其余工作的情况)?",那么我的回答通常是这样的:

Spark SQL是Spark的扩展,它有自己的抽象(Dataset简单地说就是那个很快就会想到的抽象),它们有自己的运算符来执行.一个"简单"SQL操作可以运行一个或多个Spark作业.它由Spark SQL的执行引擎自行决定运行或提交多少Spark作业(但它们确实使用了RDD) - 您不必知道这样的低级别细节,因为它...... .too低级...通过使用Spark SQL的SQL或Query DSL,您可以获得高级别.

  • Laskowski 博士来救援 (3认同)