来自 org.apache.hadoop.hbase.client.HConnectionManager.createConnection 的 InvocationTargetException 异常

InvocationTargetException exception from org.apache.hadoop.hbase.client.HConnectionManager.createConnection

我的 tomcat 基于 REST API 的应用程序由于上述错误无法处理请求。到目前为止,我已经尝试过以下操作:

  1. 正在检查所有 jar 文件是否可用
  2. 正在检查 tomcat/webapp/ 目录中所有文件的权限
  3. 防火墙规则
  4. Hbase是否可用

但随后也出现以下异常。我正在使用包含 HBase 0.98.6CDH 5.3.1。有谁知道如何解决这个问题?

2015-03-03 05:09:02 privateLog [ERROR]          java.lang.reflect.InvocationTargetException     org.apache.hadoop.hbase.client.HConnectionManager.createConnection(HConnectionManager.java:413)
                org.apache.hadoop.hbase.client.HConnectionManager.createConnection(HConnectionManager.java:306)
                com.amazon.dao.MyDAO.<clinit>(SensorDataDAO.java:78)
                sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
                sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
                sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
                java.lang.reflect.Constructor.newInstance(Constructor.java:526)
                org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:126)
                org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:74)
                org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:958)
                org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:911)
                org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485)
                org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
                org.springframework.beans.factory.support.AbstractBeanFactory.getObject(AbstractBeanFactory.java:291)
                org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
                org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
                org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
                org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:580)
                org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
                org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)
                org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:276)
                org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:197)
                org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47)
                org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4779)
                org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5273)
                org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
                org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:895)
                org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:871)
                org.apache.catalina.core.StandardHost.addChild(StandardHost.java:615)
                org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:958)
                org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1599)
                java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
                java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
                java.util.concurrent.FutureTask.run(FutureTask.java:166)
                java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
                java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
                java.lang.Thread.run(Thread.java:724)   
                com.amazon.dao.MyDAO  <clinit>

尝试建立连接的代码如下:

public class MyDAO {

  protected static HConnection connection;


  static {
      Configuration conf = HBaseConfiguration.create();
      conf.addResource("hbase-site.xml");
      connection = HConnectionManager.createConnection(conf);
      // connection object is still null at this point
    try {
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
}

你能试着把它设置到你的 conf 中吗?

config.set("hbase.zookeeper.quorum", "zookeeper-ip:port");

如果这有效,那么我们可以检查您在 conf 中设置的 hbase-site.xml 是否具有正确的详细信息。

我解决了我的问题。我发现了这个错误的两个原因。如果有人遇到同样的错误,那么这个答案可能会对他们有所帮助:)

  1. class 路径中缺少一些 jar 文件,因此出现了 InvocationTargetException。由于我们使用的是基于 Ant 的构建系统而不是基于 Maven 的构建系统,因此缺少一些 jar 文件。基本上我们需要将几乎所有的 jar 文件放在 /etc/hadoop/etc/hadoop-hdfs/etc/hbase/etc/zookeeper 目录中。

Please take a note that we are using Cloudera Hadoop distribution, if you are using some different distribution then these paths may vary.

  1. 第二个主要问题是我们在创建配置对象时没有包含 hdfs-site.xml 文件。由于我们正在使用名称节点 HA 功能,因此此文件是必须的。如果此文件不存在,则 hbase 无法连接到正确的名称节点服务。

现在与连接相关的代码如下所示:

public class MyDAO {

  protected static HConnection connection;

  static {
      Configuration conf = HBaseConfiguration.create();
      conf.addResource("hbase-site.xml");
      conf.addResource("hdfs-site.xml");
      conf.addResource("core-site.xml");
      connection = HConnectionManager.createConnection(conf);
    try {
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
}