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

8.9 KiB
Raw Permalink Blame History

Spark 中 Hadoop/Hive 配置文件指定与优先级文档

1. 概述

在 Spark 与 Hadoop、Hive 集成过程中,需通过多种方式指定配置文件(如 hive-site.xmlcore-site.xmlyarn-site.xml),不同指定方式存在明确的优先级顺序。本文档系统整理 Spark 中 Hadoop/Hive 配置文件的指定方法及优先级规则,帮助开发者解决配置冲突、确保配置生效。

2. Spark 中 Hadoop/Hive 配置文件的指定方式

Spark 支持多种方式指定 Hadoop/Hive 配置文件,适用于不同部署场景(本地模式、集群模式、临时作业等),具体方式如下:

2.1 方式 1通过 --files 选项分发(集群临时配置)

通过 spark-submit--files 选项,将本地或指定路径的 hive-site.xml 等配置文件分发到所有 Executor 工作目录,适用于不同作业需差异化配置的场景,无需修改集群全局配置。

使用示例

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.xmlcore-site.xml 等文件,适用于集群全局统一配置场景。

使用示例

# 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 环境变量)

使用示例

# 将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

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 配置,适用于单次作业临时调整配置,无需修改代码或配置文件。

使用示例

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 专属的全局配置

使用示例

# $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.xmlcore-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 配置解耦