首页 文章

从Hadoop访问只读Google存储桶

提问于
浏览
5

我正在尝试使用 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 Cloud Storage Connector for Hadoop需要空的"directory"对象,如果存储桶是可写的,它可以自己创建;否则就失败了 . 设置 fs.gs.implicit.dir.repair.enable=false 会导致"Error retrieving object"错误 .

是否有可能以某种方式使用只读桶作为MR作业输入?

我使用 gsutil 进行文件上传 . 可以强制在文件上传时创建这些空对象吗?

1 回答

  • 5

    是的,您可以使用只读Google Cloud 端存储分区作为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能够扩展而无需使用任何"placeholder"目录对象 .

    我建议您使用 gsutil 来探索您需要"placeholder"对象的只读存储桶,并且一旦您有一个返回要处理的对象列表的glob表达式,请在 hadoop 命令中使用该glob表达式 .

    你的第二个问题的答案(“_938125_强制在文件上传时创建这些空对象") is currently "否” .

相关问题