Проблема с каталогом данных 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)


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

Справочные блоги:

Попытки исправления:

- Включение поддержки 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>
    

Теперь вы сможете отправить свою работу в кластерном режиме. Чтобы сделать это в режиме клиента, вам нужно установить 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

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

Другие вопросы по тегам