本文于 2024 年 12 月 10 日再次更新,对标最新的 StarRocks 3.4 版本。
鉴于经常有人问我 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 安装 Thrift 是没有 0.20 这个版本的,需要使用如下命令:
brew tap-new $USER/local-tap
brew tap homebrew/core --force
brew extract --version='0.20.0' thrift $USER/local-tap
brew install thrift@0.20.0
你可以使用如下命令检查 Thrift 是否安装成功:
$ thrift -version
Thrift version 0.20.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
评论列表(55条)
大佬,请教个问题,本机拉社区开发环境镜像,容器里编译之后可以用这种方式 debug 吗
@llz:可以的,你保证端口通就行了。
@Smith:请教大佬,我试了下 fe 的远程 debug 方法,发现在执行 start_fe.sh 之后, idea 貌似可以连上容器里进程,显示“已连接到地址为 ”localhost:5005’,传输: ‘套接字” 的目标虚拟机”,后续是要做什么操作吗,我看 fe 没完全起来, 9030 端口连不上, fe.out 显示“notify new FE type transfer: UNKNOWN”, fe.log 显示:
2024-12-11 10:05:52.451Z WARN (UNKNOWN 172.17.0.2_9010_1733885442811(-1)|1) [GlobalStateMgr.waitForReady():1185] It took too much time for FE to transfer to a stable state(LEADER/FOLLOWER), it maybe caused by one of the following reasons: 1. There are too many BDB logs to replay, because of previous failure of checkpoint(you can check the create time of image file under meta/image dir). 2. Majority voting members(LEADER or FOLLOWER) of the FE cluster haven’t started completely. 3. FE node has multiple IPs, you should configure the priority_networks in fe.conf to match the ip record in meta/image/ROLE. And we don’t support change the ip of FE node. Ignore this reason if you are using FQDN. 4. The time deviation between FE nodes is greater than 5s, please use ntp or other tools to keep clock synchronized. 5. The configuration of edit_log_port has changed, please reset to the original value. 6. The replayer thread may get stuck, please use jstack to find the details.
2024-12-11 10:05:54.458Z INFO (UNKNOWN 172.17.0.2_9010_1733885442811(-1)|1) [GlobalStateMgr.waitForReady():1181] wait globalStateMgr to be ready. FE type: INIT. is ready: false
@llz:你设置了 fe.conf 里面的 priority_networks 了吗。看起来是机器同时绑定了多个 IP,FE 不知道认哪个了。
@Smith:感谢大佬,确实是 ip 问题,我在配 clion Toolchains 时,发现社区镜像里没有 /usr/bin/ninja,他这是用啥编的,这样的话要装一个吗,另外文章图里 /usr/bin/c 是指 /usr/bin/cc 吗
@llz:有些地方是 gcc 和 g++,具体看情况。ninja 没有你可以用 make 代替,都一样。toolchain 主要是方便 clion 正确解析代码,又不会真的编译。
大佬,请教个问题,目前FILETable读取csv,没有使用状态机处理数据,存在异常数据列,这个怎么处理啊
@zx:bug 的会只能反馈给 sr 社区修了,或者自己修
2024年12月亲测用mac来直接brew install thrift是0.21.0版本,跟fe的代码不兼容,还是得手动下载thrift0.13.0才行
@lmz:不可能,你拉的是 main 的代码吗
@lmz:我知道了,你得用 thrift 0.20,FE 用的是 thrift 0.20。brew 默认最新安装的是 0.21。
在 ubuntu 机器下 ,toolchain 也要配置一个远程的吗?本机的当作远程 ? 还是可以直接本地 clion 打开使用
@nou:想要在 ubuntu 系统里直接用 clion 启动调试 , 源码已经编译好了
@nou:你也只能远程,因为 start_backend.sh 脚本里面做了很多前置工作,Clion 是不会给你做的。
cn 节点要配置也是这样吗大佬
@zx:cn 和 be 的代码是一起的,一样的。
@Smith:确实一样,用3.2/3.3编译的结果 gdbserver都连接不上,can’t read symbols: file format not recognized.这个是gdb 版本的问题吗
@zx:你要编译 Debug 版本,Release 版本 be 的符号表被 strip 掉了。
@Smith:BUILD_TYPE=Debug ./build.sh –be
@Smith:是这样编译的 应该没问题啊,之前2.5的都可以 BUILD_TYPE=Debug ./build.sh –be –enable-shared-data 我用gdb client 直接target就会报错,好奇怪
@Smith:装了gdb 12 ,还是这个报错can’t read symbols: file format not recognized.
@zx:靠自己研究下吧,我也不知道了,没遇到过。
@zx:你 gdb 要 12 吧,或者你用 lldb 试试。
@Smith:嗯嗯,我再研究下,多谢
老哥 , starrocks 开发主机有啥推荐,
@nou:你说云服务器吗?搞个内存大点的 ubuntu 都可以吧,或者拿自家电脑。
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 看看吗