Apache Kylin二次开发
由于工作需要,对kylin进行二次扩展,使其能支持使用Oracle作为数据源进行数据立方的构建
二次开发主要分为两部分进行
一、kylin开发环境搭建(躺坑很久)
环境搭建参考官方文档http://kylin.apache.org/cn/development/,官方文档介绍缺少了一部分,导致在后续的研究中被卡了很久(约等于两周)
官方推荐使用“HDP® 2.4 on Hortonworks Sandbox“作为调试集群,但是官网上却没有这个版本的镜像,于是使用了v2.5。两个版本的区别:v2.4版本各个大数据组件如Hbase,Hive都构建在Vmware中,所以调试的时候可以直接与虚拟机通讯; 但是V2.5所有大数据组件是构建成Docker镜像,虚拟机中Run了这个镜像,镜像Container又有自己的IP。在调试的时候,本地调试程序要先后虚拟机通讯,虚拟机在映射到docker的相应端口上(这就是问他所在)。

针对官网,我这里说一下安装步骤:
1、下载安装vmware工具
1、下载V2.5镜像文件(文件比较大15g,下载后不要删掉,当虚拟机出现故障时,可以直接删除虚拟机直接使用此文件重新安装,省去调试虚拟机问题的n多时间),双击如下图文件,会自动打开vm工具,然后选择目录安装虚拟机(注:选择一个稍微大点的盘,后续回去docker中部署kylin打包环境,需要些额外空间,如果这里盘空间选择的比较少,会导致虚拟机无法正常运行)

2、安装好后的相关操作
不用执行ambari-agent start,ambari-server start这两个命令,虚拟机启动后会自动运行这两个命令。官方说:重置ambari的admin用户密码为admin: ambari-admin-password-reset ,这里需要进入docker中运行,在虚拟机中是无法找到此命令的, 首先执行 docker exec -it sandbox bin/bash 指令,然后在执行ambari-admin-password-reset, 根据提示设置密码,建议设置成amdin/admin (kylin代码中发现有admin的踪迹,权限较高)。启动ambari后,需要手动开启Hbase

3、集群部署完成后,默认的域名为sandbox,sandbox.hortonworks.com, 这里为了方便直接去修改hosts中的信息,把虚拟机的IP映射到这个域名上 10.158.5.21 sandbox.hortonworks.com

4、配置maven(如官网)

5、下载安装spark环境

6、配置本地hadoop环境

clone Hadoop-common-bin到本地目录,并配置环境变量 HADOOP_HOME=/XX/XX指向此目录,在系统path中加入此变量,


7、下载源码,源码下周后可以不用修改Kylin.properties文件中的信息直接运行,理论上是可以连接上集群的


kylin.properties配置说明:

kylin.job.use-remote-cli=true #表示以cli的模式连接远程sandbox集群
kylin.job.remote-cli-hostname=sandbox #连接sandbox的本地域名映射, hosts中配置的如 192.168.1.1 sandbox
kylin.job.remote-cli-username=root #登录虚拟机的账号
kylin.job.remote-cli-password=xxxx #登录虚拟机的密码

8、配置Kylin启动项


9、如果单个单元进行测试,不想每次从头开始,方便集中debug某个moudle的错误,可以注释掉pom.xml中的check-style插件(java代码规范插件)

配置采坑记
在调试DebugTomcat.java启动项时,总是会报如下错误


这个错误,很顽固,各种姿势都试完都无法解决,一开始以为是集群Hbase没有正常启动,或者集群开启了权限,或者调试账号没有集群访问权限,又或者本地windows上与linux上集群通讯问题,又或者docker中运行的镜像有问题,都有尝试过,又或者本地环境配置问题,又或者kylin.propeties配置项问题,或者域名映射问题等等。前前后后花了近两周时间。以上这些尝试都无果,最终无法下手,只能调试Kylin源码获取答案。最终找到了症结所在
问题背景: kylin调试在我windows上, 在同一台windows上装了vmware,vmware中装了docker,docker运行了sandbox镜像。
通过源码调试,发现kylin无法和hbase metadataserver的端口进行通信(端口16000),至此豁然开朗。
错误原因: kylin调试的时候配置的域名是映射到vmware上, 而真正运行程序的是docker,这就需要vmare和docker之间能够互通(主要是端口上)。
通过下图知道确实在docker上,官方没有映射相关端口(这就是坑)


通过上图可以发现,在docker中并没有开发相关端口,导致在和docker通讯的时候一直无法成功
解决办法:
#hbase和zk通讯端口
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 2181 -j DNAT --to-destination 172.17.0.2:2181
#hbase master端口
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 16000 -j DNAT --to-destination 172.17.0.2:16000
#//hbase rpc端口
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 16020 -j DNAT --to-destination 172.17.0.2:16020
# hive metastore
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 9083 -j DNAT --to-destination 172.17.0.2:9083
# kylin 获取job output信息端口
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 8050 -j DNAT --to-destination 172.17.0.2:8050
#dfs.datanode.address,不配置的话会有:createBlockOutputStream when copying data into HDFS错误
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 50010 -j DNAT --to-destination 172.17.0.2:50010
#yarn.timeline-service.address 端口
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 10200 -j DNAT --to-destination 172.17.0.2:10200
驱动包配置:
需将mysql/oracle包放入到java运行环境中,即java的jre/lib/ext(D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext)中,否则会出现java找不到类等方面错误
ps:如果自己用HTable去测试和集群的连通性,需要配置 conf.set("zookeeper.znode.parent", "/hbase-unsecure"); 集群默认配置的是hbase-unsecure而不是hbase
ps2:如果还是启动不了,查看7070端口是否被占用,如果使换一个端口,或者kill掉7070占用程序,再次运行即可
完成上述端口配置,kylin终于可以成功的运行起来了。


二、源码改造,就是去研究kylin 经过Apache Calcite 生成的SQL语句如何在下发到Oracle的时候能够满足Oracle的语法(这里暂时省略)
三、打包注意事项
linux上需要安装以下组件:
Nodejs : 建议版本v10.16.0
NPM: 建议版本6.9.0 npm install npm@6.9.0 -g
Bower: 建议版本1.8.8
grunt: 建议版本v1.3.2 npm install -g grunt-cli


最后刷新环境变量:source ~/.bash_profile
