4

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

  • 修改了核心的site.xml包括fs.gs.impl和 fs.AbstractFileSystem.gs.impl
  • 下载的特性,并参考了 GCS-连接器最新-hadoop2。 jar生成hadoop-env.sh
  • 通过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 Storage?

谢谢!

回答

7

默认情况下,在Google Compute Engine上运行时,gcs连接器针对使用内置服务帐户机制进行了优化,因此为了强制它使用oauth2流,还有一些额外的配置键需要设置;你可以借用gcloud AUTH相同的“CLIENT_ID”和“client_secret”如下,并将它们添加到您的核心-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”之类的大型服务列表)。

确保你还在你的核心-site.xml中设置fs.gs.project.id

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

因为GCS连接器也不会自动推断从相关gcloud身份验证默认的项目。

+0

感谢您的信息丹尼斯!由于实例是使用我自己的gmail帐户创建的,因此如何确定我的ClientID和密钥是什么?我尝试使用我的gmail地址和由“gcloud auth login”生成的验证码,但它给了我一个不同的错误消息:ls:没有FileSystem for方案:gs – 2014-10-01 04:19:14

+0

因此,客户端ID和客户端密钥实际上不归属于gmail帐户,而是附加到*项目*;在这种情况下,“已安装的应用程序”流程意味着“客户端机密”有点用词不当。我提供的文字32555940559.apps.googleusercontent.com/ZmssLNjJy2998hD4CTg2ejr2归因于与Google云端SDK相关联的Google管理的项目,这也是认证流程提到“Google Cloud SDK想要访问......”的原因。它不涉及实际的访问控制或计费,因此将这些值用作最适合的实用目的。 – 2014-10-01 18:59:38

+0

为了使用特定于您的项目的客户端ID和客户端密钥,您将转到您正在使用的项目下的cloud.google.com/console,找到“APIs&auth” - >“Credentials”,找到一个框表示“本机应用程序的客户端ID”,或者如果它不存在,请点击“安装的应用程序”作为类型的“创建新的客户端ID”按钮,然后使用提供的client_id和client_secret。 – 2014-10-01 19:01:31

1

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

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

希望这会有所帮助!

+0

谢谢 - 一定会检查! – 2014-10-01 03:40:07

+0

哦,我遇到的问题是我通过使用我自己的Gmail地址的mesosphere配置来分解实例。是否有办法将服务帐户应用到已创建的实例(查看文档,看起来我只能在实例创建时应用服务帐户)。 – 2014-10-01 04:17:34

+0

我认为使用第二个链接应该能够在创建实例后应用(或配置)服务帐户。 – ssk2 2014-10-01 14:40:17

2

非常感谢您的答案!您的回答引导我进入配置,如Migrating 50TB data from local Hadoop cluster to Google Cloud Storage所述。

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

+0

请不要添加“谢谢”作为答案。相反,投票答案,你觉得有帮助。 – Trikaldarshi 2014-10-01 10:01:32

+0

删除之前请重新阅读我的回答。虽然我感谢两位人士提供他们有用的答案,但我的答案与他们的答案不同。当他们的回答让我感觉到我的时候,我也投了两个回应。 – 2014-10-01 16:02:14