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选项卡时,您应该看到已完成查询部分及其作业(在右侧).
在我的例子中,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或Query DSL,您可以获得高级别.
| 归档时间: |
|
| 查看次数: |
4270 次 |
| 最近记录: |