我试图访问谷歌存储桶从Hadoop集群部署在谷歌云使用bdutil
脚本。如果bucket访问是只读的,则失败。
我在做什么:
-
使用
部署集群bdutil deploy -e datastore_env.sh
-
主机:
vgorelik@vgorelik-hadoop-m:~$ hadoop fs -ls gs://pgp-harvard-data-public 2>&1 | head -10 14/08/14 14:34:21 INFO gcs.GoogleHadoopFileSystemBase: GHFS version: 1.2.8-hadoop1 14/08/14 14:34:25 WARN gcsio.GoogleCloudStorage: Repairing batch of 174 missing directories. 14/08/14 14:34:26 ERROR gcsio.GoogleCloudStorage: Failed to repair some missing directories. java.io.IOException: Multiple IOExceptions. java.io.IOException: Multiple IOExceptions. at com.google.cloud.hadoop.gcsio.GoogleCloudStorageExceptions.createCompositeException(GoogleCloudStorageExceptions.java:61) at com.google.cloud.hadoop.gcsio.GoogleCloudStorageImpl.createEmptyObjects(GoogleCloudStorageImpl.java:361) at com.google.cloud.hadoop.gcsio.GoogleCloudStorageImpl.createEmptyObjects(GoogleCloudStorageImpl.java:372) at com.google.cloud.hadoop.gcsio.GoogleCloudStorageImpl.listObjectInfo(GoogleCloudStorageImpl.java:914) at com.google.cloud.hadoop.gcsio.CacheSupplementedGoogleCloudStorage.listObjectInfo(CacheSupplementedGoogleCloudStorage.java:455)
查看GCS Java源代码,似乎Google Cloud Storage Connector for Hadoop需要空的"目录"对象,如果bucket是可写的,它可以自己创建;否则就失败了。设置fs.gs.implicit.dir.repair.enable=false
会导致"Error retrieval object"错误。
是否可以使用只读桶作为MR作业输入?
我使用gsutil
上传文件。可以在文件上传时强制创建这些空对象吗?
是的,您可以使用只读的Google Cloud Storage桶作为Hadoop作业的输入。
例如,我已经运行这个任务很多次了:
./hadoop-install/bin/hadoop
jar ./hadoop-install/contrib/streaming/hadoop-streaming-1.2.1.jar
-input gs://pgp-harvard-data-public/hu0*/*/*/*/ASM/master*
-mapper cgi-mapper.py -file cgi-mapper.py --numReduceTasks 0
-output gs://big-data-roadshow/output
这将访问您在上面的示例中提到的相同的只读桶。
我们的示例之间的区别是,我的示例以glob (*
)结尾,Hadoop的Google云存储连接器能够扩展它,而不需要使用任何"占位符"目录对象。
我建议您使用gsutil
来探索您感兴趣的只读桶(因为它不需要"占位符"对象),一旦您有一个返回您想要处理的对象列表的glob表达式,请在hadoop
命令中使用该glob表达式。
你的第二个问题的答案("gsutil
可以被强制创建这些空对象在文件上传")目前是"否"。