如何将-D参数或环境变量传递给Spark作业?

时间:2015-01-27 09:06:18

标签: scala apache-spark

我想在dev / prod环境中更改Spark作业的Typesafe config。在我看来,实现这一目标的最简单方法是将-Dconfig.resource=ENVNAME传递给工作。然后Typesafe配置库将为我完成这项工作。

有没有办法直接将该选项传递给作业?或者也许有更好的方法在运行时更改作业配置?

修改

  • 当我向 spark-submit 命令添加--conf "spark.executor.extraJavaOptions=-Dconfig.resource=dev"选项时,没有任何反应。
  • 当我将Error: Unrecognized option '-Dconfig.resource=dev'.传递给 spark-submit 命令时,我得到-Dconfig.resource=dev

8 个答案:

答案 0 :(得分:48)

更改spark-submit命令行,添加三个选项:

  • --files <location_to_your_app.conf>
  • --conf 'spark.executor.extraJavaOptions=-Dconfig.resource=app'
  • --conf 'spark.driver.extraJavaOptions=-Dconfig.resource=app'

答案 1 :(得分:17)

这是我的附加java选项

运行的spark程序
/home/spark/spark-1.6.1-bin-hadoop2.6/bin/spark-submit \
--files /home/spark/jobs/fact_stats_ad.conf \
--conf spark.executor.extraJavaOptions=-Dconfig.fuction.conf \
--conf 'spark.driver.extraJavaOptions=-Dalluxio.user.file.writetype.default=CACHE_THROUGH -Dalluxio.user.file.write.location.policy.class=alluxio.client.file.policy.MostAvailableFirstPolicy -Dconfig.file=/home/spark/jobs/fact_stats_ad.conf' \
--class jobs.DiskDailyJob \
--packages com.databricks:spark-csv_2.10:1.4.0 \
--jars /home/spark/jobs/alluxio-core-client-1.2.0-RC2-jar-with-dependencies.jar \
--driver-memory 2g \
/home/spark/jobs/convert_to_parquet.jar \
AD_COOKIE_REPORT FACT_AD_STATS_DAILY | tee /data/fact_ad_stats_daily.log
你可以看到

自定义配置文件  --files /home/spark/jobs/fact_stats_ad.conf

执行器java选项  --conf spark.executor.extraJavaOptions=-Dconfig.fuction.conf

驱动程序java选项。  --conf 'spark.driver.extraJavaOptions=-Dalluxio.user.file.writetype.default=CACHE_THROUGH -Dalluxio.user.file.write.location.policy.class=alluxio.client.file.policy.MostAvailableFirstPolicy -Dconfig.file=/home/spark/jobs/fact_stats_ad.conf'

希望它有所帮助。

答案 2 :(得分:9)

我将-D参数传递给spark执行器和驱动程序时遇到了很多问题,我在博客文章中添加了一个引用: &#34; 传递参数的正确方法是通过属性: “spark.driver.extraJavaOptions”和“spark.executor.extraJavaOptions”: 我已经传递了log4J配置属性和配置所需的参数。 (对于驱动程序,我只能传递log4j配置)。 例如(写在使用“-properties-file”的spark-submit中传递的属性文件中): “

spark.driver.extraJavaOptions –Dlog4j.configuration=file:///spark/conf/log4j.properties -
spark.executor.extraJavaOptions –Dlog4j.configuration=file:///spark/conf/log4j.properties -Dapplication.properties.file=hdfs:///some/path/on/hdfs/app.properties
spark.application.properties.file hdfs:///some/path/on/hdfs/app.properties

您可以阅读有关spark的整体配置的my blog post。 我也在Yarn上跑。

答案 3 :(得分:6)

--files <location_to_your_app.conf> --conf 'spark.executor.extraJavaOptions=-Dconfig.resource=app' --conf 'spark.driver.extraJavaOptions=-Dconfig.resource=app'

如果以这种方式书写,后面的--conf将覆盖前一个Environment,您可以通过在 --conf 'spark.executor.extraJavaOptions=-Da=b -Dc=d' 标签下开始作业后查看sparkUI来验证这一点。

所以正确的方法是将选项放在同一行下,如下所示: sudo waagent –deprovision 如果你这样做,你会发现你的所有设置都将显示在sparkUI下。

答案 4 :(得分:2)

我通过从另一个Scala应用程序中启动的spark-submit命令启动我的Spark应用程序。所以我有一个类似

的数组
Array(".../spark-submit", ..., "--conf", confValues, ...)

其中confValues是:

  • 用于yarn-cluster模式:
    "spark.driver.extraJavaOptions=-Drun.mode=production -Dapp.param=..."
  • 用于local[*]模式:
    "run.mode=development"

但是,要了解(不)转义引号和空格的位置有点棘手。您可以在Spark Web界面中查看系统属性值。

答案 5 :(得分:1)

spark-submit --driver-java-options "-Denv=DEV -Dmode=local" --class co.xxx.datapipeline.jobs.EventlogAggregator target/datapipeline-jobs-1.0-SNAPSHOT.jar

上面的命令对我有用:

-Denv=DEV =>读取DEV env属性文件,并且
-Dmode=local =>以在本地创建SparkContext-.setMaster(“ local [*]”)

答案 6 :(得分:0)

使用下面命令中的方法,可能对您有所帮助 -

  

spark-submit --master local [2] - conf   'spark.driver.extraJavaOptions = Dlog4j.configuration =文件:/tmp/log4j.properties'    - conf'spark.executor.extraJavaOptions = -Dlog4j.configuration = file:/tmp/log4j.properties'   --class com.test.spark.application.TestSparkJob target / application-0.0.1-SNAPSHOT-jar-with-dependencies.jar prod

我已经尝试过并且它对我有用,我建议也要经过火花贴下面的标题,这真的很有帮助 - https://spark.apache.org/docs/latest/running-on-yarn.html

答案 7 :(得分:0)

我最初有这个配置文件:

my-app {
  environment: dev
  other: xxx
}

这就是我在我的spark scala代码中加载配置的方式:

val config = ConfigFactory.parseFile(File<"my-app.conf">)
  .withFallback(ConfigFactory.load())
  .resolve
  .getConfig("my-app")

使用此设置,尽管Typesafe配置文档和所有其他答案都说明了,当我启动我的spark工作时,系统属性覆盖对我没有用:

spark-submit \
  --master yarn \
  --deploy-mode cluster \
  --name my-app \
  --driver-java-options='-XX:MaxPermSize=256M -Dmy-app.environment=prod' \
  --files my-app.conf \
  my-app.jar

要使其工作,我必须将配置文件更改为:

my-app {
  environment: dev
  environment: ${?env.override}
  other: xxx
}

然后像这样启动它:

spark-submit \
  --master yarn \
  --deploy-mode cluster \
  --name my-app \
  --driver-java-options='-XX:MaxPermSize=256M -Denv.override=prod' \
  --files my-app.conf \
  my-app.jar