StarRocks 完美开发环境搭建

鉴于经常有人问我 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 里面复制出来的。

StarRocks 完美开发环境搭建

之后就 remote jvm debug 就行了,和普通 java 程序没有区别。

BE

建议先在 FE 中 mvn install -DskipTests 一次,确保 gensrc 目录下的 thrift 和 protobuf 被正确编译。

执行完后,你还需要进入 gensrc 目录,分别执行 make cleanmake 命令,否则 Clion 会无法正确识别 thrift 文件。

用 Clion 打开 be 目录。

进入 Settings,添加 Toolchains。添加个远程服务器就行了,设置下 Build Tool,C 和 C++ Compiler 就行了。

StarRocks 完美开发环境搭建

在 Settings 里面,设置 Deployment。修改下 Mappings 就行了。

StarRocks 完美开发环境搭建

在 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

StarRocks 完美开发环境搭建
StarRocks 完美开发环境搭建

自此,就全部设置完成。等 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 倍。

总结

就说到这里吧,感觉自己也懒得写很详细的教程,估计工作太忙了吧。主要感觉这东西没啥技术含量,没啥分享欲望。会的人不需要看,不会的人看了也不会。

参考

自己博客以往的文章。

21 条回复 A文章作者 M管理员
  1. 大佬,编译完之后就只能在对应的output部分直接使用了吗,不能够移动位置吗

    • 是的

  2. 非常感谢,我正好被thirdparty折磨

    • 不客气哈

  3. ./output/be/bin/start_be.sh 运行这个好像不会出现 gdb 的交互吧,那怎么调试的

    • 我的是ubuntu 系统的阿里云服务器

    • 要改 start_backend.sh 的脚本,手动加上 gdb 的关键字。

  4. centos docker-compose有吗|´・ω・)ノ

    • 木有那么高级,也没必要吧

  5. 你买的clion吗?好用不?吃内存CPU不?

  6. 部署远程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

  7. 假设有多个分支一起开发的,这种方式在哪个机器(本地/远程机)切换分支?

    • 目前没什么好办法,两边都用 git checkout branch。。。

    • Smith

      没看明白,这里那一步让 Clion 代码能正常跳转了?

    • CMake 正常识别后就可以了

  8. 救 Java Boy老命了.

  9. 在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 看看吗

搜索