注意本文讲述的是在linux(centos)下kylin的编译
准备条件:
git、maven,node.js 这里不再讲述git与maven的安装
kylin的编译中需要node.js的插件及相关命令
wget https://nodejs.org/dist/v10.9.0/node-v10.9.0-linux-x64.tar.xz // 下载node.js,版本可自己选择
tar xf node-v10.9.0-linux-x64.tar.xz // 解压
cd node-v10.9.0-linux-x64/ // 进入node的bin目录
ln -s /usr/software/nodejs/bin/npm /usr/local/bin/ ln -s /usr/software/nodejs/bin/node /usr/local/bin/ //建立node与npm命令的软连接,此时我已把
node-v10.9.0-linux-x64名称修改为 ndoejs
操作完之后在其他目录直接执行 node -v 能查看到node.js版本
一、下载kylin源代码
方式1:
git clone https://github.com/apache/kylin kylin
但此种方法只能得到现在kylin最新版本的源代码,如果希望得到kylin历史版本源码见方式2
方式2:访问kylin官网 http://kylin.apache.org/,在下载页面最底部找到“Previous Release” 以前版本下载
在此地址里可找到kylin所有的历史版本 https://archive.apache.org/dist/kylin/,找到你要下载的版本X.X.X,下载
apache-kylin-X.X.X-source-release.zip 该版本的源代码即可
二 、解压
unzip apache-kylin-X.X.X-source-release.zip
三 、编译
1、进入到解压好的目录 apache-kylin-X.X.X
执行命令 mvn clean install -DskipTests
2、cp -r server/src/main/webapp/WEB-INF webapp/app/WEB-INF
3、依次执行如下命令
(1)cd webapp
(2)npm install -g bower 执行完此命令后,会在上面node.js的目录下装好bower,
(3)建立bower命令的软连接 ln -s /usr/software/nodejs/bin/bower /usr/local/bin/
(3)bower --allow-root install
四、打包
进入到 apache-kylin-X.X.X目录中 执行 build/script/package.sh -P cdh60 ,-P参数是执行要打包成的版本,可以使cdh57,hadoop3,hbase1x等
注意此步骤中可能遇到“build/script/build.sh: line 34: grunt: command not found”错误,主要是grunt命令没有找到
在打包过程中脚本已经帮你下载了grunt,同样到node.js的bin目录下配置软连接
ln -s /usr/software/nodejs/bin/grunt /usr/local/bin/ ,再次执行打包命令即可
五,查看包
上面都执行完成后可在 apache-kylin-X.X.X根目录下找到dist文件夹,进入可看到打包好可安装文件 apache-kylin-X.X.X-bin.tar.gz
番外:
我此次打包编译kylin包,主要是为了解决kylin的一个bug,bug报错如下:
2019-09-18 20:22:54,917 WARN [kylin-coproc--pool6-t6] : Call failed on IOException2019-09-18 20:22:54,917 WARN [kylin-coproc--pool6-t6] : Call failed on IOExceptioncom.google.protobuf.InvalidProtocolBufferException: Protocol message was too large. May be malicious. Use CodedInputStream.setSizeLimit() to increase the size limit. at com.google.protobuf.InvalidProtocolBufferException.sizeLimitExceeded(InvalidProtocolBufferException.java:110) at com.google.protobuf.CodedInputStream.refillBuffer(CodedInputStream.java:755) at com.google.protobuf.CodedInputStream.isAtEnd(CodedInputStream.java:701) at com.google.protobuf.CodedInputStream.readTag(CodedInputStream.java:99) at org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos$CubeVisitResponse.(CubeVisitProtos.java:2307) at org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos$CubeVisitResponse.(CubeVisitProtos.java:2271) at org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos$CubeVisitResponse$1.parsePartialFrom(CubeVisitProtos.java:2380) at org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos$CubeVisitResponse$1.parsePartialFrom(CubeVisitProtos.java:2375) at org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos$CubeVisitResponse$Builder.mergeFrom(CubeVisitProtos.java:5101) at org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos$CubeVisitResponse$Builder.mergeFrom(CubeVisitProtos.java:4949) at com.google.protobuf.AbstractMessage$Builder.mergeFrom(AbstractMessage.java:337) at com.google.protobuf.AbstractMessage$Builder.mergeFrom(AbstractMessage.java:267) at com.google.protobuf.AbstractMessageLite$Builder.mergeFrom(AbstractMessageLite.java:210) at com.google.protobuf.AbstractMessage$Builder.mergeFrom(AbstractMessage.java:904) at com.google.protobuf.AbstractMessage$Builder.mergeFrom(AbstractMessage.java:267) at org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.getResponse(CoprocessorRpcUtils.java:141) at org.apache.hadoop.hbase.client.RegionCoprocessorRpcChannel.callExecService(RegionCoprocessorRpcChannel.java:94) at org.apache.hadoop.hbase.client.SyncCoprocessorRpcChannel.callMethod(SyncCoprocessorRpcChannel.java:52) at org.apache.kylin.storage.hbase.cube.v2.coprocessor.endpoint.generated.CubeVisitProtos$CubeVisitService$Stub.visitCube(CubeVisitProtos.java:5616) at org.apache.kylin.storage.hbase.cube.v2.CubeHBaseEndpointRPC$1$1.call(CubeHBaseEndpointRPC.java:246) at org.apache.kylin.storage.hbase.cube.v2.CubeHBaseEndpointRPC$1$1.call(CubeHBaseEndpointRPC.java:242) at org.apache.hadoop.hbase.client.HTable$12.call(HTable.java:997) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748)
解决办法,修改kylin 类 CubeVisitProtos.java源代码,重新编译后把class文件替换到已在运行的kylin服务的包中,注意此时替换的目录是 ../apache-kylin-X.X.X/tomcat/webapps/kylin/WEB-INF/lib ,bug解决方案可见 https://issues.apache.org/jira/browse/KYLIN-3973