Spark Configuration(Spark配置)

本文深入探讨了Spark系统中用于配置的三个关键位置:SparkProperties、Spark属性和Sparkshell/spark-submit工具。阐述了如何通过配置SparkConf对象、环境变量、log4j.properties等实现灵活的配置,以及如何在运行时动态加载配置。详细介绍了Spark属性的用途、默认值和常用属性设置,同时讨论了如何使用Sparkshell和spark-submit工具动态加载配置。此外,文章还提供了关于查看和验证配置的方法,以及如何利用Spark的内置属性和环境变量进行系统优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spark提供了三个位置来配置系统:

  • Spark Properties(Spark 属性)控制大多数 application 参数,并且可以使用 SparkConf 对象设置
  • 通过配置每个节点上的 conf/spark-env.sh 脚本,可以配置每台机器的环境变量,如 ip 地址
  • 日志可以通过 log4j.properties 配置

Spark 属性

Spark属性控制 application 绝大多数配置并可为每个 application 单独配置。这些属性可以被在传给你的 SparkContext 的 SparkConf上直接设置。SparkConf 允许你配置一些常用属性(如 master URL和application name),和通过 set() 方法设置键值对效果一样。你可以像下面例子一样初始化一个 application:

val conf = new SparkConf()
             .setMaster("local")
             .setAppName("CountingSheep")
             .set("spark.executor.memory", "1g")
val sc = new SparkContext(conf)

动态加载 Spark 属性

有些情况下,你可能想避免硬编码某些 SparkConf 配置。例如,如果你想用不同的 masters 或不同的内存数执行相同的程序。Spark 允许你简单地创建一个空得 conf。

val sc = new SparkContext(new SparkConf())

然后,你可以在运行时提供参数:

./bin/spark-submit --name "My app" --master local[4] --conf spark.shuffle.spill=false 
  --conf "spark.executor.extraJavaOptions=-XX:+PrintGCDetails -XX:+PrintGCTimeStamps" myApp.jar

Spark shell和 spark-submit 工具支持两种方式来动态加载配置。第一种是命令行选项,如上述的 --master。spark-submit 通过 --conf 标志可以设置任何 spark 属性。运行 ./bin/spark-submit --help 会列出这些选项的完整列表。

bin/spark-submit 也会读取并加载 conf/spark-defaults.conf。spark-defaults.conf 中每行包含一个由空格风格的key value对。如:

spark.master            spark://5.6.7.8:7077
spark.executor.memory   512m
spark.eventLog.enabled  true
spark.serializer        org.apache.spark.serializer.KryoSerializer

任何被指定为标记或在属性文件中的值将被传给 application 并和通过 SparkConf 指定的值合并。通过 SparkConf 直接指定的属性具有最高优先级,然后是传给 spark-submit 或 spark-shell 的标记,最后是 spark-defaults.conf 中的配置。

查看 Spark 属性

application 页面 http://driver:4040 在“Environment”标签页列出了 Spark 属性。这是一个非常有用的地方让你确认你是否正确配置了属性。只有通过 spark-defaults.conf 或 SparkConf 明确指定的属性才会出现在页面上。所有其他的配置,你可以假定使用了默认值。

可用属性

大部分属性有合理的默认值。以下为最常用的属性设置:

Application 属性
属性名默认值含义
spark.app.name(none)application名,将会出现在页面和日志中
spark.master(none)集群管理地址(YARN 模式下为 ResourceManager 地址)
spark.executor.memory512m每个 executor 进程使用的内存数,和 JVM 内存描述相同(如 512m、2g)
spark.serializerorg.apache.spark.serializer.JavaSerializer用来序列化通过网络传输或需要缓存的对象的类。默认使用 Java 序列化对于所有可序列化的 Java 对象有效,但非常慢。如果需要更快的,建议使用org.apache.spark.serializer.KryoSerializer并配置 Kryo 序列化。可以是任何 org.apache.spark.Serializer 的子类
spark.kryo.registrator(none)如果使用 Kryo 序列化,设置该类来向 Kryo 注册你的自定义类。该类需要继承 KryoRegistrator
spark.local.dir/tmp保存临时文件的目录。包括 map 的输出文件、保存在磁盘的 RDD。这应是一个速度很快的本地磁盘。可以是逗号分隔的多个不同的目录。注意,在 Spark 1.0 及之后的版本中,该值会被 SPARK_LOCAL_DIRS(Standalone, Mesos)或LOCAL_DIRS (YARN) 环境变量覆盖
spark.logConffalse当一个 SparkContext 启动,以 INFO 等级记录有效的 SparkConf

除这些,下面的属性也可以使用并在某些情况下有用。


运行时环境
属性名默认值含义
spark.executor.memory512m每个 executor 进程使用的内存数,和 JVM 内存描述相同(如 512m、2g)
spark.executor.extraJavaOptions(none)要传给 executors 的额外的 JVM 选项字符串。注意,使用该选项设置 Spark 属性或堆大小是非法的。Spark 属性应用 SparkConf 或 spark-defaults 设置。配置文件和 spark-submit 脚本配合使用。堆大小可由 spark.executor.memory 设置
spark.executor.extraClassPath(none)添加到 executors classpath的额外 classpath 条目。用户通常不需要设置该选项
spark.executor.extraLibraryPath(none)当启动 executor JVM的指定的库路径
spark.python.worker.memory512m每个 python workder 进程聚合时的内存数。如果聚合过程中使用的内存超过了这个值,会将数据刷入磁盘中
spark.executorEnv.[EnvironmentVariableName](none)添加由 EnvironmentVariableName 指定的环境变量至 executor 进程。用户可以指定多个该选型以设置多个环境变量
spark.mesos.executor.homedriver side SPARK_HOME

Shuffle 行为
属性名默认值含义
spark.shuffle.consolidateFilesfalse如果设为“true”,shuffle过程中会创建中间文件。创建少量文件可以提高整个文件系统在处理大量 reduce task 时的表现。当使用 ext4 或 xfs 文件系统时,建议使用 “true”。在 ext3 上,由于文件系统的局限性,该选项可能会降低8核以上机器的表现

未完待续~


Spark 用户界面
属性名默认值含义
spark.ui.port4040你的 application 的“仪表盘”端口,将显示内存和负载数据
spark.ui.retainedStages1000在垃圾回收前 Spark UI记住的 stages 的个数
spark.ui.killEnabledtrue是否允许从 web ui 上结束 stage 和对应的 job
spark.eventLog.enabledfalse是否记录 Spark 事件,对于在 application 完成后重建 web ui 是有用的
spark.eventLog.compressfalse是否压缩记录的事件,如果 spark.eventLog.enabled 为 true
spark.eventLog.dirfile:///tmp/spark-eventsSpark event 日志存放的基本目录,如果 spark.eventLog.enabled 为 true。在该基本目录中,Spark 为每个 application 创建一个子目录。用户会希望将这设为一个统一目录,比如一个 HDFS 目录以便于 history 文件可以被 history 服务读取

压缩和序列化

未完待续


Executor 行为
属性名默认值含义
spark.default.parallelism本地模式:本地机器的内核数;Mesos细粒度模式:8;其他:所有 executor 节点上的核心总数或2,取更大的一个5

未完待续


调度
属性名默认值含义
spark.task.cpus1每个 task 分配的核心数
spark.task.maxFailures4在放弃 job 前每个 task 最大失败次数。应大于等于 1。重试次数为该值减 1
spark.scheduler.modeFIFO提交至同一个 SparkContext 的 job 之间的调度模式。可以设为 FAIR 来使用公平分享代替一个接一个的 FIFO。对于多用户服务有用
spark.cores.max未设置当运行在 standalone 或 Mesos 模式时,为每个 application 请求的最大 CPU 核心数时跨越整个集群的,而不是来自某台机器。如果未设置,standalone 模式下为 spark.deploy.defaultCores 的值, Mesos 模式下为无穷大(即所有可用的核心)
spark.speculationfalse如果设为 “true”,表示一个或多个 task 在一个 stage 执行缓慢将被重启

环境变量

通过环境变量可以设置明确的 Spark 设置,即读取 conf/spark-env.sh 脚本。在 Standalone 和 Mesos 模式下,这个文件可以给机器具体的信息,如主机名。
注意,当安装完 Spark 之后 conf/spark-env.sh 并不存在,你需要拷贝 conf/spark-env.sh.template 来创建。确定你执行了拷贝动作。
以下变量可以在 spark-env.sh 中设定:

环境变量含义
JAVA_HOMEJava 安装路径(如果没有在你的 ‘PATH’ 中指定)
PYSPARK_PYTHON为 PySpark 准备的 Python 使用的可执行的二进制文件
SPARK_LOCAL_IP机器要绑定的 ip 地址
SPARK_PUBLIC_DNS你的 Spark 程序将要通知其他机器的主机名

由于 spark-env.sh 是一个 shell 脚本,选项可以以更编程化的方式设置。如,你也许会通过查找网络接口来计算 SPARK_LOCAL_IP。

日志配置

Spark 使用 log4j 记录日志。你可以通过在 conf 目录下添加一个 log4j.properties 来配置。一种可行的方式是从 log4j.properties.template 拷贝

### Spark 配置文件示例与参数说明 Spark配置可以通过多种方式进行设置,包括通过命令行参数、代码中显式设置以及使用外部配置文件。以下是一个典型的 Spark 配置文件示例及其参数说明。 #### 1. 配置文件示例 以下是 `spark-defaults.conf` 文件的示例内容: ```properties # 设置 Spark 应用程序的默认名称 spark.app.name=MySparkApp # 设置驱动程序内存大小 spark.driver.memory=4g # 设置每个执行器的内存大小 spark.executor.memory=2g # 设置每个执行器的核心数 spark.executor.cores=1 # 设置应用运行在 YARN 上,并以集群模式部署 spark.master=yarn spark.submit.deployMode=cluster # 设置日志级别 spark.log.level=WARN # 设置 Shuffle 分区数 spark.sql.shuffle.partitions=200 # 启用动态分配 spark.dynamicAllocation.enabled=true # 动态分配初始执行器数量 spark.dynamicAllocation.initialExecutors=2 # 动态分配最小执行器数量 spark.dynamicAllocation.minExecutors=1 # 动态分配最大执行器数量 spark.dynamicAllocation.maxExecutors=10 # Hive 支持相关配置 spark.hadoop.hive.exec.dynamic.partition=true spark.hadoop.hive.exec.dynamic.partition.mode=nonstrict ``` #### 2. 参数说明 - **`spark.app.name`**: 指定 Spark 应用程序的名称[^1]。 - **`spark.driver.memory`**: 驱动程序所需的内存量,单位为 GB 或 MB[^2]。 - **`spark.executor.memory`**: 每个执行器所需的内存量,单位为 GB 或 MB[^2]。 - **`spark.executor.cores`**: 每个执行器可用的核心数[^1]。 - **`spark.master`**: 指定 Spark 应用程序运行的主节点类型(如 `local`、`yarn`、`mesos` 等)。 - **`spark.submit.deployMode`**: 指定部署模式(`client` 或 `cluster`)。 - **`spark.log.level`**: 设置日志级别,常见的值有 `INFO`、`WARN` 和 `ERROR`[^3]。 - **`spark.sql.shuffle.partitions`**: 设置 Shuffle 操作后的分区数,默认值为 200。 - **`spark.dynamicAllocation.enabled`**: 是否启用动态资源分配[^2]。 - **`spark.dynamicAllocation.initialExecutors`**: 动态分配时的初始执行器数量[^2]。 - **`spark.dynamicAllocation.minExecutors`**: 动态分配时的最小执行器数量。 - **`spark.dynamicAllocation.maxExecutors`**: 动态分配时的最大执行器数量。 - **`spark.hadoop.hive.exec.dynamic.partition`**: 启用 Hive 动态分区[^4]。 - **`spark.hadoop.hive.exec.dynamic.partition.mode`**: 设置 Hive 动态分区模式为非严格模式。 #### 3. 使用自定义配置文件 如果需要在代码中加载自定义配置文件,可以参考以下代码示例: ```scala object CustomConfigExample { def main(args: Array[String]): Unit = { // 创建 SparkSession 并加载自定义配置文件 val spark = SparkSession.builder() .appName("CustomConfigExample") .config("spark.sql.shuffle.partitions", "500") // 示例:设置 Shuffle 分区数 .config("spark.hadoop.hive.exec.dynamic.partition", "true") // 启用 Hive 动态分区 .enableHiveSupport() .getOrCreate() // 加载自定义配置文件 val configPath = args(0) // 假设第一个参数是配置文件路径 val config = spark.sparkContext.textFile(configPath).collect().mkString("\n") // 打印加载的配置内容 println(s"Loaded configuration:\n$config") // 示例操作:读取 Hive 表数据 val df = spark.sql("SELECT * FROM my_hive_table") df.show() // 停止 SparkSession spark.stop() } } ``` 上述代码展示了如何在 Spark 中加载自定义配置文件并结合 Hive 支持进行操作[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值