从Hadoop访问只读Google存储桶

从Hadoop访问只读Google存储桶,hadoop,google-cloud-storage,gsutil,google-cloud-platform,google-hadoop,Hadoop,Google Cloud Storage,Gsutil,Google Cloud Platform,Google Hadoop,我正在尝试使用bdutil脚本从部署在谷歌云中的Hadoop集群访问谷歌存储桶。如果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.GoogleHadoopFil

我正在尝试使用
bdutil
脚本从部署在谷歌云中的Hadoop集群访问谷歌存储桶。如果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)
    
  • 看看,谷歌云存储连接器(GoogleCloudStorage Connector for Hadoop)似乎需要空的“目录”对象,如果bucket是可写的,它可以自己创建这些对象;否则它就失败了。设置fs.gs.implicit.dir.repair.enable=false将导致“错误检索对象”错误

    是否可以以某种方式使用只读存储桶作为MR作业输入


    我使用
    gsutil
    上传文件。是否可以在文件上载时强制创建这些空对象?

    是的,您可以使用只读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可以扩展glob,而无需使用任何“占位符”目录对象

    我建议您使用
    gsutil
    来探索您感兴趣的只读存储桶(因为它不需要“占位符”对象),一旦有了一个glob表达式返回要处理的对象列表,就在
    hadoop
    命令中使用该glob表达式

    第二个问题(“是否可以在文件上载时强制创建这些空对象”
    gsutil
    )的答案目前为“否”