在 Kubernetes 上使用 ZIP 包为 PySpark 配置自定义 Python 环境 yaml 文件示例
时间: 2025-08-08 16:09:59 浏览: 7
<think>我们正在寻找一个在Kubernetes上为PySpark作业配置自定义Python环境(使用ZIP包)的YAML示例。
根据之前的讨论,我们知道关键点包括:
- 使用`--py-files`指定ZIP包
- 设置`spark.kubernetes.file.upload.path`用于上传文件
- 设置Driver和Executor的环境变量`PYTHONPATH`以包含ZIP包
但是,用户现在要求一个YAML文件示例。注意:在Kubernetes上提交PySpark作业通常使用`spark-submit`命令,而不是直接编写Pod的YAML。
不过,我们可以提供两种方式:
1. 一个使用`spark-submit`命令提交作业的示例,其中包含必要的配置(这些配置最终会转换为Kubernetes资源)。
2. 一个Spark Application的CRD YAML示例(如果用户使用Spark Operator)。
由于用户没有明确说明,我们假设用户使用的是原生的`spark-submit`方式,但YAML通常不是直接提交的方式。不过,我们可以给出一个示例的Pod模板(作为Spark配置的一部分)或者一个完整的Spark Application CRD。
但更常见的是,我们通过`spark-submit`命令传递配置。然而,为了满足用户要求,我们可以提供一个使用Kubernetes原生方式提交PySpark作业的YAML示例,这需要借助Spark Operator。
注意:如果用户没有使用Spark Operator,那么他们可能不会直接使用YAML文件,而是使用`spark-submit`命令。
因此,我们提供两种方案:
方案一:使用spark-submit命令(包含YAML格式的配置选项,但实际是命令行参数)
方案二:使用Spark Operator的SparkApplication YAML(需要安装Spark Operator)
由于用户明确要求YAML文件示例,我们选择方案二。
步骤:
1. 确保已安装Spark Operator。
2. 创建一个SparkApplication资源,其中指定自定义Python环境ZIP包。
以下是一个SparkApplication的YAML示例,它使用一个存储在S3上的ZIP包作为自定义Python环境:
注意:需要替换以下内容:
- `<YOUR_BUCKET>`: 你的S3桶名
- `<PATH_TO_ZIP>`: ZIP包在S3中的路径
- `<YOUR_SPARK_IMAGE>`: 包含unzip工具的自定义Spark镜像(如之前步骤构建的)
- `<PATH_TO_APP>`: 你的PySpark应用代码在S3上的路径(或容器内路径,如果打包在镜像中)
我们假设应用代码也在S3上,因此使用主应用路径为`s3a://...`。
示例YAML:
```
apiVersion: "sparkoperator.k8s.io/v1beta2"
kind: SparkApplication
metadata:
name: pyspark-zip-env-demo
namespace: default
spec:
type: Python
pythonVersion: "3"
mode: cluster
image: "your-registry/spark-zip-ready:3.5.0" # 自定义Spark镜像
imagePullPolicy: Always
mainApplicationFile: "s3a://your-bucket/spark-apps/main.py" # 主应用文件
sparkVersion: "3.5.0"
# 指定Python依赖ZIP包
deps:
pyFiles:
- "s3a://your-bucket/path/to/pyenv.zip" # 这里指定ZIP包
hadoopConf:
# 根据需要配置Hadoop设置,尤其是S3访问
"fs.s3a.access.key": "<YOUR_ACCESS_KEY>"
"fs.s3a.secret.key": "<YOUR_SECRET_KEY>"
"fs.s3a.impl": "org.apache.hadoop.fs.s3a.S3AFileSystem"
"fs.s3a.endpoint": "s3.amazonaws.com"
sparkConf:
"spark.kubernetes.file.upload.path": "s3a://your-bucket/spark-uploads/" # 上传路径
"spark.executorEnv.PYTHONPATH": "/opt/spark/work-dir/pyenv.zip" # 设置Executor的PYTHONPATH
"spark.driverEnv.PYTHONPATH": "/opt/spark/work-dir/pyenv.zip" # 设置Driver的PYTHONPATH
# 资源分配
driver:
cores: 1
coreLimit: "1200m"
memory: "2g"
labels:
version: 3.5.0
serviceAccount: spark
env:
- name: AWS_ACCESS_KEY_ID
value: "<YOUR_ACCESS_KEY>"
- name: AWS_SECRET_ACCESS_KEY
value: "<YOUR_SECRET_KEY>"
volumeMounts:
- name: temp
mountPath: /tmp
executor:
cores: 1
instances: 2
memory: "2g"
labels:
version: 3.5.0
env:
- name: AWS_ACCESS_KEY_ID
value: "<YOUR_ACCESS_KEY>"
- name: AWS_SECRET_ACCESS_KEY
value: "<YOUR_SECRET_KEY>"
volumeMounts:
- name: temp
mountPath: /tmp
volumes:
- name: temp
emptyDir: {}
restartPolicy:
type: Never
```
重要说明:
1. 上述YAML使用了Spark Operator的CRD,因此需要预先安装Spark Operator。
2. 我们通过`deps.pyFiles`指定了ZIP包,Spark Operator会将其下载并分发到Driver和Executor的工作目录(默认为`/opt/spark/work-dir`)。
3. 我们设置了`spark.driverEnv.PYTHONPATH`和`spark.executorEnv.PYTHONPATH`为ZIP包的路径(在工作目录中,文件名与指定的一致)。
4. 我们配置了Hadoop的S3设置,以便访问S3上的ZIP包和应用文件。同时,我们也设置了环境变量`AWS_ACCESS_KEY_ID`和`AWS_SECRET_ACCESS_KEY`(也可以使用其他认证方式,如IAM角色)。
5. 我们假设自定义Spark镜像已经包含unzip工具(如之前Dockerfile所示)。
如果用户没有使用Spark Operator,而是使用原生的`spark-submit`,那么可以通过以下命令提交:
```bash
spark-submit \
--master k8s://https://<k8s-apiserver> \
--deploy-mode cluster \
--name pyspark-zip-env \
--conf spark.kubernetes.container.image=your-registry/spark-zip-ready:3.5.0 \
--conf spark.kubernetes.file.upload.path="s3a://your-bucket/spark-uploads/" \
--conf spark.hadoop.fs.s3a.access.key=<YOUR_ACCESS_KEY> \
--conf spark.hadoop.fs.s3a.secret.key=<YOUR_SECRET_KEY> \
--conf spark.kubernetes.driverEnv.PYTHONPATH="/opt/spark/work-dir/pyenv.zip" \
--conf spark.kubernetes.executorEnv.PYTHONPATH="/opt/spark/work-dir/pyenv.zip" \
--py-files s3a://your-bucket/path/to/pyenv.zip \
s3a://your-bucket/spark-apps/main.py
```
但是,由于用户要求YAML,我们提供了SparkApplication的YAML示例。
注意:在SparkApplication中,我们通过`deps.pyFiles`指定ZIP包,它会被自动处理并添加到`--py-files`中。
另外,如果ZIP包很大,可以考虑提前将ZIP包放入镜像中,这样就不需要每次从S3下载。但这样会失去灵活性。如果选择这种方式,则不需要通过`deps.pyFiles`指定,而是直接将ZIP包放在镜像的工作目录中,然后设置`PYTHONPATH`指向该ZIP包即可。
但根据用户要求,我们使用的是从S3动态加载ZIP包的方式。
最后,请确保在Kubernetes集群中配置了适当的RBAC(如ServiceAccount spark具有运行Spark作业的权限)。
以上示例仅供参考,具体配置需要根据实际环境调整。</think>以下是在 Kubernetes 上为 PySpark 配置自定义 Python 环境(使用 ZIP 包)的完整 YAML 文件示例,结合了最佳实践和关键配置:
### 完整的 SparkApplication YAML 示例
```yaml
apiVersion: "sparkoperator.k8s.io/v1beta2"
kind: SparkApplication
metadata:
name: pyspark-custom-env
namespace: spark
spec:
type: Python
mode: cluster
image: "your-registry/spark-zip-ready:3.5.0" # 包含unzip工具的自定义镜像
imagePullPolicy: Always
mainApplicationFile: "local:///opt/spark-apps/main.py"
sparkVersion: "3.5.0"
# Python 环境配置
deps:
pyFiles:
- "s3a://your-bucket/pyenv.zip" # 自定义Python环境ZIP包
# S3 存储配置
hadoopConf:
"fs.s3a.access.key": "<YOUR_ACCESS_KEY>"
"fs.s3a.secret.key": "<YOUR_SECRET_KEY>"
"fs.s3a.impl": "org.apache.hadoop.fs.s3a.S3AFileSystem"
"fs.s3a.endpoint": "s3.amazonaws.com"
# 核心环境配置
sparkConf:
"spark.kubernetes.file.upload.path": "s3a://your-bucket/spark-uploads/" # ZIP包上传路径[^1]
"spark.executorEnv.PYTHONPATH": "/opt/spark/work-dir/pyenv.zip" # Executor环境变量
"spark.driverEnv.PYTHONPATH": "/opt/spark/work-dir/pyenv.zip" # Driver环境变量
"spark.kubernetes.driverEnv.AWS_ACCESS_KEY_ID": "<YOUR_ACCESS_KEY>"
"spark.kubernetes.driverEnv.AWS_SECRET_ACCESS_KEY": "<YOUR_SECRET_KEY>"
# Driver 配置
driver:
cores: 1
memory: "2g"
serviceAccount: spark
env:
- name: PYTHONPATH
value: "/opt/spark/work-dir/pyenv.zip"
volumeMounts:
- name: config-volume
mountPath: /etc/config
# Executor 配置
executor:
cores: 2
instances: 3
memory: "4g"
env:
- name: PYTHONPATH
value: "/opt/spark/work-dir/pyenv.zip"
volumeMounts:
- name: config-volume
mountPath: /etc/config
# 附加配置
volumes:
- name: config-volume
configMap:
name: pyspark-env-config
restartPolicy:
type: OnFailure
onFailureRetries: 2
onFailureRetryInterval: 10
```
### 配套的 ConfigMap YAML
```yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: pyspark-env-config
namespace: spark
data:
# 环境验证脚本
env_check.py: |
import sys
import os
import json
env_info = {
"python_version": sys.version,
"python_path": sys.path,
"loaded_modules": list(sys.modules.keys()),
"env_vars": dict(os.environ)
}
print(json.dumps(env_info, indent=2))
# 测试关键库
try:
import pandas as pd
print(f"Pandas version: {pd.__version__}")
except ImportError as e:
print(f"Pandas import failed: {str(e)}")
# 环境变量配置
python-path.conf: |
export PYTHONPATH=/opt/spark/work-dir/pyenv.zip:$PYTHONPATH
export PATH=/opt/spark/work-dir/venv/bin:$PATH
```
### 关键配置说明
1. **ZIP 包分发机制**:
```yaml
deps:
pyFiles:
- "s3a://your-bucket/pyenv.zip"
```
- ZIP 包通过 S3 分发到所有节点
- 自动解压到工作目录 `/opt/spark/work-dir`
2. **Python 路径配置**:
```yaml
sparkConf:
"spark.executorEnv.PYTHONPATH": "/opt/spark/work-dir/pyenv.zip"
```
- 确保 Python 解释器能识别 ZIP 包中的模块
- 通过环境变量和 ConfigMap 双重保障
3. **环境验证**:
- 使用 ConfigMap 中的 `env_check.py` 脚本验证环境:
```bash
kubectl exec <driver-pod> -- python /etc/config/env_check.py
```
### 部署步骤
1. 创建 ConfigMap:
```bash
kubectl apply -f pyspark-configmap.yaml
```
2. 提交 Spark 应用:
```bash
kubectl apply -f spark-application.yaml
```
3. 监控日志:
```bash
kubectl logs -f <driver-pod-name> -c spark-kubernetes-driver
```
### 最佳实践建议
1. **ZIP 包优化**:
- 使用 `--exclude` 排除不必要的文件:
```bash
zip -r pyenv.zip . -x "*.pyc" "__pycache__/*" "tests/*"
```
- 压缩后大小控制在 500MB 以内
2. **镜像构建**:
```dockerfile
# Dockerfile
FROM apache/spark:3.5.0
RUN apt-get update && apt-get install -y unzip python3-venv
COPY entrypoint.sh /opt/
ENTRYPOINT ["/opt/entrypoint.sh"]
```
3. **动态依赖加载**:
```yaml
sparkConf:
"spark.kubernetes.pyspark.pythonDependencies": "scikit-learn==1.2.2"
```
对于未包含在 ZIP 中的额外依赖[^1]
阅读全文
相关推荐



















