Как использовать Hive Metastore с MySQL (для Thrift Server или spark-shell)?

Я использую Apache Spark 2.1.1, и я хотел бы настроить его с помощью внешнего метастафа Hive (особенно для Spark Thrift Server).

я добавил hive-site.xml в $SPARK_HOME/conf папка, которая выглядит следующим образом:

<?xml version="1.0"?>
<configuration>
  <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://home.cu:3306/hive_metastore?createDatabaseIfNotExist=true&amp;useLegacyDatetimeCode=false&amp;serverTimezone=Europe/Berlin&amp;nullNamePatternMatchesAll=true </value>
    <description>JDBC connect string for a JDBC metastore</description>
  </property>

  <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
    <description>Driver class name for a JDBC metastore</description>
  </property>

  <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>hive</value>
    <description>username to use against metastore database</description>
  </property>

  <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>hive</value>
    <description>password to use against metastore database</description>
  </property>
  <property>
    <name>hive.metastore.schema.verification</name>
    <value>false</value>
    <description>password to use against metastore database</description>
  </property>

  <property>
    <name>hive.metastore.warehouse.dir</name>
    <value>hdfs://spark-master.cu:9000/value_iq/hive_warehouse/</value>
    <description>Warehouse Location</description>
  </property>
</configuration>

Всякий раз, когда я пытаюсь бежать spark-shell или Spark Thrift Server, они пытаются создать метасторное хранилище Hive на MySQL (поскольку метасторное хранилище еще не создано), и они терпят неудачу со следующей ошибкой:

17/07/13 19:57:55 ERROR Datastore: Error thrown executing ALTER TABLE `PARTITIONS` ADD COLUMN `TBL_ID` BIGINT NULL : Table 'hive_metastore.partitions' doesn't exist
java.sql.SQLSyntaxErrorException: Table 'hive_metastore.partitions' doesn't exist
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:536)
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:513)
        at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:115)
        at com.mysql.cj.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:1983)
        at com.mysql.cj.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:1936)
        at com.mysql.cj.jdbc.StatementImpl.executeInternal(StatementImpl.java:891)
        at com.mysql.cj.jdbc.StatementImpl.execute(StatementImpl.java:795)
        at com.jolbox.bonecp.StatementHandle.execute(StatementHandle.java:254)
        at org.datanucleus.store.rdbms.table.AbstractTable.executeDdlStatement(AbstractTable.java:760)
        at org.datanucleus.store.rdbms.table.AbstractTable.executeDdlStatementList(AbstractTable.java:711)
        at org.datanucleus.store.rdbms.table.TableImpl.validateColumns(TableImpl.java:259)
        at org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.performTablesValidation(RDBMSStoreManager.java:3393)
        at org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.addClassTablesAndValidate(RDBMSStoreManager.java:3190)
        at org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.run(RDBMSStoreManager.java:2841)
        at org.datanucleus.store.rdbms.AbstractSchemaTransaction.execute(AbstractSchemaTransaction.java:122)
        at org.datanucleus.store.rdbms.RDBMSStoreManager.addClasses(RDBMSStoreManager.java:1605)
        at org.datanucleus.store.AbstractStoreManager.addClass(AbstractStoreManager.java:954)
        at org.datanucleus.store.rdbms.RDBMSStoreManager.getDatastoreClass(RDBMSStoreManager.java:679)
        at org.datanucleus.store.rdbms.query.RDBMSQueryUtils.getStatementForCandidates(RDBMSQueryUtils.java:408)
        at org.datanucleus.store.rdbms.query.JDOQLQuery.compileQueryFull(JDOQLQuery.java:947)
        at org.datanucleus.store.rdbms.query.JDOQLQuery.compileInternal(JDOQLQuery.java:370)
        at org.datanucleus.store.query.Query.executeQuery(Query.java:1744)
        at org.datanucleus.store.query.Query.executeWithArray(Query.java:1672)
        at org.datanucleus.store.query.Query.execute(Query.java:1654)
        at org.datanucleus.api.jdo.JDOQuery.execute(JDOQuery.java:221)

4 ответа

Решение

Я нашел проблему, это было связано с драйвером MySQL, я использовал mysql-connector-java-6.0.6-bin.jar и я заменил его на старый mysql-connector-java-5.1.23-bin.jar и теперь это работает.

Я пытался с разными версиями spark перенести управление метаданными с derby на mysql/postgres, и у меня все получилось с spark-2.2.1 и выше. Предыдущие версии не позволили мне перейти на другие базы данных. Это просто зависимость от версии, которую они имеют с искрой. Мое предложение, попробуйте обновить версию spark до 2.2.1, и вы должны быть готовы!

Я не думаю, что ваше свойство dir хранилища настроено правильно, это должен быть путь в HDFS

<configuration>
<property>
    <name>hive.metastore.uris</name>
    <value>thrift://maprdemo:9083</value>
</property>
<property>
    <name>hive.metastore.warehouse.dir</name>
    <value>/user/hive/warehouse</value>
</property>

Для всех тех, кто пытается использовать хранилище метаданных hive с драйвером mysql 8.x, помогает переход на 5.x:

Другим решением является настройка URL-адреса с параметрами mysql:

      connectionURL: "jdbc:mysql://localhost:3306/hive_db?databaseTerm=SCHEMA&nullDatabaseMeansCurrent=true"

Из примечаний к выпуску соединителя mysql 8

Новое свойство подключения, databaseTerm, устанавливает, какой из двух терминов используется в приложении для ссылки на базу данных. Свойство принимает одно из двух значений CATALOG или SCHEMA и использует его для определения того, какие методы подключения можно использовать для установки/получения текущей базы данных, какие аргументы можно использовать в различных методах DatabaseMetaData для фильтрации результатов и какие поля в ResultSet возвращаемые методами DatabaseMetaData, содержат идентификационную информацию базы данных. Подробности смотрите в записи для databaseTerm в свойствах конфигурации. Кроме того, свойство соединения nullCatalogMeansCurrent было переименовано в nullDatabaseMeansCurrent. Старое имя остается псевдонимом для свойства соединения. Спасибо Харальду Аамоту за участие в патче. (Ошибка № 11891000, Ошибка № 27356869, Ошибка № 89133)

Для интересующихся: проблема, которую мы видели, заключается в том, что куст пытается разобрать все схемы в mysql, и у него нет на это прав. Ограничение его текущей базой данных (hive_db, указанной в URL-адресе) решило проблему для нас.

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