如何使用动态资源分配执行 Spark 程序?

How to execute Spark programs with Dynamic Resource Allocation?

我正在使用 spark-summit 命令执行带有参数的 Spark 作业,例如:

spark-submit --master yarn-cluster --driver-cores 2 \
 --driver-memory 2G --num-executors 10 \
 --executor-cores 5 --executor-memory 2G \
 --class com.spark.sql.jdbc.SparkDFtoOracle2 \
 Spark-hive-sql-Dataframe-0.0.1-SNAPSHOT-jar-with-dependencies.jar

现在我想使用 Spark 的动态资源分配来执行同一个程序。能否请您帮助在执行Spark程序中使用动态资源分配。

在 Spark 动态分配中,spark.dynamicAllocation.enabled 需要设置为 true,因为它默认为 false

这需要将 spark.shuffle.service.enabled 设置为 true,因为 Spark 应用程序在 YARN 上是 运行。检查此 link to start the shuffle service on each NodeManager in YARN

以下配置也相关:

spark.dynamicAllocation.minExecutors, 
spark.dynamicAllocation.maxExecutors, and 
spark.dynamicAllocation.initialExecutors

这些选项可以通过 3 种方式配置到 Spark 应用程序

1.从 Spark 提交 --conf <prop_name>=<prop_value>

spark-submit --master yarn-cluster \
    --driver-cores 2 \
    --driver-memory 2G \
    --num-executors 10 \
    --executor-cores 5 \
    --executor-memory 2G \
    --conf spark.dynamicAllocation.minExecutors=5 \
    --conf spark.dynamicAllocation.maxExecutors=30 \
    --conf spark.dynamicAllocation.initialExecutors=10 \ # same as --num-executors 10
    --class com.spark.sql.jdbc.SparkDFtoOracle2 \
    Spark-hive-sql-Dataframe-0.0.1-SNAPSHOT-jar-with-dependencies.jar

2。 SparkConf

内部 Spark 程序

设置 SparkConf 中的属性,然后用它创建 SparkSessionSparkContext

val conf: SparkConf = new SparkConf()
conf.set("spark.dynamicAllocation.minExecutors", "5");
conf.set("spark.dynamicAllocation.maxExecutors", "30");
conf.set("spark.dynamicAllocation.initialExecutors", "10");
.....

3。 spark-defaults.conf 通常位于 $SPARK_HOME/conf/

如果没有从命令行和代码传递任何配置,请在 spark-defaults.conf 中放置相同的配置以应用于所有 spark 应用程序。

Spark - Dynamic Allocation Confs

我刚刚用 Spark 的动态资源分配做了一个小演示。代码在我的 Github. Specifically, the demo is in this release.