如何配置Spark GCS连接器访问不同项目的多个GCS存储桶?
在单个Spark作业中访问不同GCP项目的多个GCS存储桶
我需要在同一个Spark作业里配置访问来自不同GCP项目(或需要不同凭证)的多个GCS存储桶,目前找到一种临时解决方法,但相信存在更优的纯配置实现方式,作为Spark新手,我肯定遗漏了相关方案。
所有查阅到的文档仅覆盖单个存储桶或同一项目下可通过同一凭证访问的多桶配置,核心问题是如何为不同存储桶绑定对应的访问凭证。
场景详情
GCP Project 1 GCS bucket1 和资源路径path1 通过serviceAccountKey1.json访问 以及 GCP Project 2 GCS bucket2 和资源路径path2 通过serviceAccountKey2.json访问 // 只要所需凭证不同,即使是同一项目下的桶也适用此场景
现有配置的局限性
目前的认证机制只能加载一套配置(一组凭证、单个GOOGLE_APPLICATION_CREDENTIALS环境变量、单个key.json文件等),无法将凭证与特定存储桶绑定。例如以下配置只能访问bucket1,无法为bucket2提供对应凭证:
SparkConf sparkConf = new SparkConf() .setAppName("Spark GCS Example") .setMaster("local[*]") .set("spark.hadoop.fs.AbstractFileSystem.gs.impl", "com.google.cloud.hadoop.fs.gcs.GoogleHadoopFS") .set("fs.gs.auth.type", HadoopCredentialsConfiguration.AuthenticationType.SERVICE_ACCOUNT_JSON_KEYFILE.toString()) .set("fs.gs.auth.service.account.enable","true") .set("fs.gs.auth.service.account.json.keyfile", serviceAccountKeyFile1); ... spark.read().text("gs://bucket1/path1").show(); ... // conf.set("fs...keyfile", serviceAccountKeyFile2) // 无法动态生效 spark.read().text("gs://bucket2/path2").show(); // 无法访问,因为需要不同的凭证
当前临时解决方案
通过自定义AccessTokenProvider类实现凭证切换:
初始化配置
SparkConf sparkConf = new SparkConf() .setAppName("Spark GCS Example") .setMaster("local[*]") .set("spark.hadoop.fs.AbstractFileSystem.gs.impl", "com.google.cloud.hadoop.fs.gcs.GoogleHadoopFS") .set("fs.gs.auth.access.token.provider", ReplacableAccessTokenProvider.class.getName()) .set("fs.gs.auth.type", HadoopCredentialsConfiguration.AuthenticationType.ACCESS_TOKEN_PROVIDER.toString());
访问时切换凭证
ReplacableAccessTokenProvider.jsonFilePath = serviceAccountKeyFile1; spark.read().text("gs://bucket1/path").show(); ReplacableAccessTokenProvider.jsonFilePath = serviceAccountKeyFile2; spark.read().text("gs://bucket2/path").show();
注:以上为粗糙的POC代码,非最终实现
这种方式利用每次访问gs://URL时都会加载凭证的特性,通过自定义Provider切换key.json文件,但存在明显局限性:集群环境下Spark的并行机制可能导致凭证切换冲突,无法预先配置桶与凭证的映射关系,稳定性不足。
期望方案
寻求基于配置的通用Apache Spark解决方案(非Dataproc专属),支持预先定义存储桶与对应凭证的映射,无需动态切换凭证。测试环境为本地模式下的Java Spark。
内容的提问来源于stack exchange,提问作者Sachin Hejip
相关产品推荐
相关产品推荐

