我正在尝试将在Google Cloud VM上运行的Hadoop连接到Google云端存储。我有:
我可以运行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存储空间?
谢谢!
答案 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。
希望这有帮助!