java.lang.RuntimeException:无法实例化 org.apache.hadoop.hive.metastore.HiveMetaStoreClient
Posted
技术标签:
【中文标题】java.lang.RuntimeException:无法实例化 org.apache.hadoop.hive.metastore.HiveMetaStoreClient【英文标题】:java.lang.RuntimeException:Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClient 【发布时间】:2014-05-07 19:52:44 【问题描述】:我已按照链接中给出的配置我的 Hive:http://www.youtube.com/watch?v=Dqo1ahdBK_A,但在 Hive 中创建表时出现以下错误。我正在使用 hadoop-1.2.1 和 hive-0.12.0。
hive> create table employee(emp_id int,name string,salary double);
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClient
【问题讨论】:
【参考方案1】:您的元存储似乎有问题。如果您使用的是默认的 hive Metastore 嵌入式 derby。异常退出时会有锁文件。如果您删除该锁定文件,此问题将得到解决
rm metastore_db/*.lck
【讨论】:
每次使用 pyspark 时都必须运行 rm 命令,有什么想法吗? 不建议使用默认的 derby 数据库作为 Hive 后端,使用 derby 作为 Hive 后端一次只能建立一个会话。解决此问题的最佳选择是使用 mysql/Postgres/Oracle 服务器作为 Hive 后端而不是 derby。 谢谢萨钦。它对我有用。但是当您提供大量存储在 Hive 中的数据时,执行此命令并不好。在这种情况下应该有什么替代方案 @KanavNarula,不建议将 derby 用于集群环境。推荐的选项是从 derby 迁移到 Postgres 或 MySQL。 太棒了。感谢@sachin 的快速回复。【参考方案2】:重新启动虚拟机或系统也应该释放锁定。
【讨论】:
【参考方案3】:这可能是元存储(如 sachinjose 所述)的问题或连接问题。在调试模式下运行 hive 控制台,如下所示:
hive -hiveconf hive.root.logger=DEBUG,console
然后执行一个简单的查询,例如show tables;
,看看会发生什么。我在重启namenode后遇到了这个问题,这是由于在配置文件中设置了错误的主机(ec2在重启时会生成新的私有IP/主机名)。
【讨论】:
【参考方案4】:这可能是由于多个“metastore_db”造成的。删除“metastore_db”,重启hadoop集群并从$HIVE_HOME/bin文件夹打开hive shell
【讨论】:
【参考方案5】:答案位于http://www.cloudera.com/content/cloudera-content/cloudera-docs/CDH5/5.0/CDH5-Installation-Guide/cdh5ig_hive_schema_tool.html
要抑制架构检查并允许元存储隐式修改架构,您需要在 hive-site.xml 中将 hive.metastore.schema.verification 配置属性设置为 false。
【讨论】:
【参考方案6】:从控制台运行此命令:
./hive -hiveconf hive.root.logger=DEBUG,console
现在运行
show databases;
如果您看到如下异常:
java.sql.SQLException: A read-only user or a user in a read-only database is not permitted to disable read-only mode on a connection.
这意味着 metastore_db 存在一些权限问题。您需要更改整个文件夹的权限。我以 hdfs 用户身份运行我的配置单元。所以,我使用了命令
chown -R hdfs:hadoop *
在 hive 目录中。这解决了问题。
【讨论】:
【参考方案7】:作为新手,我遇到了同样的错误。 发现我的案例namenode中的守护进程之一没有启动。 在安装 hadoop 时,最好养成使用以下命令的习惯: ps -ef | grep "namenode" ps -ef | grep “数据节点” ps -ef | grep“跟踪器”
如果有任何守护进程不工作,则需要检查相关日志。
【讨论】:
【参考方案8】:rm metastore_db/*.lck
它也适用于我。
它可以在您的home/user
目录中找到。您可以使用locate
命令找到它:
locate metastore_db
删除锁定文件后,关闭当前会话。 在新会话中调用 hive shell
【讨论】:
【参考方案9】:如果它在本地机器上,看起来你用 hive shell/session 打开了另一个终端。您只能使用嵌入式 derby 数据库进行一次会话。关闭所有其他 hive 会话并尝试。
【讨论】:
【参考方案10】:hive> show databases;
FAILED: Error in metadata: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClient
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask
要解决此问题,请先启动 hadoop 服务。
$ start-all.sh
然后我运行
hive> show database;
对我来说很好用。
【讨论】:
在哪里可以找到脚本 start-all.sh?【参考方案11】:在 hive-site.xml 文件中设置 hive.metastore.schema.verification=false 此错误将被删除。就我而言,它运行良好。
【讨论】:
【参考方案12】:我遇到了同样的问题——使用以下步骤来解决它:
创建一个文件 hive-site.xml 并输入详细信息(对于本地/生产模式)。确保以下位置存在 /home/hadoop/bhishm/warehouse
例子:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/home/hadoop/bhishm/warehouse</value>
<description>
Local or HDFS directory where Hive keeps table contents.
</description>
</property>
<property>
<name>hive.metastore.local</name>
<value>true</value>
<description>
Use false if a production metastore server is used.
</description>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:derby:;databaseName=/home/hadoop/bhishm/warehouse/metastore_db;create=true</value>
<description>
The JDBC connection URL.
</description>
</property>
</configuration>
编辑hive-env.sh-->减少内存占用后添加java路径作为第一行:
例子:
# Hive Client memory usage can be an issue if a large number of clients
# are running at the same time. The flags below have been useful in
# reducing memory usage:
# The java implementation to use. Required.
export JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk
运行 hive 查询。
【讨论】:
【参考方案13】:删除 hive-site.xml 中的代码并将此代码粘贴到 hive-site.xml 中。
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?><!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:derby:;databaseName=/home/hadoop/Desktop/apache-hive-2.1.1-bin/metastore_db;create=true</value>
<description>
JDBC connect string for a JDBC metastore.
To use SSL to encrypt/authenticate the connection, provide database-specific SSL flag in the connection URL.
For example, jdbc:postgresql://myhost/db?ssl=true for postgres database.
</description>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
<description>location of default database for the warehouse</description>
</property>
<property>
<name>hive.metastore.uris</name>
<value/>
<description>Thrift URI for the remote metastore. Used by metastore client to connect to remote metastore.</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>org.apache.derby.jdbc.EmbeddedDriver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.PersistenceManagerFactoryClass</name>
<value>org.datanucleus.api.jdo.JDOPersistenceManagerFactory</value>
<description>class implementing the jdo persistence</description>
</property>
</configuration>
【讨论】:
【参考方案14】:我遇到了同样的问题,有一些重要的点可以解决这个问题。
1.将以下内容放在hive-site.xml的开头
<property>
<name>system:java.io.tmpdir</name>
<value>/tmp/hive/java</value>
</property>
<property>
<name>system:user.name</name>
<value>$user.name</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:derby:,databaseName=$HIVE_HOME/metastore_db;create=true</value>
<description>JDBC connect string for a JDBC metastore </description>
</property>
这是在绝对 URI 中设置相对路径并配置存储数据库的 Metastore
2.Remove $HIVE_HOME/metastore_db
但请注意,这将完全删除您的架构!
3.现在,您必须初始化 Derby 数据库。默认情况下,Hive 使用 Derby 数据库
$HIVE_HOME/bin/schematool -initSchema -dbType 德比
我也认为您的环境变量已正确设置,如果没有请检查它们如下所示:
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
export HIVE_HOME=/usr/lib/hive
export PATH=$PATH:$HIVE_HOME/bin
然后运行hive
命令并输入show databases;
【讨论】:
【参考方案15】:我很惊讶没有人指出最常见的实际问题。
System.setSecurityManager(null)
将此行放在应用程序的开头。
【讨论】:
我正在使用 windows 和 pyspark。我尝试了您的解决方案,但系统未定义?! @Abhinandan Dubey 尝试导入java.lang.System
【参考方案16】:
我遇到了同样的错误,但我什至无法启动 hive shell。在尝试了非常有用的 hive 调试命令后:
hive -hiveconf hive.root.logger=DEBUG,console
我能够看到 Hive 找不到有效的 Kerberos TGT。您将在调试信息中看到有关 SASL 协商失败并且没有有效的 Kerberos TGT 的信息。我的解决方案是运行
kinit
在运行 hive CLI 之前。
【讨论】:
【参考方案17】:当我使用 jdk 11 时,我在我的主节点上部署了 hive,然后抛出了这些异常。很多方法我都试过但没用。最终我将 jdk 的版本从 11 更改为 8,用于主节点。然后我成功启动了蜂巢。
【讨论】:
以上是关于java.lang.RuntimeException:无法实例化 org.apache.hadoop.hive.metastore.HiveMetaStoreClient的主要内容,如果未能解决你的问题,请参考以下文章