Spark执行器是多线程的吗?

Pun*_*ngh 6 apache-spark

Spark Executor如何执行代码?它有多个正在运行的线程吗?如果是,它将打开多个JDBC连接以从RDBMS读取数据或向RDBMS写入数据吗?

Jac*_*ski 5

Spark Executor 如何执行代码?

开源(包括 Apache Spark 项目)的美妙之处在于您可以查看代码并自己找到答案。这并不是说这是找到答案的最好也是唯一的方法,但我的可能不像代码本身那么清楚(相反的也可以是真的:))

话虽如此,请自行查看Executor的代码。

它有多个线程在运行吗?

是的。请参阅此行,其中Executor创建了一个新TaskRunner的 Java Runnable(一个单独的线程)。那Runnable在线程池上执行

引用Spark 用于线程池的Java 的Executors.newCachedThreadPool

创建一个线程池,根据需要创建新线程,但会在可用时重用先前构造的线程,并在需要时使用提供的 ThreadFactory 创建新线程。

如果是,它是否会打开多个 JDBC 连接以从 RDBMS 读/写数据?

我相信你已经知道答案了。是的,它会打开多个连接,这就是为什么您应该使用foreachPartition操作来 _“将函数f应用于此数据集的每个分区”。(同样适用于 RDD)和某种连接池。

  • 每个 executor 中创建的线程池的大小是否等于 executor-core 属性? (4认同)

Rap*_*oth 1

是的,如果你设置spark.executor.cores超过 1,那么你的执行器将有多个并行线程,是的,我想然后将打开多个 JDBC 连接