我正在使用Spark SQL 1.6.1并且正在执行一些连接。
查看spark UI,我看到有一些带有描述的作业"运行在ThreadPoolExecutor.java:1142"
我想知道为什么一些Spark工作会得到那个描述?
答案 0 :(得分:25)
经过一些调查后我发现在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标签时,您会看到已完成查询部分及其作业(右侧)。
在我的例子中,Spark运行在“在ThreadPoolExecutor.java:1142上运行”,其中id为12和16。
它们都对应join
次查询。
如果你想知道“我的连接之一导致这个工作出现是有道理的,但据我所知,join是一个shuffle转换而不是一个动作,那么为什么用ThreadPoolExecutor描述这个工作而不是我的行动(就像我的其他工作一样)?“,那么我的回答通常是这样的:
Spark SQL是Spark的扩展,它有自己的抽象(Dataset
来命名一个很快就会想到的那个),它们有自己的运算符来执行。一个“简单”SQL操作可以运行一个或多个Spark作业。它由Spark SQL的执行引擎自行决定运行或提交多少Spark作业(但它们确实使用了RDD) - 您不必知道这样的低级别细节,因为它...... .too低级...通过使用Spark SQL的SQL或查询DSL,您可以获得高级别。
答案 1 :(得分:0)
在读取和写入csv时也会发生这种情况。
在这些操作中,是我第一次目睹此线程池执行程序。