如何在GCP Dataproc Serverless Spark中免容器预装包运行PySpark作业
在GCP Dataproc Serverless Spark中动态安装Python包的解决方案
方案一:作业启动时直接执行pip安装
直接在PySpark脚本里加入包安装逻辑,让驱动节点和每个executor节点自动安装依赖,无需提前打包。
- 操作步骤:
- 在你的PySpark脚本开头添加这段代码:
import subprocess import sys from pyspark.sql import SparkSession def install_deps(): # 按需替换成你需要的包 required_pkgs = ["elasticsearch", "numpy", "xgboost"] subprocess.check_call([sys.executable, "-m", "pip", "install", *required_pkgs]) # 先给驱动节点装包 install_deps() # 初始化Spark会话,触发每个executor节点执行安装 spark = SparkSession.builder.getOrCreate() spark.sparkContext.parallelize(range(1)).foreach(lambda _: install_deps()) - 提交作业时,若使用私有网络,需确保集群能访问PyPI(可配置VPC访问或内部PyPI镜像)。
- 在你的PySpark脚本开头添加这段代码:
方案二:用GCS存预编译wheel包,本地安装
针对大体积包或网络不稳定场景,提前把匹配环境的wheel包传到GCS,作业直接从GCS拉取安装,避免PyPI下载超时。
- 操作步骤:
- 下载适配Dataproc Serverless环境的wheel包(注意Linux x86_64架构,与集群Python版本一致):
pip download elasticsearch numpy xgboost --platform manylinux_x86_64 --only-binary=:all: -d ./deps_wheels - 将wheel文件夹上传到GCS:
gsutil cp -r ./deps_wheels gs://your-bucket-name/pyspark-deps/ - 修改PySpark脚本的安装逻辑:
import subprocess import sys from pyspark.sql import SparkSession def install_from_gcs(): gcs_wheel_path = "gs://your-bucket-name/pyspark-deps/deps_wheels/" # 复制到本地临时目录 subprocess.check_call(["gsutil", "cp", "-r", gcs_wheel_path, "/tmp/local_wheels/"]) # 从本地wheel安装,不走PyPI subprocess.check_call([sys.executable, "-m", "pip", "install", "--no-index", "--find-links=/tmp/local_wheels/", "elasticsearch", "numpy", "xgboost"]) # 驱动和executor都执行安装 install_from_gcs() spark = SparkSession.builder.getOrCreate() spark.sparkContext.parallelize(range(1)).foreach(lambda _: install_from_gcs()) - 确保作业使用的服务账号拥有GCS读权限。
- 下载适配Dataproc Serverless环境的wheel包(注意Linux x86_64架构,与集群Python版本一致):
方案三:用初始化动作脚本批量安装
Dataproc Serverless支持启动时执行初始化脚本,适合需要安装系统依赖(比如xgboost依赖的libgomp)的场景,一次性搞定所有环境配置。
- 操作步骤:
- 编写bash脚本
install_pkgs.sh:#!/bin/bash set -e # 安装系统依赖(按需调整) apt-get update && apt-get install -y libgomp1 # 安装Python包 pip3 install elasticsearch numpy xgboost - 将脚本上传到GCS:
gsutil cp install_pkgs.sh gs://your-bucket-name/init-scripts/ - 提交作业时添加初始化动作参数:
gcloud dataproc batches submit pyspark your_script.py \ --region=your-region \ --initialization-actions=gs://your-bucket-name/init-scripts/install_pkgs.sh \ # 补充其他必要参数,如服务账号、网络配置等 - 确保服务账号拥有GCS读权限和脚本执行权限。
- 编写bash脚本
内容的提问来源于stack exchange,提问作者ash_ketchum12
相关产品推荐
相关产品推荐

