Hadoop无法连接到Google云端存储

时间:2014-09-30 23:42:32

标签: google-app-engine hadoop google-cloud-storage google-hadoop

我正在尝试将在Google Cloud VM上运行的Hadoop连接到Google云端存储。我有:

  • 修改了core-site.xml以包含fs.gs.impl和的属性 fs.AbstractFileSystem.gs.impl
  • 已下载并引用了 生成的hadoop-env.sh
  • 中的gcs-connector-latest-hadoop2.jar
  • 使用我的个人帐户通过gcloud auth登录进行身份验证 (而不是服务帐户)。

我可以运行gsutil -ls gs:// mybucket /但没有任何问题,但是当我执行时

  

hadoop fs -ls gs:// mybucket /

我得到了输出:

14/09/30 23:29:31 INFO gcs.GoogleHadoopFileSystemBase: GHFS version: 1.2.9-hadoop2 

ls: Error getting access token from metadata server at: http://metadata/computeMetadata/v1/instance/service-accounts/default/token

想知道我缺少哪些步骤让Hadoop能够看到Google存储空间?

谢谢!

3 个答案:

答案 0 :(得分:7)

默认情况下,在Google Compute Engine上运行时,gcs-connector针对使用内置服务帐户机制进行了优化,因此为了强制它使用oauth2流,需要一些额外的配置键要设置;您可以从gcloud auth借用相同的“client_id”和“client_secret”,如下所示,并将它们添加到您的core-site.xml,同时禁用fs.gs.auth.service.account.enable

<property>
  <name>fs.gs.auth.service.account.enable</name>
  <value>false</value>
</property>
<property>
  <name>fs.gs.auth.client.id</name>
  <value>32555940559.apps.googleusercontent.com</value>
</property>
<property>
  <name>fs.gs.auth.client.secret</name>
  <value>ZmssLNjJy2998hD4CTg2ejr2</value>
</property>

您也可以选择将fs.gs.auth.client.file设置为默认值~/.credentials/storage.json以外的其他内容。

如果您这样做,那么当您运行hadoop fs -ls gs://mybucket时,您会看到一个新提示,类似于“gcloud auth login”提示,您将在其中访问浏览器并再次输入验证码。不幸的是,连接器不能直接使用“gcloud”生成的凭证,即使它可能共享凭证存储文件,因为它明确要求它需要的GCS范围(您会注意到新的auth流程会询问仅适用于GCS范围,而不是像“gcloud auth login”这样的大型服务列表。

确保您还在core-site.xml中设置了fs.gs.project.id

<property>
  <name>fs.gs.project.id</name>
  <value>your-project-id</value>
</property>

因为GCS连接器同样不会自动从相关的gcloud auth推断默认项目。

答案 1 :(得分:3)

非常感谢您的回答!您的回答促使我按照Migrating 50TB data from local Hadoop cluster to Google Cloud Storage中的说明进行了配置。

我能够通过生成新的服务帐户然后应用服务帐户电子邮件地址和p12密钥来利用fs.gs.auth.service.account.key文件。

答案 2 :(得分:1)

看起来实例本身未配置为使用正确的服务帐户(但gsutil命令行实用程序是)。 Hadoop文件系统适配器看起来好像没有提取这些凭据。

首先,try checking如果该实例配置了正确的服务帐户。如果没有,您可以set it up

希望这有帮助!