我正在尝试使用bdutil
脚本从部署在Google Cloud中的Hadoop群集访问Google Storage存储桶。如果存储桶访问是只读的,则会失败。
我在做什么:
使用
部署群集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 source code,似乎Google云端存储连接器for Hadoop需要空的“目录”对象,如果存储桶可写,它可以自行创建;否则就失败了。设置fs.gs.implicit.dir.repair.enable=false
会导致“检索对象时出错”错误。
是否有可能以某种方式使用只读桶作为MR作业输入?
我使用gsutil
进行文件上传。是否可以强制在文件上传时创建这些空对象?
答案 0 :(得分:5)
是的,您可以使用只读Google云端存储分区作为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(*
),Google Cloud Storage Connector for Hadoop能够扩展而无需使用任何"占位符"目录对象。
我建议您使用gsutil
来探索您感兴趣的只读存储桶(因为它不需要"占位符"对象)并且一旦有了一个glob表达式,它返回你想要处理的对象列表,在你的hadoop
命令中使用该glob表达式。
第二个问题的回答("可以gsutil
强制在文件上传时创建这些空对象")目前是#34; no"。