【问题标题】:How to pass -D parameter or environment variable to Spark job?如何将 -D 参数或环境变量传递给 Spark 作业?
【发布时间】:2015-03-25 20:13:30
【问题描述】:

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

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

编辑:

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

【问题讨论】:

  • 请说明您开始工作的方式。一般来说,你可以在命令行上粘贴-Dx=y
  • @DanielDarabos 我的工作是从 YARN 上的 spark-submit 开始的。
  • @kopiczko 你能接受答案吗?
  • @DonBranson 我在这里尝试了所有答案,但在 spark 1.6.0 上没有一个对我有用!我有这个确切的问题。我似乎无法通过 -D 参数覆盖我的 Typesafe 配置文件中的配置属性。
  • @kopiczko 你找到解决方案了吗?

标签: scala apache-spark


【解决方案1】:

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

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

【讨论】:

  • 请注意,当 spark 以客户端模式提交驱动程序时,使用 --conf 'spark.executor.extraJavaOptions=-Dconfig.resource=app' 选项将不起作用。请改用--driver-java-options "-Dconfig.resource=app"。见Spark Configuration
  • 在我使用的 Yarn 上:--files <location_to_your.conf>#application.conf --driver-java-options -Dconfig.file=your.conf 文件中的 # 给出了相对于执行者的名称;所以他们会看到指定的文件为 application.conf。
  • 或者spark-submit --driver-java-options='-Dmy.config.path=myConfigValue'
  • @kopiczko 这对我不起作用...这解决了您的问题吗?
  • 它在 2015 年对我有用。ATM 我什至不知道它是什么 Spark 版本。
【解决方案2】:

这是我的 spark 程序运行时添加了 java 选项

/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'

希望对您有所帮助。

【讨论】:

  • 这个答案有助于将多个选项的格式显示为 -Dkey=value 对的空格分隔列表。
【解决方案3】:

我在将 -D 参数传递给 spark executors 和驱动程序时遇到了很多问题,我在我的博客文章中添加了一段关于它的引用: " 传递参数的正确方法是通过属性: “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

你可以阅读my blog post了解spark的整体配置。 我也在 Yarn 上运行。

【讨论】:

  • 请添加更多内容,避免仅链接回答。
【解决方案4】:

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

如果你这样写,后面的--conf会覆盖前面的,你可以在Environment标签下的job开始后查看sparkUI来验证这一点。

所以正确的方法是将选项放在同一行下,如下所示: --conf 'spark.executor.extraJavaOptions=-Da=b -Dc=d' 如果你这样做,你会发现你的所有设置都将显示在 sparkUI 下。

【讨论】:

  • 我不相信“--conf”标志是这样的,尽管“--files”是这样的。
  • 我在 2.1.0 和 2.1.1 上测试过。根据 sparkUI->Environment,如果我们使用 --conf 两次,我只会看到后一个。
  • 我认为你的例子有缺陷。您在“--conf”标志(一个执行程序,一个驱动程序)之后显示了两个独立且完全不同的键/值。那些不能互相覆盖。如果您说只有任何 --conf 选项的最后一次重复才会生效,那么您是正确的,但您的示例并未表明这一点。在 spark-submit 中: - 你可以有一个 --files 选项,最后一个(如果有多个)将被使用,而前面的一个被忽略 - 你可以有多个 --conf key=value 选项,但是如果你复制一个键它将取最后一个值
【解决方案5】:

我正在通过从另一个 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 界面的系统属性值。

【讨论】:

  • 这对我有用! (至少对于local[*] 模式)。我会尝试yarn-cluster 模式并更新评论(如果我没有忘记的话.. :D)
【解决方案6】:
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 环境属性文件,
-Dmode=local => 在本地创建 SparkContext - .setMaster("local[*]")

【讨论】:

    【解决方案7】:

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

    spark-submit --master local[2] --conf 'spark.driver.extraJavaOptions=Dlog4j.configuration=file:/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

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

    【讨论】:

      【解决方案8】:

      我原来有这个配置文件:

      my-app {
        environment: dev
        other: xxx
      }
      

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

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

      使用此设置,尽管 Typesafe Config 文档和所有其他答案都说了,但当我像这样启动我的 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
      

      【讨论】:

      • 我正在运行 spark 1.6.0 BTW
      猜你喜欢
      • 2021-01-21
      • 1970-01-01
      • 1970-01-01
      • 2020-09-24
      • 2021-05-29
      • 2017-11-03
      • 1970-01-01
      • 1970-01-01
      • 2013-12-29
      相关资源
      最近更新 更多