2

在我的机器上,我配置了 hadoopcore-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 conf.set("fs.default.name", "gs://mybucket");,那么我可以在 GCS 上看到文件。

我的问题是:
1.这是预期的行为吗?
2.相对于谷歌云存储客户端api,使用这个hadoop FileSystem api有什么缺点吗?

4

1 回答 1

3

至于你的第一个问题,“预期”是有问题的,但我想我至少可以解释一下。当使用 FileSystem.get() 时,会返回默认的 FileSystem,默认情况下是 HDFS。我的猜测是 HDFS 客户端(DistributedFileSystem)有代码自动为文件系统中的所有文件添加方案 + 权限。

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

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

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

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

于 2015-11-06T01:38:17.057 回答