从Hadoop访问只读Google存储桶

Vic*_*lik 5 hadoop google-cloud-storage gsutil google-cloud-platform google-hadoop

我正在尝试使用该bdutil脚本从部署在Google Cloud中的Hadoop群集访问Google Storage存储桶.如果存储桶访问是只读的,则会失败.

我在做什么:

  1. 使用部署集群

    bdutil deploy -e datastore_env.sh
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在主人:

    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)
    
    Run Code Online (Sandbox Code Playgroud)

看看GCS Java源代码,似乎Google Cloud Storage Connector for Hadoop需要空的"目录"对象,如果存储桶是可写的,它可以自己创建; 否则就失败了.设置fs.gs.implicit.dir.repair.enable=false会导致"错误检索对象"错误.

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

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

Pau*_*son 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
Run Code Online (Sandbox Code Playgroud)

这将访问您在上面的示例中提到的相同的只读存储桶.

我们的示例之间的区别在于我以glob(*)结束,Google Cloud Storage Connector for Hadoop能够扩展而无需使用任何"占位符"目录对象.

我建议你用它gsutil来探索你感兴趣的只读桶(因为它不需要"占位符"对象),一旦你有一个glob表达式返回你想要处理的对象列表,使用那个glob表达式在你的hadoop命令中.

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