本文于 2024 年 7 月 9 日再次更新,对标最新的 StarRocks 3.3 版本。
鉴于经常有人问我 StarRocks 的开发环境如何搭建,怎么自己编译 StarRocks?这里本人写一篇教程,方便大家跟着 step-by-step。
首先定义什么叫完美?
- 支持一键编译 BE 和 FE。
- Clion,IDEA 均支持代码跳转。
- IDE 全部变量能正常解析,不会出现红线。
- Clion 可以正常启用其 analyze 功能。
- 支持 FE 和 BE 的 Debug。
环境准备
鄙人使用环境是,本地开发一台 Mac,远程一台服务器(使用 Ubuntu 22 版本,内存需要至少 24G)。
整体思路是在 Mac 上面写代码,然后通过 IDE 的代码自动同步到服务器,使用服务器对 StarRocks 进行编译和开发。
Mac 环境配置
Thrift 0.20
最新 StarRocks 的 thrift 已经被我升级到了 0.20 版本,是目前最新版本,所以很好安装。直接 brew install thrift
就行了。
Thrift 0.13,过去老版本 StarRocks 使用的是 0.13,这里继续放着,仅供参考
直接用 brew 安装 Thrift 是没有 0.13 这个版本的,可以用如下命令:
现在 brew 好像已经把 0.13 版本下了,我忘了自己怎么装的,大家自己想想办法吧:)
brew tap-new $USER/local-tap
brew extract --version='0.13.0' thrift $USER/local-tap
brew install thrift@0.13.0
你可以使用如下命令检查 Thrift 是否安装成功:
$ thrift -version
Thrift version 0.13.0
Protobuf
直接用最新版 v3 的即可,因为最新版的 Protobuf 兼容 StarRocks 中 v2 版本的 Protobuf 协议。
brew install protobuf
Maven
brew install maven
Openjdk 11
brew install openjdk@11
Python3
MacOS 自带,无需安装。
相关环境变量
export JAVA_HOME=xxxxx
export PYTHON=/usr/bin/python3
服务器 Ubuntu 22 环境配置
下载 StarRocks 代码
git clone https://github.com/StarRocks/starrocks.git
系统组件安装:
sudo apt update
sudo apt install gcc g++ maven openjdk-11-jdk python3 python-is-python3 unzip cmake bzip2 ccache byacc flex automake libtool bison binutils-dev libiberty-dev build-essential ninja-build
添加 JAVA_HOME 环境变量
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
拷贝 thirdparty 到本地
第一次编译需要下载编译 thirdparty,所以耗时比较长,自己解决网络问题。
第一次编译必须使用 gcc,因为目前 thirdparty 的编译 clang 编不过。
现在强烈建议大家直接从官方的 docker 镜像里面拷贝 thirdparty,自己编译费劲,还不一定成功。
Ubuntu docker image:docker pull starrocks/dev-env-ubuntu
Centos docker image:docker pull starrocks/dev-env-centos7
我一般都是自己挂载一个目录到 docker 里面,然后拷贝:
sudo docker run -it -v /root/starrocks/thirdparty:/root/thirdparty --name smith-dev --rm starrocks/dev-env-ubuntu bash
Thirdparty 目录在 docker image 里面的 /var/local/thirdparty
目录下面,把它拷贝出来。
开始编译
执行如下命令设置 thirdparty 搜索路径:
export STARROCKS_THIRDPARTY=/root/starrocks/thirdparty
然后就可以开始一键编译了。
cd starrocks/
# 编译 Release 版本
BUILD_TYPE=Release ./build.sh
# 编译 Debug 版本
BUILD_TYPE=Debug ./build.sh
# 编译 Asan 版本
BUILD_TYPE=Asan ./build.sh
日常开发个人建议编译 asan 版本,能有效提早发现代码的 bug。
IDE 设置
FE
FE 其实最简单,因为 mac 自己本身就能够编译,进入到 fe
文件夹,执行 mvn install -DskipTests
即可编译成功。
然后用 IDEA 打开 fe
目录即可,没有问题。
本地 debug
你自己断点点一下就行了,和普通 java 程序一致。
远程 debug
现在按照如下命令启动 FE,即可一键开启 remote debug:./start_fe.sh --debug
。
JVM 的默认 Debug 端口是 5005。
以前的远程 debug 方法(已不需要)
修改 ubuntu 服务器中的 start_fe.sh
文件,加入 remote jvm debug 参数。
把
if [ ${RUN_DAEMON} -eq 1 ]; then
nohup $LIMIT $JAVA $final_java_opt com.starrocks.StarRocksFE ${HELPER} ${HOST_TYPE} "$@" >> $LOG_DIR/fe.out 2>&1 </dev/null &
else
$LIMIT $JAVA $final_java_opt com.starrocks.StarRocksFE ${HELPER} ${HOST_TYPE} "$@" >> $LOG_DIR/fe.out 2>&1 </dev/null
fi
改为
if [ ${RUN_DAEMON} -eq 1 ]; then
nohup $LIMIT $JAVA $final_java_opt com.starrocks.StarRocksFE ${HELPER} ${HOST_TYPE} "$@" >> $LOG_DIR/fe.out 2>&1 </dev/null &
else
$LIMIT $JAVA $final_java_opt -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 com.starrocks.StarRocksFE ${HELPER} ${HOST_TYPE}
fi
即可。
这样可以使得 start_fe.sh --daemon
仍为正常启动,start_fe.sh
则开启 remote debug 模式。
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
这个参数是从 IDEA 里面复制出来的。
之后就 remote jvm debug 就行了,和普通 java 程序没有区别。
BE
进入 gensrc
目录,分别执行 make clean
和 make
命令,否则 Clion 会识别不到 thrift 的 CPP 文件。
执行完后,用 Clion 打开 be 目录。
进入 Settings,添加 Toolchains。添加个远程服务器就行了,设置下 Build Tool,C 和 C++ Compiler 就行了。
在 Settings 里面,设置 Deployment,修改下 Mappings,把本地的 be 目录和 Ubuntu 上面的 be 目录对应上。
在 Settings 里面,设置 Cmake。修改 Toolchain 为刚刚添加的远程 Toolchain。
并且在 Environment 中添加如下环境变量:
JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
STARROCKS_GCC_HOME=/usr/
STARROCKS_THIRDPARTY=/root/starrocks/thirdparty
其中注意不要勾选 Include system environment variables
。
自此,就全部设置完成。Clion 会自动从 Ubuntu 上面下载 thirdparty 的 header 到本地,然后 Clion 就能正常代码跳转了。
Debug
BE debug 不和 FE 一样按钮点点,就能直接运行了,你只能去服务器里面用 gdb 跑。当然 gdb server + Clion remote gdb 也行,不过我不这么干,太卡了。修改 start_backend.sh
启动脚本就行了。
从
if [ ${RUN_DAEMON} -eq 1 ]; then
nohup ${START_BE_CMD} "$@" </dev/null &
else
exec ${START_BE_CMD} "$@" </dev/null
fi
改为
if [ ${RUN_DAEMON} -eq 1 ]; then
nohup ${START_BE_CMD} "$@" </dev/null &
else
gdb ${START_BE_CMD}
fi
即可。
然后执行 ./output/be/bin/start_be.sh
就自动通过 gdb 进行调试了。
如果遇到数据湖查询 gdb 报错,在 ~/.gdbinit
中添加 handle SIGSEGV nostop noprint pass
即可。
LLVM
Ubuntu 安装 LLVM 参考:https://apt.llvm.org/
然后用 CC=clang-15 CXX=clang++-15 ./build.sh
编译就行了,前提是你的 thirdparty 已经用 gcc 编译完了。
LLDB 来 debug BE 有特别加成,载入符号表的速度是 gdb 的 n 倍。
总结
如果还有问题,可以在下方评论留言。
就说到这里吧,感觉自己也懒得写很详细的教程,估计工作太忙了吧。主要感觉这东西没啥技术含量,没啥分享欲望。会的人不需要看,不会的人看了也不会。
参考
自己博客以往的文章。
原创文章,作者:Smith,如若转载,请注明出处:https://www.inlighting.org/archives/setup-perfect-starrocks-dev-env
评论列表(29条)
sudo apt install gcc g++ maven openjdk-11-jdk python3 python-is-python3 unzip cmake bzip2 ccache byacc ccache flex automake libtool bison binutils-dev libiberty-dev build-essential ninja-build,多谢了一遍ccache ?
@qingzhong:感谢,更正了
补充:如果通过CentOS7系统进行BE源码编译,除从上面提到的centos7 docker容器中复制thirdparty/installed目录到系统本地外,还需提前安装GCC 10.3.0、ninja和7.8以上版本的gdb(Clion会提示):
https://blog.csdn.net/weixin_43211634/article/details/119780868
https://blog.csdn.net/juluwangriyue/article/details/114382480
@书忆江南:其实现在 SR 已经能用 GCC 11,12 来编译了。10.3.0 也算有点老了。
@Smith:原来如此,我看到docker容器中是10.3.0,就按容器里的各依赖版本装了
@书忆江南:你可以看看 sr 官方的 ubuntu 容器,里面的 GCC 版本就高了。
之所以 centos7 还在用 10.3.0 是因为貌似 centos7 yum 只能装到 gcc 10?
不过现在都在往 ubuntu 转了,centos7 已经 EOL 了。
@Smith:原来是这样,那看来后面用ubuntu容器会更好点,感谢大佬
[…] StarRocks perfect IDE development setup (Support IDEA & Clion) […]
大佬,编译完之后就只能在对应的output部分直接使用了吗,不能够移动位置吗
@zx:是的
非常感谢,我正好被thirdparty折磨
@一个狗二:不客气哈
./output/be/bin/start_be.sh 运行这个好像不会出现 gdb 的交互吧,那怎么调试的
@nou:我的是ubuntu 系统的阿里云服务器
@nou:要改 start_backend.sh 的脚本,手动加上 gdb 的关键字。
centos docker-compose有吗|´・ω・)ノ
@finch:木有那么高级,也没必要吧
[…] 这篇文章已经 Deprecated 了,请大家看 https://www.inlighting.org/archives/setup-perfect-starrocks-dev-env […]
你买的clion吗?好用不?吃内存CPU不?
部署远程toolchain后,报错
make: *** /tmp/tmp.00r1GQjeH9/../gensrc/: No such file or directory. Stop.
CMake Error at CMakeLists.txt:138 (message):
Failed to build /tmp/tmp.00r1GQjeH9/../gensrc/
是哪个环境变量有问题?
@yhf20071:忽略,mappings配置后没有保存
@yhf20071:ok
假设有多个分支一起开发的,这种方式在哪个机器(本地/远程机)切换分支?
@danner:目前没什么好办法,两边都用 git checkout branch。。。
@Smith:没看明白,这里那一步让 Clion 代码能正常跳转了?
@danner:CMake 正常识别后就可以了
救 Java Boy老命了.
在linux中使用./build.sh编译时报这个错,怎么解决,gcc版本gcc-10.3.0
[1/996] Building CXX object CMakeFiles/build_version.dir/build_version.cc.o
FAILED: CMakeFiles/build_version.dir/build_version.cc.o
ccache /data01/public/gcc/bin/g++ -DHAVE_INTTYPES_H -DHAVE_NETINET_IN_H -DUSE_JEMALLOC -I/data01/zhoukun.1/starrocks/be/src/formats/orc/apache-orc/c++/include -I/data01/zhoukun.1/starrocks/be/src/common -I/data01/zhoukun.1/starrocks/be/src -I/data01/zhoukun.1/starrocks/be/test -I/data01/zhoukun.1/starrocks/be/../gensrc/build -I/data01/zhoukun.1/starrocks/thirdparty/installed/include/breakpad -I/data01/zhoukun.1/starrocks/thirdparty/installed/open_jdk/include -I/data01/zhoukun.1/starrocks/thirdparty/installed/open_jdk/include/linux -isystem /data01/zhoukun.1/starrocks/thirdparty/installed/include -isystem /data01/zhoukun.1/starrocks/thirdparty/installed/gperftools/include -isystem /data01/zhoukun.1/starrocks/thirdparty/installed/include/thrift -isystem /data01/zhoukun.1/starrocks/thirdparty/installed/include/event -Wall -Wno-sign-compare -Wno-unknown-pragmas -pthread -Wno-register -Wno-strict-aliasing -fno-omit-frame-pointer -std=gnu++17 -D__STDC_FORMAT_MACROS -Wno-deprecated -Wno-vla -Wno-comment -DBOOST_DATE_TIME_POSIX_TIME_STD_CONFIG -DBOOST_SYSTEM_NO_DEPRECATED -DBOOST_UUID_RANDOM_PROVIDER_FORCE_POSIX -Werror=return-type -Werror=switch -msse4.2 -mavx2 -Wno-attributes -DS2_USE_GFLAGS -DS2_USE_GLOG -faligned-new -gz=zlib -Werror -g -Wno-unused-local-typedefs -O3 -gdwarf-4 -DNDEBUG -O3 -DNDEBUG -MD -MT CMakeFiles/build_version.dir/build_version.cc.o -MF CMakeFiles/build_version.dir/build_version.cc.o.d -o CMakeFiles/build_version.dir/build_version.cc.o -c /data01/zhoukun.1/starrocks/be/build_Release/build_version.cc
g++: error: -gz is not supported in this configuration
……
@qwertt:感觉像 gcc 版本太低的问题了,你能升级到 gcc 11 看看吗