使用 hadoop 文件系统访问 google 云存储 api

Accessing google cloud storage using hadoop FileSystem api

在我的机器上,我配置了 hadoop core-site.xml 以识别 gs:// 方案并添加了 gcs-connector-1.2.8.jar 作为 Hadoop 库。我可以 运行 hadoop fs -ls gs://mybucket/ 并获得预期的结果。但是,如果我尝试使用 java 进行模拟:

Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(conf);
FileStatus[] status = fs.listStatus(new Path("gs://mybucket/"));

我在本地 HDFS 的根目录下获取文件,而不是在 gs://mybucket/ 中,但这些文件带有 gs://mybucket 前缀。如果我在获取 fs 之前用 conf.set("fs.default.name", "gs://mybucket"); 修改 conf,那么我可以在 GCS 上看到这些文件。

我的问题是:
1. 这是预期的行为吗?
2. 与 google 云存储客户端 api 相比,使用此 hadoop 文件系统 api 是否有缺点?

关于你的第一个问题,"expected"有疑问,但我想我至少可以解释一下。当使用 FileSystem.get() 时,返回默认文件系统,默认情况下为 HDFS。我的猜测是 HDFS 客户端 (DistributedFileSystem) 有代码自动为文件系统中的所有文件添加 scheme + authority。

而不是使用 FileSystem.get(conf),尝试

FileSystem gcsFs = new Path("gs://mybucket/").getFS(conf)

关于缺点,我可能会争辩说,如果您最终需要直接访问对象存储,那么您将最终编写代码以直接与存储 APIs 交互(并且有不能很好地转换为 Hadoop FS 的东西 API,例如,对象组合、除简单对象覆盖保护之外的复杂对象写入先决条件等)。

我诚然有偏见(在团队中工作),但如果您打算使用来自 Hadoop Map/Reduce、Spark 等的 GCS,Hadoop 的 GCS 连接器应该是一个相当安全的选择。