从命令行将SparkConf设置传递给Spark

时间:2019-03-22 16:17:18

标签: azure apache-spark

我正在尝试对Azure Blob存储数据进行火花处理。将凭据传递给它的方法如下:

spark.conf.set(
 "fs.azure.account.key.STORAGE_ACCOUNT.blob.core.windows.net",
 "KEY")

现在,如果我在代码中进行设置,则可以正常工作。但是,我希望从命令行或环境变量传递它,因此代码不需要这样做。 (是的,当然,我可以阅读env vars,并以编程方式设置conf,但我正在寻找一种不必这样做的方法)。

我尝试设置一个名为fs.azure.account.key.STORAGE_ACCOUNT.blob.core.windows.net的环境变量,其值为KEY,并且我也尝试过:

--conf "fs.azure.account.key.STORAGE_ACCOUNT.blob.core.windows.net=KEY"

,但似乎只有在属性以“ spark”开头时,spark才会拾取它们。有人知道如何通过环境或命令行设置运行时属性吗?

2 个答案:

答案 0 :(得分:1)

SparkConf源代码中,用于从系统属性加载配置的函数包含以下内容

for ((key, value)<- Utils.getSystemProperties if key.startsWith("spark.")) { set(key, value, silent) }

如您所见,它仅设置以“ spark”开头的属性。这与您的观察一致。您可以更改此代码以消除此限制并重新编译spark,以便可以选择从命令行传递的配置。

答案 1 :(得分:0)

例如,您可以通过java命令传递参数

  private void parseArgs(String[] args) throws org.apache.commons.cli.ParseException {
    DefaultParser defaultParser = new DefaultParser();
    options = new Options();
    options.addOption("h", "help");
    options.addOption(Option.builder()
                            .longOpt("profile")
                            .desc("profile to run. (dev|azure|prod)")
                            .hasArg()
                            .build());
    options.addOption(Option.builder()
                            .longOpt("azure_storage_key")
                            .desc("azure storage key")
                            .hasArg()
                            .build());
    options.addOption(Option.builder()
                            .longOpt("develop")
                            .desc("set the environment for development.")
                            .build());
    commandLine = defaultParser.parse(options, args, true);

}

所以当您收到

if (commandLine.hasOption("azure_storage_key")) {
        String key = commandLine.getOptionValue("azure_storage_key", "key");
        spark.conf.set("fs.azure.account.key.STORAGE_ACCOUNT.blob.core.windows.net",key)
}