GCP Dataproc Serverless自定义容器运行PySpark作业无法访问脚本问题
解决Dataproc Serverless自定义容器中访问PySpark脚本的问题
错误原因
你提交命令中使用的file://helloword.py会让Dataproc尝试将指定路径的文件上传到集群临时目录,但你的脚本已经包含在自定义镜像内,这个写法会导致系统误将临时目录当作可执行脚本读取,从而抛出Is a directory的异常。
修复步骤
1. 调整Dockerfile,确保脚本路径与权限正确
当前Dockerfile未指定工作目录,脚本会被复制到根目录,可能引发权限问题。修改后的Dockerfile如下:
# Base image FROM centos:7 # 提前创建spark用户组与用户 RUN groupadd -g 1099 spark RUN useradd -u 1099 -g 1099 -d /home/spark -m spark # 设置spark用户的工作目录 WORKDIR /home/spark # 将脚本复制到工作目录(spark用户拥有读写权限) COPY helloword.py . # 安装工具 RUN yum install -y curl wget procps # 安装tini ENV TINI_VERSION=v0.19.0 RUN curl -fL "https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini" -o /usr/bin/tini \ && chmod +x /usr/bin/tini USER spark
重新构建镜像并推送到Google Container Registry:
docker build -t eu.gcr.io/name_project/image-test . docker push eu.gcr.io/name_project/image-test
2. 修改作业提交命令,指定镜像内的脚本绝对路径
移除file://前缀,直接使用脚本在镜像内的绝对路径(即/home/spark/helloword.py):
gcloud dataproc batches submit pyspark --batch name_batch /home/spark/helloword.py \ --project name_project \ --region europe-west9 \ --version 1.1.19 \ --container-image "eu.gcr.io/name_project/image-test" \ --subnet default \ --service-account service_account
3. 确保脚本是有效的PySpark入口文件
你的helloword.py需要包含可执行的PySpark逻辑,示例如下:
from pyspark.sql import SparkSession if __name__ == "__main__": spark = SparkSession.builder.appName("HelloWorld").getOrCreate() print("Hello World from custom container!") spark.stop()
内容的提问来源于stack exchange,提问作者Sophie192
相关产品推荐
相关产品推荐

