一。背景
近日重构产品的监控告警系统,原来是基于hbase实现,做的比较粗糙,无法实现数据聚合等功能,遂决定重构。
原来基于hbase实现,所有的读取代码也都是用的原生hbase api获取,除了冗余度问题外,还有就是可维护性较差,遂决定变更存储方案。
通过筛选,有以下几种方案。
\ | 优点 | 缺点 |
---|---|---|
hbase | 兼容性较好 | 设计复杂,统计需求复杂,可维护性差 |
hbase+phoenix | 设计简单;有现成的开原方案ambari | phoenix兼容性,尤其是对cdh版本的;phoenix apache版本问题不大 |
opentsdb | 功能强大,基于hbase,具备聚合等强大功能;opentsd自身依赖zookeeper,依赖hbase; | opentsd自身依赖zookeeper,依赖hbase; |
mysql | 部署依赖少,甲方好接受 | 数据容量有限,可扩展性差 |
因为最近对ambari做了比较深入的研究,觉得其metric系统实现的比较精巧,正好可以为我所用,其采用的存储结构即为hbase+phoenix的结构。之前的一次POC中,甲方对于SQL支持要求较多,用到了phoenix,觉得确实是个比较强大的工具,遂决定采用该技术方案。
该方案的兼容性问题可通过安装单机版hbase一定程度解决,当然最好还是要集群版的hbase,针对phoenix对cdh的支持,我选择了cdh570和cdh513这两个我们比较常用的版本。
二。CDH570
首先做了下调研,目前cloudera 实验室已经提供了cdh570的parcel,phoenix官方也有一个jira专门解决了cdh570的兼容性问题,总体看起来问题不大。
cloudera实验室的parcel只能用于cm环境,故考虑根据jira来实现。
https://issues.apache.org/jira/browse/PHOENIX-2834
下载完代码,开始进行编译,路漫漫其修远。
遇到的第一个问题就是速度问题,maven的编译速度太慢,更换了阿里的国内源后,速度好很多。
接下来遇到的第二个问题就是编译报错,quadanalytix.artifactoryonline.com这个地址老是访问出错。经过研究发现,这个是一个私人的库需要账号密码才能访问,这算是作者埋得一个坑,当然作者在jira里面已经提到了,所以tephra这个jar包也得自己进行编译。
[ERROR] Failed to execute goal on project phoenix-core: Could not resolve dependencies for project org.apache.phoenix:phoenix-core:jar:4.7.1-HBase-1.2-cdh-SNAPSHOT: Failed to collect dependencies at co.cask.tephra:t
hra-api:jar:0.7.1-SNAPSHOT: Failed to read artifact descriptor for co.cask.tephra:tephra-api:jar:0.7.1-SNAPSHOT: Could not transfer artifact co.cask.tephra:tephra-api:pom:0.7.1-SNAPSHOT from/to quadanalytix (https:/
uadanalytix.artifactoryonline.com/quadanalytix/repo): Connect to quadanalytix.artifactoryonline.com:443 [quadanalytix.artifactoryonline.com/34.207.22.79, quadanalytix.artifactoryonline.com/107.23.217.190] failed: Co
ection timed out: connect -> [Help 1]
[ERROR]
tephra这个代码下载完后编译也遇到了上面的问题,这里要把作者的库地址删除掉,我是把jar包全install到了本地,如果有nexus本地库也可以直接install到库里面。
搞定了tephra后,这是就可以继续编译phoenix了,经过了周末一天的奋战,终于package并install成功。首先使用sqline.py测试,发现出现问题,会一直卡住。按照phoenix官方文档,将server的jar包拷到hbase的lib目录,重启hbase。更换项目里面的phoenix-core的版本,访问数据发现同样报错。具体报错 为scan类找不到,而且出现错误行和实际代码对不上。
迷茫了一阵,将cloudera的parcel下载下来,并尝试进行解压,得到jar包,替换到hbase进行测试,用sqlline访问,成功。对jar包直接进行测试,也可以访问,但在整合到项目的过程中,出现了很多jar包版本冲突的问题,自从使用了maven很久没有解决此类问题了,考虑到后续的灵活性,决定还是自己编译,不再在这上面花费时间,cloudera的parcel最起码说明cdh570的支持是没有问题的。
再度仔细研究官方的编译文档,发现一个编译参数里面有一个hadoop.profile=2 的参数,用来支持hadoop2x,加上该参数后,编译报错。
IndexMasterObserver.java:[42,8] 无法访问org.apache.hadoop.hbase.procedure2.ProcedureEx
ecutor
找不到org.apache.hadoop.hbase.procedure2.ProcedureExecutor的类文件
查看源代码,未发现两个类之间的关联,ProcedureExecutor为确实在hbase-cdh570的项目里面,更具体是在hbase-procedure工程里面,而且项目的依赖包里面也有hbase-procedure的jar包。
通过
http://hbase.apache.org/devapidocs/org/apache/hadoop/hbase/master/package-summary.html
官网api doc查找 ProcedureExecutor的依赖关系,发现确实和IndexMasterObserver的基类的方法有关联。仔细查看IndexMasterObserver所在的项目pom文件确实没有定义hbase相关的依赖,添加hbase-procedure依赖后解决。分析认为,应该是依赖的先后关系导致。
使用编译后的jar包测试,程序访问成功,sqlline访问依然会卡住。
到此,cdh570的兼容问题初步解决。
这里有个题外篇,因为我们使用的是jenkins打包,打包时老是报找不到编译的jar包。我已经在setting文件里面指定了库的位置,但依然无法访问,查看jenkins进程,发现jenkins是以jenkins用户来访问的,而我的库放在了root权限目录下,修改目录权限后解决。
三。后续
后续对于phoenix的持续稳定性还要进行观察,到目前位置,phoenix出现过一次问题,其中一个表出现了region hole,访问会抛出org.apache.hadoop.hbase.NotServingRegionException ;该问题通过
hbase hbck -fix解决,
参考博客http://blog.youkuaiyun.com/d6619309/article/details/51509085。
后续还将对cdh513的兼容性进行处理。
欢迎大家讨论。