Проблема с каталогом данных AWS Glue в качестве Metastore для Spark SQL на EMR - PullRequest
0 голосов
/ 10 января 2019

У меня кластер AWS EMR (v5.11.1) с Spark (v2.2.1), и я пытаюсь использовать каталог данных клея AWS в качестве метастаза. В соответствии с рекомендациями, приведенными в официальной документации AWS (ссылка на ссылку ниже), я выполнил шаги, но столкнулся с некоторыми расхождениями в отношении доступа к базе данных / таблицам каталога клея. EMR Cluster и AWS Glue находятся в одной учетной записи , и были предоставлены соответствующие разрешения IAM.

Документация AWS : https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-spark-glue.html


Замечания:

- Использование искровой оболочки (от главного узла EMR):

  • Работает . Возможность доступа к базе данных Glue / таблицам с помощью следующих команд:
    spark.catalog.setCurrentDatabase("test_db")
    spark.catalog.listTables
    

- Использование spark-submit (с шага EMR):

  • Не работает . Постоянно получаю сообщение об ошибке «База данных 'test_db' не существует"

Ошибка трассировки, как показано ниже:

INFO HiveClientImpl: расположение хранилища для клиента Hive (версия 1.2.1): hdfs: /// пользователь / spark / warehouse
ИНФОРМАЦИЯ HiveMetaStore: 0: get_database: по умолчанию
ИНФОРМАЦИОННЫЙ аудит: ugi = hadoop ip = unknown-ip-addr cmd = get_database: default
ИНФОРМАЦИЯ 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-93dcc530149 * 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-20d51 * 10 * 51015 INFO SessionState: создан каталог HDFS: /tmp/hive/hadoop/6d0f6b2c-cccd-4e90-a524-93dcc5301e20/_tmp_space.db
ИНФОРМАЦИЯ HiveClientImpl: расположение хранилища для клиента Hive (версия 1.2.1): hdfs: /// пользователь / 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.GriffinTest.ingestGriffinRecords (GriffinTest.java:97) на org.griffin_test.GriffinTest.main (GriffinTest.java:65) at sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) в java.lang.reflect.Method.invoke (Method.java:498) в org.apache.spark.deploy.yarn.ApplicationMaster $$ anon $ 2.run (ApplicationMaster.scala: 635)


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

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

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

- Включение поддержки Hive в spark-defaults.conf & SparkSession (Код):

  • Классы кустов находятся в CLASSPATH и для свойства внутренней конфигурации spark.sql.catalogImplementation установлено значение hive:

    spark.sql.catalogImplementation  hive
    
  • Добавление конфигурации метастазов Hive:

    .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 Ответ

0 голосов
/ 28 февраля 2019

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

Моя цель: запускать команды spark-submit из экземпляра EC2 вне кластера EMR. Кластер использует S3 для хранения (таблицы кустов) и каталог данных Glue для метастаза:

  • Запустите кластер 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

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

...