鉴于经常有人问我 StarRocks 的开发环境如何搭建,这里本人写一篇教程,方便大家跟着 step-by-step。
什么叫完美?
- 支持一键编译 BE 和 FE。
- Clion,IDEA 均支持代码跳转。
- IDE 全部变量能正常解析,不会出现红线。
- Clion 可以正常启用其 analyze 功能。
- 支持 FE 和 BE 的 Debug。
环境准备
鄙人使用环境是,本地开发一台 Mac,远程一台服务器(使用 Ubuntu 22 版本,内存需要至少 16G)。
整体思路是在 Mac 上面写代码,然后通过 IDE 的代码自动同步到服务器,使用服务器对 StarRocks 进行编译和开发。
Mac 环境配置
Thrift 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 1.8 or 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 ccache 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
目录下面。
开始编译
执行如下命令:
export STARROCKS_THIRDPARTY=/root/starrocks/thirdparty
设置 thirdparty 搜索路径,然后就可以开始一键编译了。
cd starrocks/
./build.sh
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
建议先在 FE 中 mvn install -DskipTests
一次,确保 gensrc 目录下的 thrift 和 protobuf 被正确编译。
执行完后,你还需要进入 gensrc
目录,分别执行 make clean
和 make
命令,否则 Clion 会无法正确识别 thrift 文件。
用 Clion 打开 be 目录。
进入 Settings,添加 Toolchains。添加个远程服务器就行了,设置下 Build Tool,C 和 C++ Compiler 就行了。
在 Settings 里面,设置 Deployment。修改下 Mappings 就行了。
在 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 和远程服务器同步一会后,就能正常工作代码跳转了。
Debug
BE debug 不和 FE 一样按钮点点,就能直接运行了,你只能去服务器里面用 gdb 跑。当然 gdb server + Clion remote gdb 也行,不过我不这么干,太卡了。方法与 FE 类似,修改 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 倍。
总结
就说到这里吧,感觉自己也懒得写很详细的教程,估计工作太忙了吧。主要感觉这东西没啥技术含量,没啥分享欲望。会的人不需要看,不会的人看了也不会。
参考
自己博客以往的文章。
你买的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/
是哪个环境变量有问题?
忽略,mappings配置后没有保存
ok
假设有多个分支一起开发的,这种方式在哪个机器(本地/远程机)切换分支?
目前没什么好办法,两边都用 git checkout branch。。。
没看明白,这里那一步让 Clion 代码能正常跳转了?
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
……
感觉像 gcc 版本太低的问题了,你能升级到 gcc 11 看看吗