StarRocks源码编译
这个需求挺奇葩的,老板想要把SQL命令:SHOW VARIABLES,显示的内容,比如 version_comment、version 等修改掉,目的就是对外提供数据的时候,不让别人看到数据库信息(对外提供数据的时候,不是通过接口方式,而是直接提供数据库连接,我也是醉了)。为了这个,不惜修改源码也要实现,这不是难为我了吗。
1 | ---- 尝试修改环境变量,失败了,ERROR 1064 (HY000): Variable 'version_comment' is a read only variable |
1.MySQL 系统变量(system variables)
2.系统变量 version_comment 用于显示 StarRocks 的版本。不可更改。
3.StarRocks 源码导读一 StarRocks CBO 优化器、StarRocks 向量化执行器,感觉已经超出我的认知范围了
1.Docker中编译安装
经过我长时间的尝试和修改(大约两三天),我最终还是没有实现成功的自己搭建编译环境,我觉得要是自己搭建编译环境还是有一定的难度的,会遇到各种各样的问题,比如 protobuf、zlib问题,还有其他问题,比如我下面列举的,我一一解决,最后还是有解决不完的问题,总是缺少这个,缺少那个,我真是烦透了,所以我最后还是放弃了自己搭建编译环境。
官方提供了Docker编译环境,应该是把需要的依赖什么的都安装好了,只需要上传源码就可以了,真的太丝滑了,我都开始怀疑我花了两天时间搞本地编译,到底价值何在呢?
1 | ## 1.下载docker(已有可以忽略) |
注意
使用官方的docker进行编译的时候,内存占用特别的厉害,我16G的电脑,都扛不住。
1.第1.1章:StarRocks部署–源码编译 这里除了源码编译,还有一些解释说明
2.dev-env image 使用说明 官方的文档
3.Doris系列2-Doris编译和安装 使用Docker 镜像编译安装Doris
4.StarRocks FE开发环境搭建 这个主要就是上面的命令,我觉得这样写,还是简单方便的
5.Apache Doris技术实践 这篇文章介绍的Doris的安装,部署还有在美团的应用,可以好好的看一看。
问题
使用官方的Docker镜像编译,看来也不是一帆风顺,遇到的第一个问题和第二个问题可以合并解决。
(1) Could not transfer artifact org.apache.maven.plugins:maven-checkstyle-plugin:pom:3.1.1 from/to spring-plugins (https://repo.spring.io/plugins-release/)
这个问题,意思就是无法下载依赖包。我尝试设置了maven的中央仓库指向 阿里云,重新执行编译工作,还是报错。
1 | Plugin org.apache.maven.plugins:maven-checkstyle-plugin:3.1.1 or one of its dependencies could not be resolved: Failed to read artifact descriptor for org.apache.maven.plugins:maven-checkstyle-plugin:jar:3.1.1: Could not transfer artifact org.apache.maven.plugins:maven-checkstyle-plugin:pom:3.1.1 from/to spring-plugins (https://repo.spring.io/plugins-release/): Transfer failed for https://repo.spring.io/plugins-release/org/apache/maven/plugins/maven-checkstyle-plugin/3.1.1/maven-checkstyle-plugin-3.1.1.pom: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty -> [Help 1] |
这里显示,这个插件必须要用户名密码才能下载,我打开了上面的链接,确实是需要用户密码的。但是奇怪的是,我在本机的代码中,单独编译fe这个模块,竟然不会报这个错误,虽然也无法编译通过,但是没有报需要认证这个错误。我尝试降低版本,也是不行的,总是报错。
【无效尝试】
我尝试了很多的方法,似好都不起作用
- 1.重新下载版本
- 2.重新挂载.m2目录
- 3.设置代理
我甚至修改了源码中的关于 maven-checkstyle-plugin 的引用,直接删掉了部分内容,虽然暂时的解决了无法编译 maven-checkstyle-plugin,不过又出现了新的问题。
1.最快的 maven repository–阿里镜像仓库
2.2021最新 Maven之阿里云镜像仓库配置
3.docker doris(0.13) 编译100%报错 sh build.sh报错
4.Doris源码编译(填坑) 这里是修改了pom.xml,改成了现在的样子,spring-plugins改成了cloudera-public,但是还是报错
5.Resolving Maven “trustAnchors parameter must be non-empty” error
(2) Could not transfer artifact org.codehaus.plexus:plexus-utils:pom
和上一个问题是一模一样的问题,这个问题也是认证的问题,这个到底是什么问题呢?虽然上个问题我通过注释掉 maven-checkstyle-plugin 这个插件解决了,但是不能全部无法下载的依赖都进行删除吧。
1 | Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project fe-common: Execution default-compile of goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile failed: Plugin org.apache.maven.plugins:maven-compiler-plugin:3.1 or one of its dependencies could not be resolved: Failed to collect dependencies at org.apache.maven.plugins:maven-compiler-plugin:jar:3.1 -> org.apache.maven:maven-artifact:jar:2.0.9 -> org.codehaus.plexus:plexus-utils:jar:1.5.1: Failed to read artifact descriptor for org.codehaus.plexus:plexus-utils:jar:1.5.1: Could not transfer artifact org.codehaus.plexus:plexus-utils:pom:1.5.1 from/to spring-plugins (https://repo.spring.io/plugins-release/): Transfer failed for https://repo.spring.io/plugins-release/org/codehaus/plexus/plexus-utils/1.5.1/plexus-utils-1.5.1.pom: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty -> [Help 1] |
[解决]
主要就是因为缺少安全证书导致的,在打包的时候可以跳过ssl认证。
1 | ## 进入fe目录 |
1.IDEA打包Maven项目失败-InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty 从maven仓库(http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/surefire/surefire-junit4/2.12.4/surefire-junit4-2.12.4.pom)下载依赖用的https协议,所以需要用到CA。
这个问题是由于HTTPS的安全认证问题导致无法从远程仓库下载依赖
2.How to fix Java Error “The trustAnchors parameter must be non-empty” while building Maven Single Jar
3.the trustAnchors parameter must be non-empty 我提了issue,希望有人能出来解决,我自己解决了
4.使用Openjdk8和maven时出错:java.security.InvalidAlgorithmParameterException 这里使用的是openjdk8时出现了问题,openjdk缺少安全证书,通过以下方式追加 -Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true
5.Maven: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
(3) image does not exist: /cloud/soft/starrocks/output/fe/meta/image/image.0
源码编译之后,部署 fe 的时候,启动日志中出现了这个问题。
【解决】
其实我觉得可能不需要解决,如果非要做了什么的话,就是 修改了 fe/conf/fe.conf 中的 meta_dir 注释打开了。
1.5.4 部署FE,报错找不到IMAGE.0
2.编译完成
编译完成后,产出文件在output/目录中
3.windows开发问题
在windows上打开idea编译fe模块的时候,无法编译成功,显示 thrift did not exit cleanly.
(1) 下载
下载 thrift.exe 程序,记得重命名,放到 自定义目录中,我这里放到了 D:\soft\thrift 目录
(2) 设置环境变量
在系统的环境变量中,添加 D:\soft\thrift 目录。
1.解决thrift:compile编译报错问题thrift failed error: /bin/sh 1. 系统环境变量配置的有问题(调整thrift的环境变量目录配置,在PATH后加入thrift编译后的可执行文件) 2. 系统环境变量没有问题,但是IDE运行时读取的环境变量有问题
2. Thrift did not exit cleanly
3.Thrift开发 之 windows上安装 下载,重命名,并添加环境变量
4.编译Broke
作为备份和恢复的Broke需要单独的编译,进入到目录之后,执行build.sh编译就可以了。编译后,产出文件在fs_brokers/apache_hdfs_broker/output目录中
1 | cd fs_brokers/apache_hdfs_broker/ && sh build.sh |
4.手动安装编译环境
我刚开始使用的是手动编译环境,就是在一个CentOS8的环境中,安装一些依赖然后进行编译,简直要痛苦死了,最后没有编译成功,放弃了。
1.编译环境搭建
我的虚拟机是CentOS8,需要的环境:
- python 2.7+
- java 1.8+
- gcc
- cmake
- gcc-c++
1 | ## 安装python |
1.Linux设置默认Python版本
2.linux 安装gcc和 g++
3.【Linux】Linux下安装gcc/g++
4.如何在CentOS 8上安装CMake 源码编译
5.cmake: symbol lookup error: cmake: undefined symbol: archive_write_add_filter_zstd 两种解决方法 两种方法:1.安装 libarchive;2.安装低版本或者高版本的 cmake。
6.在 CentOS 上安装 GCC 安装一系列的开发包
2.下载第三方依赖包
由于编译的时候,需要一些外部依赖包,但是因为墙的存在,所以可能会出现 429 错误,下载 OpenSSL_1_1_1m.tar.gz 文件,放置到 源码目录 thirdparty/src 文件夹下。如果其他的下载也出现了问题,可以重新执行 ./build.sh 命令,或者是下载相应的资源包到该文件夹下。
1.ERROR 429: Too Many Requests. 下载 OpenSSL_1_1_1m.tar.gz 的时候,会出现这个问题,主要就是墙的问题。
(1) patch: command not found
1 | yum -y install patch |
(2) byacc: command not found
1 | yum install byacc |
(3) flex: command not found
1 | yum -y install flex |
(4) libtoolize: command not found
1 | yum -y install libtool |
(5) Failed to build B2 build engine
依赖安装之后,出现了这个问题:
1 | A C++11 capable compiler is required for building the B2 engine. |
这个意思是要兼容c++11的编译器。
【尝试】
我重新安装了开发工具包
1 | ## 安装gcc-c++ |
1.how to enable c++11 in linux
2.linux g++开启C++11/14支持
3.linux 下安装g++报错:No match for argument: g++
(6) but no working zlib library was found
这里显示,没有可用的zlib,不是没有zlib命令,所以即便是使用了yum安装了zlib-devel也可能出现这个问题。
1 | checking for library containing zlibVersion... no |
【解决】
我暂时修改了编译源码,把 thirdparty/build-thirdparty.sh 中的 build_protobuf 代码部分的 –with-zlib –with-zlib-include=${TP_INSTALL_DIR}/include 配置去掉了。
1.编译过程报错:没有可用的zlib,要怎么解决? 这里直接建议使用官方的 Docker image 进行编译
2.Failing check for library containing zlibVersion during install
3.protobuf学习(一)– 安装protobuf
4.编译安装protobuf 详细步骤 Ubuntu
5.How to fix fatal error: zlib.h: no such file or directory? 这篇文章没啥用我感觉
(7) unrecognized option: `-j13’
这个问题我不知道怎么产生的,我以为是java版本的问题,因为我使用的jdk就是openjdk13,我重新安装了jdk1.8,好像还是不行。
1 | configure: WARNING: you should use --build, --host, --target |
这个问题是我修复上个问题产生的,我删除zlib的时候,把make位置放错了。
(8) cannot find /usr/lib64/libatomic.so.1.2.0
1 | /usr/bin/ld: cannot find /usr/lib64/libatomic.so.1.2.0 |
[解决]
1 | ## 安装依赖 |
[错误方法]
1 | ## 使用下面的方法可能还是报错 |
(9) /usr/bin/ld: cannot find -lstdc++
1 | /usr/bin/ld: cannot find -lstdc++ |
[解决]
1 | yum install -y libstdc++* |