如何从spark-submit命令中分离Spark与Hadoop配置属性?
分离Spark-submit中的Spark配置与Hadoop配置的实用方法
核心方案:基于官方约定的前缀区分
Spark官方明确规定,要将Hadoop配置传递给Spark应用,需在Hadoop原生配置键前添加spark.hadoop.前缀。利用这个规则,我们无需存储所有Hadoop配置项,直接通过字符串前缀即可快速分离两类配置:
- 提取所有
--conf参数:从spark-submit命令中筛选出所有以--conf开头的键值对(格式为key=value)。 - 按前缀分类:
- 键以
spark.hadoop.开头 → 归入hadoop_conf - 其他以
spark.开头的键 → 归入spark_conf
- 键以
示例实现(Python)
def parse_spark_submit_conf(command_str): # 分割命令行参数 args = command_str.split() confs = {} # 提取所有--conf的键值对 i = 0 while i < len(args): if args[i] == "--conf": key, value = args[i+1].split("=", 1) confs[key] = value i += 2 else: i += 1 # 分离spark_conf和hadoop_conf spark_conf = {} hadoop_conf = {} for key, value in confs.items(): if key.startswith("spark.hadoop."): hadoop_conf[key] = value else: spark_conf[key] = value return spark_conf, hadoop_conf # 测试示例命令 command = "/usr/lib/spark/bin/spark-submit --master yarn --class com.benchmark.platform.TPCDSBenchmark --deploy-mode cluster --conf spark.executor.instances=5 --conf spark.dynamicAllocation.minExecutors=2 --conf spark.dynamicAllocation.maxExecutors=5 --conf spark.executor.cores=4 --conf spark.executor.memory=10240M --conf spark.driver.memory=8192M --conf spark.hadoop.hive.metastore.uris=thrift://METASTORE_URI:10016 --conf spark.hadoop.fs.s3a.aws.credentials.provider=org.apache.hadoop.fs.s3a.auth.AssumedRoleCredentialProvider --conf spark.hadoop.fs.s3a.assumed.role.credentials.provider=com.amazonaws.auth.WebIdentityTokenCredentialsProvider --conf spark.hadoop.fs.s3a.assumed.role.arn=arn:aws:iam::ACCOUNT:ROLE s3://JAR_PATH.jar --iterations=2 --queryFilter=q1-v2.4" spark_conf, hadoop_conf = parse_spark_submit_conf(command) print('"spark_conf": {') for key, value in spark_conf.items(): print(f' "{key}": "{value}",') print(' }') print('\n"hadoop_conf": {') for key, value in hadoop_conf.items(): print(f' "{key}": "{value}",') print(' }')
方案可靠性说明
这是Spark官方文档明确推荐的传递Hadoop配置的方式,所有标准Hadoop配置都通过spark.hadoop.前缀映射,不存在歧义。同时无需维护庞大的Hadoop配置列表,避免了配置版本更新带来的同步问题,适配所有Hadoop版本的标准配置。
特殊情况处理
如果遇到极少数自定义的Hadoop配置或非标准传递方式(比如通过自定义前缀),可以单独添加规则匹配,但这类场景在生产环境中极少出现,官方前缀规则足以覆盖绝大多数需求。
内容的提问来源于stack exchange,提问作者Prabhjot
相关产品推荐
相关产品推荐

