前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住给大家分享一下。点击跳转到网站:https://www.captainai.net/dongkelun
前言
在第二篇文章 Spark 源码 | SparkSubmit 提交流程分析(二) 中,我们分析了 SparkSubmit 的提交流程,其中 doSubmit 方法会调用 parseArguments 解析命令行参数。本文详细介绍参数解析的过程。
版本
Spark 3.2.3
SparkSubmitArguments 概述
SparkSubmitArguments 继承自 SparkSubmitArgumentsParser,用于解析 spark-submit 命令行参数。
1 | // SparkSubmitArguments.scala |
字段定义
1 | // --master MASTER_URL |
解析流程
1. 构造函数调用顺序
1 | // Set parameters from command line arguments |
解析顺序:
- parse(args.asJava) - 从命令行参数设置参数
- mergeDefaultSparkProperties() - 从属性文件填充 sparkProperties
- ignoreNonSparkProperties() - 从 sparkProperties 中移除不以 “spark.” 开头的键
- loadEnvironmentArguments() - 使用 sparkProperties 和环境变量填充缺失的参数
- validateArguments() - 验证参数
2. 解析命令行参数
继承自 SparkSubmitArgumentsParser(继承自 SparkSubmitOptionParser),重写 handle、handleUnknown、handleExtraArgs 三个回调方法处理参数。
SparkSubmitOptionParser parse 方法解析逻辑
parse(List<String> args) 方法的遍历逻辑:
1 | // 遍历所有参数 |
SparkSubmitArguments 重写的方法
1. handle 方法
处理已知的带参数选项,根据 opt(选项名)将 value 赋值给对应的字段。其中 CONF case 会直接将 --conf 的值存入 sparkProperties:
1 | override protected def handle(opt: String, value: String): Boolean = { |
2. handleUnknown 方法
处理未知选项,将第一个未知选项作为 primaryResource(主资源),如 myapp.jar、spark-shell、hdfs:///path/to/app.jar:
1 | override protected def handleUnknown(opt: String): Boolean = { |
3. handleExtraArgs 方法
将解析剩余的应用参数添加到 childArgs:
1 | override protected def handleExtraArgs(extra: JList[String]): Unit = { |
3. 合并默认属性文件
将配置文件(默认 conf/spark-defaults.conf)中的属性合并到 sparkProperties 中。如果用户通过 --conf 指定了相同的配置项,则保留 --conf 的值(优先级更高)。
1 | private def mergeDefaultSparkProperties(): Unit = { |
4. 过滤非 Spark 属性
将 sparkProperties 中不以 spark. 开头的键移除掉。sparkProperties 中的值来自 --conf 和配置文件,不包含环境变量等来源。
1 | private def ignoreNonSparkProperties(): Unit = { |
5. 加载环境变量参数
将命令行未指定的参数从环境变量和 sparkProperties 中补充进来。例如:master 未在命令行指定时,会依次从 spark.master 配置、环境变量 MASTER 中获取。
1 | private def loadEnvironmentArguments(): Unit = { |
优先级:命令行参数 > sparkProperties > 环境变量 > 默认值
6. 参数验证
验证必填参数是否存在以及参数值是否合法。例如:必须指定 primaryResource(主资源),内存/核心数必须为正数,YARN 模式必须设置 HADOOP_CONF_DIR 等。
1 | private def validateSubmitArguments(): Unit = { |
参数优先级
| 来源 | 优先级 |
|---|---|
| 命令行参数 | 1(最高) |
--conf |
2 |
| 配置文件 | 3 |
| 环境变量 | 4 |
| 默认值 | 5(最低) |
总结
SparkSubmitArguments 的解析流程:
- parse - 解析命令行参数
- mergeDefaultSparkProperties - 合并配置文件中的属性
- ignoreNonSparkProperties - 过滤非 spark. 开头的属性
- loadEnvironmentArguments - 用环境变量和 sparkProperties 填充空缺参数
- validateArguments - 验证参数合法性
优先级:命令行 > --conf > 配置文件 > 环境变量 > 默认值
下一次我们将分析 Yarn Client、Yarn Cluster、Standalone Client、Standalone Cluster 模式的详细提交流程。