基于cdh570的phoenix编译

一。背景

近日重构产品的监控告警系统,原来是基于hbase实现,做的比较粗糙,无法实现数据聚合等功能,遂决定重构。
原来基于hbase实现,所有的读取代码也都是用的原生hbase api获取,除了冗余度问题外,还有就是可维护性较差,遂决定变更存储方案。
通过筛选,有以下几种方案。

\优点缺点
hbase兼容性较好设计复杂,统计需求复杂,可维护性差
hbase+phoenix设计简单;有现成的开原方案ambariphoenix兼容性,尤其是对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的兼容性进行处理。

欢迎大家讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值