Spring+HBase+phoenix踩过的坑

来源:互联网 发布:医院数据库容量计算 编辑:程序博客网 时间:2024/05/02 21:27

博主含泪记录下踩过的坑!

由于业务需求,需要对HBase进行复杂查询,而此时HBaseFilter已经不能满足我们的要求,故想着运用Phoenix来作为中间件,对HBase用SQL语句来查询。

Hpoenix 作为一个中间件可以像类似jdbc进行连接。

<!-- 配置Phoenix数据源 --><bean id="phoenixDataSource" class="com.alibaba.druid.pool.DruidDataSource"init-method="init" destroy-method="close"><property name="driverClassName" value="org.apache.phoenix.jdbc.PhoenixDriver"/><property name="url"><value>${phoenix.url}</value></property><property name="username"><value>${phoenix.username}</value></property><property name="password"><value>${phoenix.password}</value></property><property name="initialSize"><value>${phoenix.initialSize}</value></property><property name="maxActive"><value>${phoenix.maxActive}</value></property></bean>
还会有一系列的代码,目的是像使用mysql一样使用HBase。然而报错了:


Caused by: java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/client/HConnectionManagerat org.apache.phoenix.query.HConnectionFactory$HConnectionFactoryImpl.createConnection(HConnectionFactory.java:47)at org.apache.phoenix.query.ConnectionQueryServicesImpl.openConnection(ConnectionQueryServicesImpl.java:436)at org.apache.phoenix.query.ConnectionQueryServicesImpl.access$400(ConnectionQueryServicesImpl.java:264)at org.apache.phoenix.query.ConnectionQueryServicesImpl$12.call(ConnectionQueryServicesImpl.java:2413)at org.apache.phoenix.query.ConnectionQueryServicesImpl$12.call(ConnectionQueryServicesImpl.java:2389)at org.apache.phoenix.util.PhoenixContextExecutor.call(PhoenixContextExecutor.java:76)at org.apache.phoenix.query.ConnectionQueryServicesImpl.init(ConnectionQueryServicesImpl.java:2389)at org.apache.phoenix.jdbc.PhoenixDriver.getConnectionQueryServices(PhoenixDriver.java:255)at org.apache.phoenix.jdbc.PhoenixEmbeddedDriver.createConnection(PhoenixEmbeddedDriver.java:150)at org.apache.phoenix.jdbc.PhoenixDriver.connect(PhoenixDriver.java:221)at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1464)at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1529)at com.alibaba.druid.pool.DruidDataSource.init(DruidDataSource.java:787)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:497)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1758)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1695)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624)... 121 moreCaused by: java.lang.ClassNotFoundException: org.apache.hadoop.hbase.client.HConnectionManagerat org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1713)at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1558)... 141 more

说是方法找不到,而据我查看源码发现,HBase-client.jar在后期版本中已经将HConnection 等类似方法改名为Connection.(此处是不是觉得很坑爹)然而,这还不是问题的所在。问题的真正原因出在了阿里的连接池工具Druid,它只支持mysql,oracle,sqlserver。是看了源码发现,对于这个工具可用的资料都太表面了,遇到问题还是直接看源码吧。

结论:开源的东西其实有很多坑,而且好多东西是没有人尝试过的,尝试新东西,网上资料少,甚至没有。只能透过现象找问题,而抛出的异常有的也让人摸不着头脑,这时候能相信的只有自己分析问题解决问题的能力,再就是源码。源码很重要!源码很重要!源码很重要!重要的事情说三遍!



原创粉丝点击