如何通过ConfigFactory读取本地及GCS存储桶的配置文件?
本地与GCS配置文件通用读取方案
问题根源是ConfigFactory.parseFile仅支持本地文件系统路径,无法直接解析GCS的gs://协议路径。要实现两种场景的通用读取,只需根据路径前缀区分来源,分别处理读取逻辑即可。
实现思路
- 路径类型判断:通过路径是否以
gs://开头,区分本地文件和GCS文件 - 分场景读取:
- 本地路径:沿用原有的
ConfigFactory.parseFile逻辑 - GCS路径:借助GCS Java客户端库读取文件内容,再转为
Config对象
- 本地路径:沿用原有的
- 统一返回结果:两种场景最终返回相同的
Config实例,业务逻辑无需修改
示例代码
首先引入GCS依赖(以sbt为例):
libraryDependencies += "com.google.cloud" % "google-cloud-storage" % "2.34.0"
实现通用读取方法:
import com.typesafe.config.{Config, ConfigFactory} import com.google.cloud.storage.StorageOptions import java.io.{ByteArrayInputStream, File} def loadConfig(pathToFile: String): Config = { if (pathToFile.startsWith("gs://")) { // 处理GCS路径 val storage = StorageOptions.getDefaultInstance.getService val pathSegments = pathToFile.split("/", 4) val bucketName = pathSegments(2) val objectName = pathSegments(3) val blob = storage.get(bucketName, objectName) val configContent = new String(blob.getContent()) ConfigFactory.parseString(configContent) } else { // 处理本地路径 ConfigFactory.parseFile(new File(pathToFile)) } } // 调用示例 val appConf = loadConfig(pathToFile) appConf.getConfigList("params")
注意事项
- 单元测试时传入本地路径,无需配置GCS权限
- Dataproc集群运行时,需确保集群服务账号拥有目标GCS存储桶的
storage.objects.get权限 - 若在Spark环境中,也可通过
SparkContext.wholeTextFiles读取GCS文件内容,再转为配置对象,不过直接使用GCS客户端更轻量
内容的提问来源于stack exchange,提问作者A B
相关产品推荐
相关产品推荐

