Spring+HBase+phoenix踩过的坑

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

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

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


	
		
		
			${phoenix.url}
		
		
			${phoenix.username}
		
		
			${phoenix.password}
		
		
			${phoenix.initialSize}
		
		
			${phoenix.maxActive}
		
	
还会有一系列的代码,目的是像使用mysql一样使用HBase。然而报错了:


Caused by: java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/client/HConnectionManager
	at 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 more
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hbase.client.HConnectionManager
	at 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。是看了源码发现,对于这个工具可用的资料都太表面了,遇到问题还是直接看源码吧。

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



你可能感兴趣的:(大数据)