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

时间:2016-11-28 20:09:14

标签: apache-spark apache-spark-sql

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

查看spark UI,我看到有一些带有描述的作业"运行在ThreadPoolExecutor.java:1142"

Example of some of these jobs

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

2 个答案:

答案 0 :(得分:25)

经过一些调查后我发现在ThreadPoolExecutor.java:1142运行 Spark作业与join运算符的查询相关,这些运算符符合BroadcastHashJoin的定义,其中一个连接一方向执行人广播,以便加入。

BroadcastHashJoin运营商使用ThreadPool进行此异步广播(请参阅thisthis)。

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标签时,您会看到已完成查询部分及其作业(右侧)。

SQL tab in web UI with Completed Queries

在我的例子中,Spark运行在“在ThreadPoolExecutor.java:1142上运行”,其中id为12和16。

Jobs tab in web UI with "run at ThreadPoolExecutor.java:1142" jobs

它们都对应join次查询。

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

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

答案 1 :(得分:0)

在读取和写入csv时也会发生这种情况。

在这些操作中,是我第一次目睹此线程池执行程序。