【问题标题】:apache hive cannot connect to derby:metastore_db although ij from derby canapache hive 无法连接到 derby:metastore_db 尽管来自 derby 的 ij 可以
【发布时间】:2015-11-22 21:32:19
【问题描述】:

我正在三台机器上的 hadoop 集群上设置一个配置单元。 hadoop (2.7.1) 和 derby (10.11) 运行良好:

hduser@master:~$ ij
ij version 10.11
ij> connect 'jdbc:derby://localhost:1527/metastore_db;create=true';
ij> select * from a;
ID
-----------

0 rows selected
ij>

但是蜂巢抱怨:

...
Exception in thread "main" java.lang.RuntimeException: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
        at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:522)
        at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:677)
        at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:621)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
        at org.apache.hadoop.util.RunJar.main(RunJar.java:136)
Caused by: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
        at org.apache.hadoop.hive.metastore.MetaStoreUtils.newInstance(MetaStoreUtils.java:1523)
        at org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.<init>(RetryingMetaStoreClient.java:86)
        at org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.getProxy(RetryingMetaStoreClient.java:132)
        at org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.getProxy(RetryingMetaStoreClient.java:104)
        at org.apache.hadoop.hive.ql.metadata.Hive.createMetaStoreClient(Hive.java:3005)
        at org.apache.hadoop.hive.ql.metadata.Hive.getMSC(Hive.java:3024)
        at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:503)
        ... 8 more
Caused by: java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
        at org.apache.hadoop.hive.metastore.MetaStoreUtils.newInstance(MetaStoreUtils.java:1521)
        ... 14 more
Caused by: javax.jdo.JDOFatalDataStoreException: Unable to open a test connection to the given database. JDBC url = jdbc:derby://localhost:1527/metastore_db;create=true , username = APP. Terminating connectio pool (set lazyInit to true if you expect to start your database after your app). Original Exception: ------
java.sql.SQLException: No suitable driver found for jdbc:derby://localhost:1527/metastore_db;create=true
...

环境变量:

# Java
export JAVA_HOME=/usr/lib/jvm/jdk

# derby

export DERBY_HOME=/usr/local/derby
export PATH=$PATH:$DERBY_HOME/bin
export CLASSPATH=$CLASSPATH:$DERBY_HOME/lib/derby.jar:$DERBY_HOME/lib/derbytools.jar

# Hadoop
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export HADOOP_YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"


# hive

export HIVE_HOME=/usr/local/hive
export PATH=$PATH:$HIVE_HOME/bin
export CLASSPATH=$CLASSPATH:/usr/local/hive/lib/*:.

hive-site.xml 在配置中只有这个属性:

  <property>
     <name>javax.jdo.option.ConnectionURL</name>
     <value>jdbc:derby://localhost:1527/metastore_db;create=true </value>
     <description>JDBC connect string for a JDBC metastore </description>
  </property>

发生了什么事?

【问题讨论】:

  • 将其更改为 mysql、postgres 或 oracle。德比会崩溃。
  • 我会的,我只需要测试 IAAS 提供者(或多个提供者),并认为我可以永久修复那个 derby 问题。不知何故会很高兴了解它为什么会崩溃。..
  • 不建议将 derby 用于 hive 的元存储。它只是将数据存储在文件中,当多个用户尝试访问 hive 时它会崩溃。
  • 知道了。开始安装 postgres。出于好奇,调试和修复德比部分会很好。因为如果我不修复它,它就不会让我睡觉(如果我再也不会使用它的话:))
  • @AmalGJose:我通过用 postgres 替换 derby 成功地解决了这个问题,感谢您的提示。解决那个该死的德比问题仍然很酷:)

标签: hadoop hive derby


【解决方案1】:

你说:

export CLASSPATH=$CLASSPATH:$DERBY_HOME/lib/derby.jar:$DERBY_HOME/lib/derbytools.jar

但你也说过:

jdbc:derby://localhost:1527/metastore_db;create=true

因此,您为 Derby 的客户端/服务器配置提供了 JDBC 连接 URL,但您提供的 CLASSPATH 是用于 Derby 的嵌入式配置。

因此您收到了错误:

No suitable driver found

您可以更改 CLASSPATH,也可以更改 JDBC 连接 URL。

如果您想使用 Derby 的客户端/服务器配置,请将您的 CLASSPATH 切换为:

export CLASSPATH=$CLASSPATH:$DERBY_HOME/lib/derbyclient.jar

因为您需要用于此配置的 JDBC 客户端驱动程序。

如果您想使用 Derby 的嵌入式配置,请保留您的 CLASSPATH 并将您的 JDBC 连接 URL 更改为:

jdbc:derby:metastore_db;create=true

要了解有关不同 Derby 配置的更多信息,请在此处阅读:http://db.apache.org/derby/docs/10.11/getstart/cgsquck70629.html

【讨论】:

  • 感谢您的帖子。不幸的是我得到了同样的错误。我已经启动了 derby 服务器:startNetworkServer -h localhost -p 1527echo $CLASSPATH 返回 :/usr/local/derby/lib/derbyclient.jar:/usr/local/hive/lib/*:.,与 ij 的连接有效:ij&gt; connect 'jdbc:derby://localhost:1527/metastore_db;create=true'; ij&gt;,hive 继续抱怨:java.sql.SQLException: No suitable driver found for jdbc:derby://localhost:1527/metastore_db;create=true
  • Hive 无法找到 derbyclient.jar。也许 Hive 有自己控制 CLASSPATH 的方式?可能您可以使用 -verbose:class 运行 Hive?您的异常链中可能有更多可用信息:wiki.apache.org/db-derby/UnwindExceptionChain
  • 哦!你说你的 Hive 集群有多台机器。可能您只是为其中一台机器配置 CLASSPATH,而错误来自另一台机器?
  • 或者也许 Hive 在每台机器上都正确地看到了 CLASSPATH 值,但是您还没有在集群中的所有机器上创建 /usr/local/derby/lib/derbyclient.jar 文件?
  • 理论上derby(和hive)应该只安装在master上,最后hive集中确定查询计划,然后发出hadoop作业来计算它。好吧,至少其他机器上没有配置单元(如果将 derby 替换为 postgres,一切正常)
【解决方案2】:

当我在另一个终端选项卡中打开 spark-shell 会话时,我开始看到此错误,而其他终端选项卡中已经有一个打开的会话。关闭这个旧的终端选项卡,并在当前选项卡中再次启动 spark-shell 会话解决了这个问题。

【讨论】:

    猜你喜欢
    • 2012-12-30
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-28
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    相关资源
    最近更新 更多