我正在尝试对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才会拾取它们。有人知道如何通过环境或命令行设置运行时属性吗?
答案 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)
}