示例
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:port或thrift://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模式下应该动态分配
八、配置建议优先级
高优先级修正:
-
统一Python版本
-
修正Keytab扩展名
-
确认Hive Metastore配置
中优先级优化:
-
增加executor和driver内存
-
移除硬编码的driver.host
-
根据数据量调整分区数
低优先级调整:
-
日志级别调优
-
添加性能优化参数(如AQE)
-
配置序列化器