Hive в Google Cloud не может получить доступ к данным любого пользователя, кроме улья

Я использую Hive на Hadoop и успешно установил его в Google Cloud Storage, используя bdutil версии 1.3.1. Я выполнил следующую команду:

./bdutil -e platforms/hdp/ambari_env.sh deploy

Как пользователь улья, я могу без проблем создавать/удалять базы данных и таблицы:

hive> create database db_final location 'gs://cip-hadoop-dev-data/apps/hive/warehouse/db_final';
OK
Time taken: 1.816 seconds

Но я получаю следующую ошибку, если пытаюсь получить доступ к базе данных как любой другой пользователь:

hive> use db_final;
FAILED: SemanticException MetaException(message:java.security.AccessControlException: Permission denied: user=andy, path="gs://cip-hadoop-dev-data/apps/hive/warehouse/db_final":hive:hive:drwx------)

Я могу сказать, что это ошибка с разрешениями, так как права доступа к файлу 700, что указано выше и подтверждается из командной строки:

[andy@hadoop-m ~]$ hdfs dfs -ls gs:///apps/hive/warehouse/
drwx------   - andy andy          0 2015-09-11 01:46 gs:///apps/hive/warehouse/db_final

Я попытался изменить права доступа к файлу с помощью команды hdfs, но они остались прежними:

[andy@hadoop-m ~]$ sudo hdfs dfs -chmod 750 gs:///apps/hive/warehouse/db_final
[andy@hadoop-m ~]$ hdfs dfs -ls gs:///apps/hive/warehouse/
drwx------   - andy andy         0 2015-09-11 01:46 gs:///apps/hive/warehouse/db_final

Я также предоставил пользователю разрешения SELECT для базы данных, что удалось, но я все еще получаю ту же ошибку, когда пытаюсь использовать базу данных.

Это похоже на эта проблема, но я использую последнюю версию bdutil, поэтому не знаю, та же ли это проблема. Я также подтвердил, что для dfs.permissions.enabled установлено значение false.

Таким образом, все работает нормально, если я запускаю его как пользователь улья, но я не хочу отправлять имя пользователя/пароль улья всем, кому нужен доступ к базе данных.

Что еще я должен попробовать / изучить?

Спасибо за вашу помощь


person Andy Crockett    schedule 11.09.2015    source источник


Ответы (1)


Действительно, часть проблемы заключается в том, что коннектор GCS на самом деле не имеет разрешений posix/hdfs; он сообщает только о статических разрешениях, в то время как на самом деле он аутентифицируется с учетными данными oauth2, которые не привязаны к учетным записям linux на виртуальной машине GCE.

Недавно мы добавили функцию, позволяющую изменять сообщаемые разрешения из коннектора GCS с помощью fs.gs.reported.permissions: https://github.com/GoogleCloudPlatform/bigdata-interop/commit/93637a136cdb7354b1a93cc3c7a61c42b0bc78a6

Он еще не выпущен в официальном релизе, но вы можете попытаться создать снимок, следуя инструкциям здесь: https://github.com/GoogleCloudPlatform/bigdata-interop

mvn -P hadoop2 package

Затем замените существующий jar-файл коннектора GCS новой сборкой. В качестве альтернативы для быстрого тестирования вы можете использовать temporary snapshot build we have, just keep in mind предоставленная ссылка перестанет работать после истечения срока, а сборка моментального снимка еще не проверена для рабочих нагрузок. Скоро должен выйти официальный релиз, который предоставит чистую сборку jarfile, если вы хотите сначала только проверить доказательство концепции с помощью сборки моментального снимка.

После того, как вы заменили jarfile, вы можете попробовать изменить core-site.xml, чтобы установить fs.gs.reported.permissions на что-то вроде 755 или даже 777 в качестве разрешений; обратите внимание, что установка разрешительных разрешений, сообщаемых соединителем GCS, на самом деле не приводит к утечке большего доступа, чем в противном случае, поскольку доступ GCS зависит только от учетных данных oauth2 (вероятно, через учетную запись службы, если вы находитесь на виртуальной машине GCE). Единственная цель — найти заявленное разрешение, которое делает инструментарий Hadoop, который вы используете, счастливым (где некоторые инструменты могут жаловаться на то, что 777 слишком разрешающий).

person Dennis Huo    schedule 12.09.2015
comment
Спасибо Денис. Запуск bdutil с временным снимком, который у вас есть выше, вместе с изменением fs.gs.reported.permissions устранил проблему. Временный снимок предназначен для hadoop1, а я использую hadoop2, поэтому я попытался создать снимок для hadoop2, следуя приведенным выше инструкциям. Сборка и развертывание работали, но когда я запустил, например, hdfs dfs -ls gs:///, я получил ошибку com/google/cloud/hadoop/util.PropertyUtil class not found. Любые идеи, что мне может не хватать в моей сборке, чтобы вызвать эту ошибку, или я могу безопасно продолжить, используя банку hadoop1? - person Andy Crockett; 12.09.2015
comment
А, извините, вот hadoop2 snapshot - person Dennis Huo; 13.09.2015
comment
Хотя, если подумать, это, вероятно, выглядит так же, как ваша собственная сборка hadoop2; класс PropertyUtil был добавлен в выпуск от 27 мая, gcs-connector-1.4.0; возможно ли, что у вас есть версии соединителя GCS старше 1.4.0 на любом из основных или рабочих путей к классам или классы, загруженные в запущенных службах демона? - person Dennis Huo; 13.09.2015
comment
Кстати, мы только что разместили объявление о последнем выпуске, который включает в себя все необходимые обновления и прошел проверку выпуска и т. д.: groups.google.com/forum/#!topic/gcp-hadoop-announce/pISo6LW0OTw Вы можете продолжить и обновиться до bdutil-1.3 .2 всякий раз, когда это удобно. - person Dennis Huo; 13.09.2015
comment
Спасибо Денис. Я использую последнюю версию bdutil, но мне удалось найти ошибку. Выложенный вами jar-файл hadoop2 был намного больше, чем тот, который я использовал, поэтому я использовал затененный jar-файл, который я создал, и это решило проблему. В очередной раз благодарим за помощь. - person Andy Crockett; 13.09.2015