GCP Dataproc运行PySpark作业无法读取GCS存储桶内SSL pem证书
问题根因
你当前的证书引用方式是错误的,和权限配置无关:
- confluent_kafka底层依赖librdkafka库,该库读取SSL证书时调用的是操作系统原生
fopen接口,该接口仅支持读取节点本地文件系统的文件,无法直接识别GCS专属的gs://协议路径,所以报找不到文件的错误。
修复方案
有两种常用的落地方式,优先选择第一种:
方案1:提交作业时同步证书(推荐)
Dataproc提交作业支持通过--files参数自动将GCS上的依赖文件同步到作业运行的当前工作目录,无需提前修改集群配置:
- 提交作业时新增
--files参数,指定需要同步的三个证书文件:
gcloud dataproc jobs submit pyspark gs://dataproc_kafka_code/code/KafkaProducer.py \ --cluster <你的Dataproc集群名称> \ --region <集群所属区域> \ --files gs://dataproc_kafka_code/code/caroot.pem,gs://dataproc_kafka_code/code/my-bridge-user-crt.pem,gs://dataproc_kafka_code/code/user-with-certs.pem
- 修改代码中的证书路径为文件名即可,无需加前缀:
# 修改后的证书配置 caRootLocation='caroot.pem' certLocation='my-bridge-user-crt.pem' keyLocation='user-with-certs.pem'
方案2:集群初始化时预下载证书
如果有大量作业需要用到该证书,可以通过初始化脚本提前将证书下载到所有集群节点的本地路径:
- 编写初始化脚本
init_certs.sh,内容如下:
#!/bin/bash # 创建证书存放目录 mkdir -p /opt/kafka-certs # 拉取GCS上的所有证书 gsutil cp gs://dataproc_kafka_code/code/*.pem /opt/kafka-certs/ # 授予读权限 chmod 644 /opt/kafka-certs/*.pem
- 将脚本上传到GCS,创建集群时指定该初始化脚本,或给现有集群执行初始化操作。
- 修改代码中的证书路径为节点本地路径:
# 修改后的证书配置 caRootLocation='/opt/kafka-certs/caroot.pem' certLocation='/opt/kafka-certs/my-bridge-user-crt.pem' keyLocation='/opt/kafka-certs/user-with-certs.pem'
权限校验补充
确认Dataproc集群的默认服务账号拥有gs://dataproc_kafka_code存储桶的对象读取权限(storage.objects.get),默认配置下该权限已经存在,如果你手动修改过服务账号权限需要单独补全。
内容的提问来源于stack exchange,提问作者Karan Alang
相关产品推荐
相关产品推荐

