Hadoop не может подключиться к Google Cloud Storage

Я пытаюсь подключить Hadoop, работающий на виртуальной машине Google Cloud, к облачному хранилищу Google. У меня есть:

  • Изменен core-site.xml, чтобы включить свойства fs.gs.impl и fs.AbstractFileSystem.gs.impl
  • Загрузил файл gcs-connector-latest-hadoop2.jar и сделал ссылку на него в сгенерированном файле hadoop-env.sh.
  • аутентифицирован через gcloud auth login, используя мою личную учетную запись (вместо учетной записи службы).

Я могу запустить 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?

Спасибо!


person Denny Lee    schedule 30.09.2014    source источник


Ответы (3)


По умолчанию gcs-коннектор при работе в Google Compute Engine оптимизирован для использования встроенных механизмов учетной записи службы, поэтому, чтобы заставить его использовать поток oauth2, необходимо задать несколько дополнительных ключей конфигурации. ; вы можете заимствовать те же client_id и client_secret из gcloud auth следующим образом и добавить их в свой 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.

person Dennis Huo    schedule 01.10.2014
comment
Спасибо за информацию, Деннис! Поскольку экземпляр был создан с использованием моей учетной записи Gmail, как мне определить, какой у меня ClientID и секретный ключ? Я попытался использовать свой адрес gmail и код подтверждения, сгенерированный gcloud auth login, но он дал мне другое сообщение об ошибке: ls: No FileSystem for scheme: gs - person Denny Lee; 01.10.2014
comment
Таким образом, идентификатор клиента и секрет клиента на самом деле не привязаны к учетной записи Gmail, а скорее привязаны к проекту; в этом случае установленный поток приложений означает, что секрет клиента немного неверен. Литерал 32555940559.apps.googleusercontent.com/ZmssLNjJy2998hD4CTg2ejr2, который я предоставил, отнесен к управляемому Google проекту, связанному с Cloud SDK, и является причиной того, что поток аутентификации упоминает, что Google Cloud SDK хочет получить доступ ... Он не получает участвуют в фактическом контроле доступа или выставлении счетов, поэтому использование этих значений как есть подходит для большинства практических целей. - person Dennis Huo; 01.10.2014
comment
Чтобы использовать идентификатор клиента и секрет клиента, характерные для вашего проекта, вы должны перейти на cloud.google.com/console в рамках проекта, который вы используете, найти API и аутентификацию - ›Учетные данные, найти поле с надписью Client ID для собственное приложение или, если оно не существует, нажмите кнопку Создать новый идентификатор клиента с установленным приложением в качестве типа, а затем используйте предоставленные client_id и client_secret там. - person Dennis Huo; 01.10.2014
comment
Большое спасибо, Деннис! Очень полезный контекст! - person Denny Lee; 02.10.2014
comment
Я внес вышеупомянутые изменения, но все еще получаю указанную ниже ошибку. py4j.protocol.Py4JJavaError: произошла ошибка при вызове o21.partitions. : java.io.IOException: Ошибка при получении токена доступа с сервера метаданных по адресу: метаданные / computeMetadata / v1 / instance / service-accounts / default /. Как от этого избавиться? - person Ravi Ranjan; 13.09.2017

Большое спасибо за оба ответа! Ваши ответы привели меня к конфигурации, как указано в Перенос данных объемом 50 ТБ из локального кластера Hadoop в Google Cloud Storage.

Мне удалось использовать файл fs.gs.auth.service.account.keyfile, создав новую учетную запись службы, а затем применив адрес электронной почты учетной записи службы и ключ p12.

person Denny Lee    schedule 01.10.2014
comment
Пожалуйста, не добавляйте "спасибо" в ответ. Вместо этого проголосуйте за ответы, которые считаете полезными. - person Trikaldarshiii; 01.10.2014
comment
Пожалуйста, перечитайте мой ответ, прежде чем удалять его. Хотя я поблагодарил обоих за полезные ответы, мой ответ отличается от их. Я также проголосовал за оба ответа, поскольку их ответы привели меня к моему. - person Denny Lee; 01.10.2014

Похоже, что сам экземпляр не настроен для использования правильной учетной записи службы (но утилита командной строки gsutil есть). Адаптер файловой системы Hadoop, похоже, не использует эти учетные данные.

Сначала попробуйте проверить, настроен ли этот экземпляр с правильной учетной записью службы. В противном случае вы можете настроить его.

Надеюсь это поможет!

person ssk2    schedule 01.10.2014
comment
Спасибо - обязательно проверю! - person Denny Lee; 01.10.2014
comment
О, проблема, с которой я сталкиваюсь, заключается в том, что я запускал экземпляры через конфигурацию мезосферы, которая использовала мой собственный адрес Gmail. Есть ли способ применить учетную запись службы к экземпляру (ам), который уже создан (глядя на документацию, кажется, что я могу применить учетную запись службы только при создании экземпляра). - person Denny Lee; 01.10.2014
comment
Я думаю, что, используя эту вторую ссылку, вы сможете применить (или настроить) учетную запись службы в экземплярах после их создания. - person ssk2; 01.10.2014