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


83

我想在开发/生产环境中更改Spark作业的Typesafe配置。在我看来,完成此任务的最简单方法就是-Dconfig.resource=ENVNAME胜任这份工作。然后Typesafe配置库将为我完成这项工作。

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

编辑:

  • 当我--conf "spark.executor.extraJavaOptions=-Dconfig.resource=dev"spark-submit命令添加选项时,什么也没有发生。
  • Error: Unrecognized option '-Dconfig.resource=dev'.当我传递-Dconfig.resource=devspark-submit命令时,我得到了。

1
请指定您的工作方式。通常,您可以只停留-Dx=y在命令行上。
Daniel Darabos 2015年

@DanielDarabos我从YARN上的spark-submit开始工作。
kopiczko 2015年

@kopiczko您可以接受答案吗?
唐·布兰森

@DonBranson我在这里尝试了所有答案,但在spark 1.6.0上没有一个对我有用!我有这个确切的问题。我似乎无法通过-D参数覆盖Typesafe配置文件中的config属性。
nemo

@kopiczko您是否设法找到解决方案?
nemo

Answers:


58

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

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

19
请注意,--conf 'spark.executor.extraJavaOptions=-Dconfig.resource=app'当spark以客户端模式提交驱动程序时,使用该选项将无效。使用--driver-java-options "-Dconfig.resource=app"代替。请参阅Spark配置
YoYo

2
纱线我用: --files <location_to_your.conf>#application.conf --driver-java-options -Dconfig.file=your.conf#文件中给出了相对于执行者的名字; 因此他们将看到指定的文件为application.conf。
vpipkt

或者spark-submit --driver-java-options='-Dmy.config.path=myConfigValue'
让-阿德里安

@kopiczko这对我不起作用...这解决了您的问题吗?
nemo

早在2015年它就为我工作。ATM我什至不知道它是什么Spark版本。
kopiczko

21

这是我的带有附加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

executor 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对以空格分隔的列表进行传递的格式。
保罗

9

在将-D参数传递给火花执行器和驱动程序时,我遇到了很多问题,我在我的博客文章中添加了对此的引用:“传递参数的正确方法是通过属性“ spark.driver.extraJavaOptions”和“ spark.executor.extraJavaOptions”:我已经传递了log4J配置属性和配置所需的参数(对于驱动程序,我只能传递log4j配置)。例如(写在通过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总体配置的博客文章。我也在Yarn上运行。


请向其中添加更多内容,并避免仅链接的答案。
阿杰·古普塔

7

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

如果以这种方式编写,则后者--conf将覆盖前一个,您可以通过在Environment选项卡下的作业启动后查看sparkUI来验证这一点。

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


我不相信“ --conf”标志是正确的,尽管对于“ --files”也是如此。
半影

我已经在2.1.0和2.1.1上进行了测试。根据sparkUI-> Environment,如果我们使用--conf两次,我只会看到后面的一个。
linehrr

1
我认为您的榜样有缺陷。您将在“ --conf”标志之后显示两个单独且完全不同的键/值(一个执行程序,一个驱动程序)。那些不能互相覆盖。如果您说只有--conf选项的最后一次重复才会生效,那么您是正确的,但您的示例未显示该内容。在spark-submit中:-您可以使用一个--files选项,将使用最后一个(如果有多个),而忽略前一个-您可以使用多个--conf key = value选项,但是如果您重复一个密钥它将取最后一个值
Penumbra

3

我正在通过从另一个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-clustermode并更新注释(如果我没有忘记..:D的话)
acidghost 2015年

3
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 [*]”)


0

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

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'-类 com.test.spark.application.TestSparkJob target / application-0.0.1-SNAPSHOT-jar-with-dependencies.jar产品

我已经尝试过并且对我有用,我建议也通过火花帖子下面的标题非常有用-https: //spark.apache.org/docs/latest/running-on-yarn.html


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 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
nemo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.