Files
article/spark/spark配置优先级.md
2025-10-14 10:58:35 +08:00

166 lines
8.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Spark 中 Hadoop/Hive 配置文件指定与优先级文档
## 1. 概述
在 Spark 与 Hadoop、Hive 集成过程中,需通过多种方式指定配置文件(如 `hive-site.xml``core-site.xml``yarn-site.xml`),不同指定方式存在明确的优先级顺序。本文档系统整理 Spark 中 Hadoop/Hive 配置文件的指定方法及优先级规则,帮助开发者解决配置冲突、确保配置生效。
## 2. Spark 中 Hadoop/Hive 配置文件的指定方式
Spark 支持多种方式指定 Hadoop/Hive 配置文件,适用于不同部署场景(本地模式、集群模式、临时作业等),具体方式如下:
### 2.1 方式 1通过 `--files` 选项分发(集群临时配置)
通过 `spark-submit``--files` 选项,将本地或指定路径的 `hive-site.xml` 等配置文件分发到所有 Executor 工作目录,适用于**不同作业需差异化配置**的场景,无需修改集群全局配置。
**使用示例**
```bash
spark-submit \
--files /path/to/local/hive-site.xml # 本地配置文件路径会分发到Executor
--class com.example.SparkHiveApp \
./spark-hive-app.jar
```
**特点**
- 配置文件仅对当前提交的作业生效,不影响其他作业
- 自动分发到 YARN/K8s 集群所有节点,避免节点间配置不一致
### 2.2 方式 2通过环境变量 `HADOOP_CONF_DIR` 指定(全局统一配置)
设置 `HADOOP_CONF_DIR` 环境变量,指向包含 Hadoop/Hive 配置文件的目录Spark 会自动加载该目录下的 `hive-site.xml``core-site.xml` 等文件,适用于**集群全局统一配置**场景。
**使用示例**
```bash
# 1. 临时生效(当前终端)
export HADOOP_CONF_DIR=/path/to/hadoop-conf # 目录需包含hive-site.xml等
# 2. 永久生效Linux系统编辑/etc/profile
echo "export HADOOP_CONF_DIR=/path/to/hadoop-conf" >> /etc/profile
source /etc/profile
# 3. 提交作业
spark-submit --class com.example.SparkHiveApp ./spark-hive-app.jar
```
**特点**
- 配置对所有通过该终端提交的 Spark 作业生效
- 需确保所有节点的 `HADOOP_CONF_DIR` 指向一致路径(本地路径或共享存储路径)
### 2.3 方式 3放置到默认目录静态全局配置
Spark 会自动扫描以下默认目录,加载 Hadoop/Hive 配置文件,适用于**静态集群配置**(无需频繁修改):
1. Spark 安装目录的 `conf` 文件夹(`$SPARK_HOME/conf`
2. Hadoop 安装目录的 `conf` 文件夹(依赖 `HADOOP_HOME` 环境变量)
**使用示例**
```bash
# 将hive-site.xml复制到Spark默认conf目录
cp /path/to/hive-site.xml $SPARK_HOME/conf/
# 提交作业(无需额外指定配置路径)
spark-submit --class com.example.SparkHiveApp ./spark-hive-app.jar
```
**特点**
- 配置长期生效,适合集群基础固定配置
- 需手动同步所有节点的默认目录配置文件,避免节点间不一致
### 2.4 方式 4代码中显式配置作业级强制覆盖
在 Spark 应用代码中,通过 `SparkSession.builder().config()``SparkConf` 直接设置 Hadoop/Hive 相关参数,适用于**作业级强制覆盖配置**(优先级最高)。
**使用示例Scala**
```scala
import org.apache.spark.sql.SparkSession
object SparkHiveApp {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder()
.appName("SparkHiveDemo")
.enableHiveSupport()
// 显式设置Hive Metastore地址覆盖配置文件
.config("hive.metastore.uris", "thrift://custom-metastore:9083")
// 显式设置HDFS默认地址覆盖core-site.xml
.config("fs.defaultFS", "hdfs://custom-namenode:8020")
.getOrCreate()
// 业务逻辑
spark.sql("SELECT * FROM test_db.test_table").show()
spark.stop()
}
}
```
**特点**
- 优先级最高,直接覆盖所有配置文件的对应参数
- 配置与代码绑定,适合作业专属配置
### 2.5 方式 5命令行 `--conf` 参数(提交时临时覆盖)
通过 `spark-submit``--conf` 选项,在提交作业时临时指定 Hadoop/Hive 配置,适用于**单次作业临时调整配置**,无需修改代码或配置文件。
**使用示例**
```bash
spark-submit \
--conf hive.metastore.uris=thrift://custom-metastore:9083 \ # 临时覆盖Metastore地址
--conf fs.defaultFS=hdfs://custom-namenode:8020 \ # 临时覆盖HDFS地址
--class com.example.SparkHiveApp \
./spark-hive-app.jar
```
**特点**
- 仅对当前提交的作业生效,灵活性高
- 适合快速测试不同配置参数的效果
### 2.6 方式 6Spark 配置文件(`spark-defaults.conf`
在 Spark 安装目录的 `conf/spark-defaults.conf` 中,通过 `spark.hadoop.` 前缀配置 Hadoop/Hive 参数,适用于**Spark 专属的全局配置**。
**使用示例**
```properties
# $SPARK_HOME/conf/spark-defaults.conf
spark.hadoop.hive.metastore.uris thrift://custom-metastore:9083 # Hive Metastore地址
spark.hadoop.fs.defaultFS hdfs://custom-namenode:8020 # HDFS默认地址
spark.hadoop.yarn.resourcemanager.address yarn-rm:8032 # YARN ResourceManager地址
```
**特点**
- 配置对所有 Spark 作业生效,属于 Spark 层的全局配置
- 需添加 `spark.hadoop.` 前缀Spark 会自动传递给 Hadoop 配置系统
## 3. Hadoop/Hive 配置文件的优先级顺序
Spark 加载 Hadoop/Hive 配置时,遵循**高优先级覆盖低优先级**的规则,具体优先级从高到低如下:
| 优先级排序 | 配置方式 | 说明 |
|------------|------------------------------|----------------------------------------------------------------------|
| 1 | 代码中显式配置 | 通过 `SparkSession.config()``SparkConf` 设置的参数,优先级最高 |
| 2 | 命令行 `--conf` 参数 | `spark-submit` 时通过 `--conf` 指定的参数,覆盖配置文件 |
| 3 | `--files` 分发的配置文件 | 通过 `--files` 分发的 `hive-site.xml` 等,仅对当前作业生效 |
| 4 | `spark-defaults.conf` | Spark 配置文件中带 `spark.hadoop.` 前缀的参数 |
| 5 | `HADOOP_CONF_DIR` 目录配置 | 环境变量指定目录下的 `hive-site.xml``core-site.xml` 等 |
| 6 | Spark 安装目录 `conf` 目录 | `$SPARK_HOME/conf` 下的 Hadoop/Hive 配置文件 |
| 7 | Hadoop 安装目录 `conf` 目录 | `$HADOOP_HOME/conf` 下的默认配置文件,优先级最低 |
| 8 | Hadoop/Hive 内置默认配置 | 源代码中定义的默认配置,仅在所有方式未指定时生效 |
### 3.1 优先级示例验证
假设存在以下配置场景:
1. `HADOOP_CONF_DIR` 下的 `hive-site.xml` 配置 `hive.metastore.uris=thrift://default-ms:9083`
2. 提交作业时通过 `--files /custom/hive-site.xml` 分发,文件中配置 `hive.metastore.uris=thrift://file-ms:9083`
3. 提交作业时通过 `--conf hive.metastore.uris=thrift://cmd-ms:9083` 指定
**最终生效的配置**`thrift://cmd-ms:9083`(遵循优先级 2 > 3 > 5
## 4. 注意事项
1. **集群模式配置同步**:在 YARN/K8s 集群模式下,`--files` 分发的配置文件会自动同步到所有 Executor但需确保 Driver 节点也能访问该文件(本地路径或共享存储路径)。
2. **配置参数冲突**:若不同方式配置了同一参数,以高优先级为准;若未配置,则使用低优先级或内置默认值。
3. **`enableHiveSupport()` 依赖**:若 Spark 应用需集成 Hive如访问 Hive 表),必须在创建 `SparkSession` 时调用 `.enableHiveSupport()`,否则 `hive-site.xml` 配置不生效。
4. **路径一致性**:通过 `HADOOP_CONF_DIR` 或默认目录指定配置时,需确保所有节点的配置文件路径一致(建议使用共享存储如 HDFS 存储配置文件)。
## 5. 常见场景配置方案
| 场景 | 推荐配置方式 | 优势 |
|--------------------------|----------------------------------|----------------------------------------------------------------------|
| 作业专属配置(临时) | `--files` 分发 + 命令行 `--conf` | 不影响全局配置,灵活性高 |
| 集群全局固定配置 | `HADOOP_CONF_DIR` + 默认目录 | 所有作业统一生效,减少重复配置 |
| 代码绑定配置(强制) | 代码中显式配置 | 配置与代码绑定,避免环境依赖问题 |
| Spark 专属全局配置 | `spark-defaults.conf` | 仅对 Spark 作业生效,与 Hadoop 配置解耦 |