几个spark 常用参数

示例

复制代码
from pyspark.sql import SparkSession
from pyspark import SparkConf
from pathlib import Path

spark_params = {
    "spark.executor.memory": "1g",
    "spark.executor.cores": "2",
    "spark.driver.memory": "1g",
    "spark.sql.shuffle.partitions": "200",
    "spark.default.parallelism": "100",
    "spark.driver.bindAddress": "0.0.0.0",
    "spark.log.level": "ERROR",
    "spark.driver.host": "15.xx.xx.xxx",
    "spark.hadoop.hive.sentry.subject": "dfxb",
    "spark.kerberos.principal": "dfxb@TBDS-7EBO5EFO",
    "spark.kerberos.keytab": "path/to/dfxb.keytab",
    "spark.sql.hive.metastore.jdbc.uris": "zk:/15.5.1.xx:22181,15.5.1.xxx:2218",
    "spark.yarn.dist.archives": "hdfs:///tmp/venv-python-3.11.11.tar.gz#py311",
    "spark.pyspark.python": "py311/venv-python-3.11.11/bin/python",
    "spark.pyspark.driver.python": "/path/to/venv-python-3.11.13/bin/python"
}

try:
    conf = SparkConf()
    conf.setAppName("dfxb_app_name")
    conf.setMaster("yarn")
    for key, value in spark_params.items():
        # 确保配置值为字符串类型(Spark配置要求)
        conf.set(key, str(value))
    builder = SparkSession.builder.config(conf=conf)
    builder = builder.enableHiveSupport()
    spark = builder.getOrCreate()
    print(f"SparkSession创建成功")
    print(f"应用名称: {spark.conf.get('spark.app.name')}")
    print("\n验证关键配置: ")
    print(f"执行器内存: {spark.conf.get('spark.executor.memory')}")
    print(f"Shuffle分区数: {spark.conf.get('spark.sql.shuffle.partitions')}")
    print(f"租户标识: {spark.conf.get('spark.hadoop.hive.sentry.subject')}")
    df = spark.sql("select 1 as id, 2 as age")
    df.show()
    spark.createDataFrame([(1,2),(3,4)],['a','b']).show()
except Exception as e:
    print(f"SparkSession创建失败,错误信息: {str(e)}")

一、资源分配参数

1. spark.executor.memory: "1g"

  • 含义:每个Executor进程分配的内存大小

  • 作用:决定每个Executor能处理的数据量,影响任务执行效率

  • 建议:根据数据量调整,通常2-4g起步

  • 注意:不能超过YARN容器内存限制

2. spark.executor.cores: "2"

  • 含义:每个Executor占用的CPU核心数

  • 作用:决定每个Executor并行执行任务的数量

  • 计算公式并行度 = executor数量 × executor.cores

3. spark.driver.memory: "1g"

  • 含义:Driver进程分配的内存

  • 作用:存储元数据、收集结果、广播变量

  • 注意 :如果使用collect()收集大量数据,需要增大此值

4. spark.sql.shuffle.partitions: "200"

  • 含义:Shuffle操作(如groupBy、join)的默认分区数

  • 作用:控制数据重新分区的粒度

  • 影响:太大产生过多小任务,太小数据倾斜

  • 调优:根据数据量调整,一般设置为集群总核心数的2-3倍

5. spark.default.parallelism: "100"

  • 含义:RDD操作的默认并行度

  • 作用:影响reduceByKey、join等操作的并行任务数

  • 关系 :与spark.sql.shuffle.partitions类似,但针对RDD API

二、网络配置参数

6. spark.driver.bindAddress: "0.0.0.0"

  • 含义:Driver绑定的网络接口地址

  • 作用:监听所有网络接口的通信请求

  • 场景:容器化环境或多网卡环境常用

7. spark.driver.host: "15.5.3.212"

  • 含义:Driver的主机IP地址

  • 作用:Executor通过此地址连接Driver

  • 风险:硬编码IP在动态环境中可能失效

  • 建议:YARN模式下通常让Spark自动选择

三、安全认证参数

8. spark.log.level: "ERROR"

  • 含义:Spark日志级别

  • 可选值:ALL, DEBUG, INFO, WARN, ERROR, FATAL, OFF

  • 作用:控制日志输出详细程度

  • 建议:开发用INFO,生产用WARN或ERROR

9. spark.hadoop.hive.sentry.subject: "dfxb"

  • 含义:Hive Sentry的访问主体(Subject)

  • 作用:标识用户身份,用于Sentry权限控制

  • 场景:开启了Sentry权限管理的Hive环境

10. spark.kerberos.principal: "dfxb@TBDS-7EBO5EFO"

  • 含义:Kerberos认证的主体名称

  • 格式用户名@REALM

  • 作用:用于Kerberos身份认证

  • 注意:需与keytab文件匹配

11. spark.kerberos.keytab: "/path/to/dfxb.keyta"

  • 含义:Kerberos密钥表文件路径

  • 作用:存储长期凭证,实现无交互认证

  • 格式:二进制文件,包含加密的凭据

  • 注意 :文件名应为.keytab而非.keyta

四、Hive集成参数

12. spark.sql.hive.metastore.jdbc.uris: "zk:/15.5.1.102:22181,..."

  • 含义:Hive Metastore服务地址

  • 作用:连接Hive元数据库,获取表结构信息

  • 格式zk:/host:portthrift://host:port

  • 分析 :您使用的zk:协议可能是通过ZooKeeper服务发现

  • 注意:通常端口是9083,您的配置中2218/22181看起来是ZooKeeper端口

五、Python环境参数

13. spark.yarn.dist.archives: "hdfs:///tmp/venv-python-3.11.11.tar.gz#py311"

  • 含义:分发到所有节点的归档文件

  • 作用:将Python虚拟环境分发到所有Executor节点

  • 格式HDFS路径#解压目录名

  • 用途:在YARN集群中运行Python代码时使用

14. spark.pyspark.python: "py311/venv-python-3.11.11/bin/python"

  • 含义:Executor节点使用的Python解释器路径

  • 作用:指定Executor执行Python任务的解释器

  • 注意:路径是解压后的相对路径

15. spark.pyspark.driver.python: "/home/isip/venv-python-3.11.13/bin/python"

  • 含义:Driver节点使用的Python解释器路径

  • 作用:Driver本地执行Python代码的解释器

  • 分析:与Executor版本不一致(3.11.11 vs 3.11.13),可能导致兼容性问题

六、参数关系图解

复制代码
Spark应用架构:
┌─────────────────────────────────────────────┐
│              Driver (主控节点)                │
│  - spark.driver.memory: 1g                  │
│  - spark.driver.host: 15.5.x.xxx           │
│  - spark.driver.bindAddress: 0.0.0.0       │
│  - spark.pyspark.driver.python: 3.11.13    │
└─────────────────┬───────────────────────────┘
                  │ 任务分发
                  ▼
┌─────────────────────────────────────────────┐
│           Executor 1 (工作节点)              │
│  - spark.executor.memory: 1g               │
│  - spark.executor.cores: 2                 │
│  - spark.pyspark.python: 3.11.11           │
└─────────────────────────────────────────────┘
                  │
┌─────────────────────────────────────────────┐
│           Executor N (工作节点)              │
│  资源分配同上                                │
└─────────────────────────────────────────────┘

数据传输层:
├─ Shuffle: spark.sql.shuffle.partitions: 200
├─ 并行度: spark.default.parallelism: 100
└─ Hive: spark.sql.hive.metastore.jdbc.uris

安全层:
├─ Kerberos: principal + keytab
├─ Sentry: subject
└─ 日志: spark.log.level: ERROR

七、您的配置存在的潜在问题

复制代码
# 问题1: Python版本不一致
"spark.pyspark.python": "py311/venv-python-3.11.11/bin/python"      # 3.11.11
"spark.pyspark.driver.python": "/path/to/venv-python-3.11.13/bin/python"  # 3.11.13

# 问题2: Hive metastore端口异常
"spark.sql.hive.metastore.jdbc.uris": "zk:/15.5.x.xxx:22181,15.5.x.xxx:2218"
# 通常Hive metastore使用9083端口,您这里看起来是ZooKeeper的端口

# 问题3: 硬编码IP
"spark.driver.host": "15.xx.xx.xxx"  # YARN模式下应该动态分配
复制代码

八、配置建议优先级

高优先级修正

  1. 统一Python版本

  2. 修正Keytab扩展名

  3. 确认Hive Metastore配置

中优先级优化

  1. 增加executor和driver内存

  2. 移除硬编码的driver.host

  3. 根据数据量调整分区数

低优先级调整

  1. 日志级别调优

  2. 添加性能优化参数(如AQE)

  3. 配置序列化器