5

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

  • 修改 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 存储?

谢谢!

4

3 回答 3

9

默认情况下,在 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 范围(您会注意到新的身份验证流程会询问仅适用于 GCS 范围,而不是像“gcloud auth login”这样的大量服务)。

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

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

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

于 2014-10-01T02:21:31.403 回答
4

非常感谢您的两个回答!您的回答使我了解了将50TB 数据从本地 Hadoop 集群迁移到 Google Cloud Storage中所述的配置。

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

于 2014-10-01T05:07:12.957 回答
1

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

首先,尝试检查该实例是否配置了正确的服务帐户。如果没有,您可以设置它

希望这可以帮助!

于 2014-10-01T01:46:23.507 回答