apache-spark - Web UI Spark 作业中的 ThreadPoolExecutor 作业是什么?

标签 apache-spark apache-spark-sql

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

查看 spark UI,我看到有一些作业描述为“在 ThreadPoolExecutor.java:1142 运行”

Example of some of these jobs

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

最佳答案

经过一番调查,我发现运行在 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

在我的情况下,运行在“运行在 ThreadPoolExecutor.java:1142”上的 Spark 作业,其中 id 为 12 和 16。

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

它们都对应于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/

相关文章:

eclipse - 如何比较 2 列并在 Scala 中连接

java - 在 Apache Spark Dataset<Row> 上应用 flatMap 操作时出现意外的编码器行为

java - 如何从Spark中的序列文件中提取行的范围?

scala - 填补时间序列 Spark 中的空白

scala - 如何在 Spark 应用程序中进行有效的日志记录

dictionary - 在 Parquet 中的 map 类型列上使用 spark-sql 过滤下推

hadoop - Spark : Not able to read data from hive tables

java - Spark : Read an inputStream instead of File

python-3.x - 如何在 Spark 数据帧中存储 Python 字节串

scala - Spark 数据框到密封特征类型