StarRocks 完美开发环境搭建

本文于 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 里面复制出来的。

image-20221223235644007

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

BE

进入 gensrc 目录,分别执行 make cleanmake 命令,否则 Clion 会识别不到 thrift 的 CPP 文件。

执行完后,用 Clion 打开 be 目录。

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

image-20221224151528803

在 Settings 里面,设置 Deployment,修改下 Mappings,把本地的 be 目录和 Ubuntu 上面的 be 目录对应上。

image-20221224001055330

在 Settings 里面,设置 Cmake。修改 Toolchain 为刚刚添加的远程 Toolchain。

image-20221224151930168

并且在 Environment 中添加如下环境变量:

JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
STARROCKS_GCC_HOME=/usr/
STARROCKS_THIRDPARTY=/root/starrocks/thirdparty

其中注意不要勾选 Include system environment variables

image-20221224151813287

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

打赏 微信扫一扫 微信扫一扫
SmithSmith
上一篇 2022年8月13日
下一篇 2023年1月20日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

评论列表(29条)

  • qingzhong
    qingzhong 2024年8月29日 下午7:50

    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 ?

  • 书忆江南
    书忆江南 2024年8月13日 上午10:46

    补充:如果通过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

    • Smith
      Smith 2024年8月13日 上午11:08

      @书忆江南其实现在 SR 已经能用 GCC 11,12 来编译了。10.3.0 也算有点老了。

    • 书忆江南
      书忆江南 2024年8月13日 下午3:32

      @Smith原来如此,我看到docker容器中是10.3.0,就按容器里的各依赖版本装了

    • Smith
      Smith 2024年8月13日 下午3:41

      @书忆江南你可以看看 sr 官方的 ubuntu 容器,里面的 GCC 版本就高了。
      之所以 centos7 还在用 10.3.0 是因为貌似 centos7 yum 只能装到 gcc 10?

      不过现在都在往 ubuntu 转了,centos7 已经 EOL 了。

    • 书忆江南
      书忆江南 2024年8月13日 下午6:33

      @Smith原来是这样,那看来后面用ubuntu容器会更好点,感谢大佬

  • […] StarRocks perfect IDE development setup (Support IDEA & Clion) […]

  • zx
    zx 2024年4月7日 下午8:56

    大佬,编译完之后就只能在对应的output部分直接使用了吗,不能够移动位置吗

  • 一个狗二
    一个狗二 2024年3月19日 下午9:13

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

  • nou
    nou 2024年3月2日 下午12:45

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

    • nou
      nou 2024年3月2日 下午1:13

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

    • Smith
      Smith 2024年3月2日 下午2:05

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

  • finch
    finch 2023年10月27日 下午5:36

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

    • Smith
      Smith 2023年10月27日 下午5:43

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

  • […] 这篇文章已经 Deprecated 了,请大家看 https://www.inlighting.org/archives/setup-perfect-starrocks-dev-env […]

  • dirtysalt
    dirtysalt 2023年9月1日 下午1:53

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

  • yhf20071
    yhf20071 2023年7月22日 下午9:28

    部署远程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/
    是哪个环境变量有问题?

  • danner
    danner 2023年4月27日 下午4:43

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

    • Smith
      Smith 2023年4月27日 下午4:49

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

    • danner
      danner 2023年5月6日 下午5:26

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

    • Smith
      Smith 2023年5月7日 下午7:36

      @dannerCMake 正常识别后就可以了

  • packkky
    packkky 2023年3月31日 下午1:21

    救 Java Boy老命了.

  • qwertt
    qwertt 2023年1月19日 下午12:30

    在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
    ……

    • Smith
      Smith 2023年1月19日 下午3:16

      @qwertt感觉像 gcc 版本太低的问题了,你能升级到 gcc 11 看看吗