Проблема с каталогом данных AWS Glue в качестве Metastore для Spark SQL на EMR
У меня есть кластер AWS EMR (v5.11.1) с Spark(v2.2.1) и я пытаюсь использовать каталог данных AWS Glue в качестве своего метасредства. В соответствии с рекомендациями, приведенными в официальной документации AWS (ссылка на ссылку ниже), я выполнил шаги, но столкнулся с некоторыми несоответствиями в отношении доступа к базе данных / таблицам каталога клея. И EMR Cluster, и AWS Glue находятся в одной учетной записи, и были предоставлены соответствующие разрешения IAM.
Документация AWS: https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-spark-glue.html
Замечания:
- Использование спарк-оболочки (от EMR Master Node):
- Работает. Возможность доступа к базе данных Glue / таблицам с помощью следующих команд:
spark.catalog.setCurrentDatabase("test_db") spark.catalog.listTables
- Использование spark-submit (из шага EMR):
- Не работает. Продолжайте получать ошибку "База данных 'test_db' не существует"
Трассировка ошибок, как показано ниже:
ИНФОРМАЦИЯ HiveClientImpl: расположение хранилища для клиента Hive (версия 1.2.1): hdfs:///user/spark/warehouse
ИНФОРМАЦИЯ HiveMetaStore: 0: get_database: по умолчанию
ИНФОРМАЦИОННЫЙ аудит: ugi=hadoop ip=unknown-ip-addr cmd=get_database: по умолчанию
ИНФОРМАЦИЯ HiveMetaStore: 0: get_database: global_temp
ИНФОРМАЦИОННЫЙ аудит: ugi=hadoop ip=unknown-ip-addr cmd=get_database: global_temp
WARN ObjectStore: не удалось получить базу данных global_temp, возвращая NoSuchObjectException
INFO SessionState: создан локальный каталог: /mnt3/yarn/usercache/hadoop/appcache/application_1547055968446_0005/container_1547055968446_0005_01_000001/tmp/6d0f6b2c-cccd-4e90-a524-93dcc5301e
INFO SessionState: создан каталог HDFS: / tmp / hive / hadoop / 6d0f6b2c-cccd-4e90-a524-93dcc5301e20
INFO SessionState: создан локальный каталог: /mnt3/yarn/usercache/hadoop/appcache/application_1547055968446_0005/container_1547055968446_0005_01_000001/tmp/yarn/6d0f6b2c-cccd-4e90-a524-20dcc01
INFO SessionState: создан каталог HDFS: /tmp/hive/hadoop/6d0f6b2c-cccd-4e90-a524-93dcc5301e20/_tmp_space.db
ИНФОРМАЦИЯ HiveClientImpl: расположение хранилища для клиента Hive (версия 1.2.1): hdfs:///user/spark/warehouse
ИНФОРМАЦИЯ StateStoreCoordinatorRef: Зарегистрированная конечная точка StateStoreCoordinator
INFO CodeGenerator: код, сгенерированный за> 191.063411 мс
INFO CodeGenerator: код сгенерирован за 10.27313 мс
ИНФОРМАЦИЯ HiveMetaStore: 0: get_database: test_db
ИНФОРМАЦИОННЫЙ аудит: ugi=hadoop ip=unknown-ip-addr cmd=get_database: test_db
WARN ObjectStore: не удалось получить базу данных test_db, возвращая NoSuchObjectException
org.apache.spark.sql.AnalysisException: база данных 'test_db' не существует.; в org.apache.spark.sql.internal.CatalogImpl.requireDatabaseExists(CatalogImpl.scala:44) в org.apache.spark.sql.internal.CatalogImpl.setCurrentDatabase(CatalogImpl.scala:64) в org.griffin_test.GriffinGin (GriffinTest.java:97) в org.griffin_test.GriffinTest.main(GriffinTest.java:65) в sun.reflect.NativeMethodAccessorImpl.invoke0(родной метод) в sun.reflect.NativeMethodAccessorImpl.in62hoj.jj (sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) в java.lang.reflect.Method.invoke(Method.java:498) в org.apache.spark.deploy.yarn.ApplicationMaster$$$on ApplicationMaster.scala:635)
После долгих исследований и изучения множества предложений в блогах, я попробовал следующие исправления, но безрезультатно, и мы все еще сталкиваемся с расхождением.
Справочные блоги:
- https://forums.aws.amazon.com/thread.jspa?threadID=263860
- Каталог Spark с AWS Glue: база данных не найдена
- https://okera.zendesk.com/hc/en-us/articles/360005768434-How-can-we-configure-Spark-to-use-the-Hive-Metastore-for-metadata-
Попытки исправления:
- Включение поддержки Hive в spark-defaults.conf & SparkSession (код):
Классы Hive находятся в CLASSPATH и для свойства внутренней конфигурации spark.sql.catalogImplementation установлено значение hive:
spark.sql.catalogImplementation hive
Добавление конфигурации Hive metastore:
.config("hive.metastore.connect.retries", 15) .config("hive.metastore.client.factory.class", "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory")
Фрагмент кода:
SparkSession spark = SparkSession.builder().appName("Test_Glue_Catalog")
.config("spark.sql.catalogImplementation", "hive")
.config("hive.metastore.connect.retries", 15)
.config("hive.metastore.client.factory.class","com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory")
.enableHiveSupport()
.getOrCreate();
Любые предложения по выяснению первопричины такого расхождения были бы действительно полезны.
Ценю твою помощь! Спасибо!
1 ответ
Я расскажу вам, что сработало для меня после борьбы с этим в течение всего дня.
Моя цель: запускать команды spark-submit из экземпляра EC2 вне кластера EMR. Кластер использует S3 для хранения (таблицы кустов) и Glue Data Catalog для metastore:
- Запустите кластер EMR (с включенной конфигурацией Glue metastore, конечно)
- Создайте образ AMI из вашего главного узла
- Загрузите экземпляр EC2 с образа
- Убедитесь, что настройки вашей сети разрешают обмен данными между виртуальными машинами кластера и экземпляром, с которого вы запускаете задание (подсети и группы безопасности).
На экземпляре, который вы только что загрузили:
- Обновите /etc/hadoop/conf/yarn-site.xml:
<property> <name>yarn.timeline-service.enabled</name> <value>false</value> </property>
- SSH в ваш главный узел EMR и добавьте пользователя, который отправляет ваши задания в группу hadoop. Используйте это руководство, перейдите в раздел Распространенные ошибки: https://aws.amazon.com/premiumsupport/knowledge-center/emr-submit-spark-job-remote-cluster/
Теперь вы сможете отправить свою работу в кластерном режиме. Чтобы сделать это в режиме клиента, вам нужно установить AWS CREDENTIALS для этого экземпляра, который вы создали.
Чего действительно не хватало:
Spark необходимо загрузить файлы JAR для AWSGlueDataCatalogHiveClientFactory (проверьте spark.driver.extraClassPath & spark.executor.extraClassPath в /etc/spark/conf/spark-defaults.conf)
Проверьте также /etc/spark/hive-site.xml:
<property> <name>yarn.timeline-service.enabled</name> <value>com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory</value> </property>
- Эта конфигурация указывает кусту использовать Glue Data Catalog для метастазов, больше нет необходимости помещать это в код!
После того, как он заработал, я также очистил некоторые настройки:
Вы можете избавиться от материала улья (/etc/hive).
В /etc/spark/conf/spark-env.sh я оставил только строку, которая экспортирует HADOOP_CONF_DIR
В /etc/spark/conf/spark-defaults.conf оставлены только следующие фрагменты конфигурации:
- spark.driver.extraClassPath
- spark.driver.extraLibraryPath
- spark.executor.extraClassPath
- spark.executor.extraLibraryPath
Я действительно только что сделал эту работу, поэтому я верну некоторые настройки. Теперь важно быть уверенным в том, что я помещаю и зачем добавляю эти конфиги.