如何在MySQL中使用Hive Metastore(用于Thrift Server或spark-shell)?

时间:2017-07-14 09:00:10

标签: apache-spark hive apache-spark-sql spark-thriftserver

我正在使用Apache Spark 2.1.1,我想用外部Hive Metastore(专门针对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时,他们都会尝试在MySQL上创建Hive Metastore(因为还没有Metastore),它们会因以下错误而失败:

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 个答案:

答案 0 :(得分:0)

我不认为您的仓库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>

答案 1 :(得分:0)

我发现了问题,它与MySQL驱动程序有关,我使用的是mysql-connector-java-6.0.6-bin.jar,我用旧的mysql-connector-java-5.1.23-bin.jar替换了它,现在它可以正常工作。

答案 2 :(得分:0)

我尝试使用不同版本的spark来将元数据管理从derby迁移到mysql / postgres,并且我从spark-2.2.1开始成功。以前的版本不允许我迁移到其他数据库。它们具有火花的纯粹版本依赖性。我的建议是尝试将spark版本升级到2.2.1,您应该一切顺利!

答案 3 :(得分:0)

对于所有尝试将hive metastore与mysql驱动程序8.x一起使用并将其降级为5.x的用户而言,这些操作有帮助:

另一种解决方案是使用mysql选项配置URL:

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

From release notes of mysql connector 8

一个新的连接属性databaseTerm设置了两个术语中的哪一个在应用程序中用于引用数据库。该属性采用两个值CATALOG或SCHEMA之一,并使用它来确定可以使用哪些Connection方法来设置/获取当前数据库,可以在各种DatabaseMetaData方法中使用哪些参数来过滤结果以及ResultSet中的哪些字段。 DatabaseMetaData方法返回的值包含数据库标识信息。有关详细信息,请参见配置属性中databaseTerm的条目。 此外,连接属性nullCatalogMeansCurrent已重命名为nullDatabaseMeansCurrent。旧名称仍然是连接属性的别名。 感谢Harald Aamot为补丁做出了贡献。 (缺陷号11891000,缺陷号27356869,缺陷号89133)

有兴趣的人:我们看到的问题是,hive尝试解析mysql中的所有模式,并且没有权限这样做。将其限制为当前数据库(URL中指定的hive_db)对我们来说解决了问题

相关问题