PySpark JDBC连接Google Cloud Spanner失败问题求助
Dataproc PySpark通过JDBC连接Cloud Spanner的特殊配置说明
你的常规Spark JDBC配置在连接Cloud Spanner时确实需要额外配置,主要集中在驱动部署、权限设置和连接参数补充这几个方面,具体如下:
1. 确保Spanner JDBC驱动被加载
Dataproc集群默认不包含Cloud Spanner JDBC驱动,必须手动将驱动包加入Spark的类路径:
- 先从Maven仓库下载最新版驱动包(
com.google.cloud:google-cloud-spanner-jdbc),上传到Google Cloud Storage(GCS)存储桶中 - 提交PySpark任务时,通过
--jars参数指定驱动包的GCS路径,示例:spark-submit --jars gs://your-bucket/path/to/google-cloud-spanner-jdbc-x.x.x.jar your-spark-app.py - 或者在创建Dataproc集群时,通过初始化动作将驱动包预安装到集群节点的Spark类路径下
2. 配置Dataproc集群的IAM权限
Dataproc集群使用的服务账号(默认是Compute Engine默认服务账号)需要具备Cloud Spanner的访问权限:
- 给该服务账号添加
roles/spanner.databaseReader角色(如果只需要读取数据),或者更高级的roles/spanner.databaseUser角色 - 操作路径:Google Cloud控制台 -> IAM与管理 -> IAM -> 找到对应服务账号 -> 编辑权限 -> 添加上述角色
3. 补充Spanner专属JDBC连接参数
在你的PySpark代码中,需要添加几个Spanner JDBC驱动要求的参数:
autoCommit=false:Spanner JDBC驱动默认开启自动提交,但Spark JDBC读取流程需要关闭自动提交以避免事务问题- 可选:
fetchsize:设置批量读取的行数,优化大表读取性能,比如fetchsize=1000
修正后的代码示例:
project = "<<PROJECT_ID>>" instance = "<<INSTANCE_ID>>" databases = "<<DATABASE_ID>>" spanner_connection_url = 'jdbc:cloudspanner:/projects/' + project + '/instances/' + instance + '/databases/' + databases df = spark.read \ .format("jdbc") \ .option("url", spanner_connection_url) \ .option("driver", "com.google.cloud.spanner.jdbc.JdbcDriver") \ .option("dbtable", "test_employee") \ .option("autoCommit", "false") \ .option("fetchsize", "1000") \ .load()
4. 版本兼容性检查
确保使用的Spanner JDBC驱动版本与Dataproc集群的Spark版本兼容,建议使用最新稳定版驱动,避免因版本不匹配导致的兼容性问题
内容的提问来源于stack exchange,提问作者Rajnil Guha
相关产品推荐
相关产品推荐

