【问题标题】:What are ThreadPoolExecutors jobs in web UI's Spark Jobs?Web UI Spark 作业中的 ThreadPoolExecutor 作业是什么?
【发布时间】:2016-11-28 20:09:14
【问题描述】:

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

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

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

【问题讨论】:

    标签: apache-spark apache-spark-sql


    【解决方案1】:

    经过一番调查,我发现 run at 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 选项卡时,您应该会看到 Completed Queries 部分及其Jobs(在右侧)。

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

    它们都对应于join 查询。

    如果您想知道“我的一个联接导致此作业出现是有道理的,但据我所知,联接是一个随机转换而不是一个动作,那么为什么使用 ThreadPoolExecutor 而不是我的行动(就像我的其他工作一样)?”,那么我的回答通常是这样的:

    Spark SQL 是 Spark 的扩展,它有自己的抽象(Datasets 只是快速想到的那个),它们有自己的执行运算符。一个“简单”的 SQL 操作可以运行一个或多个 Spark 作业。运行或提交多少 Spark 作业由 Spark SQL 的执行引擎自行决定(但它们确实使用 RDD)——您不必知道如此低级的细节,因为它......嗯...... .too low-level...give you are so high-level using Spark SQL's SQL or Query DSL.

    【讨论】:

    • 博士。拉斯科夫斯基来救援
    • 硬硬硬硬。太棒了!
    【解决方案2】:

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

    在这些操作中,我第一次目睹了这个线程池执行器。

    【讨论】:

      猜你喜欢
      • 2015-05-12
      • 1970-01-01
      • 2020-10-18
      • 1970-01-01
      • 1970-01-01
      • 2021-10-25
      • 2019-03-28
      • 2015-03-18
      • 1970-01-01
      相关资源
      最近更新 更多