StarRocks 完美开发环境搭建

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

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日 下午12:20
下一篇 2023年1月20日 上午1:43

相关推荐

发表回复

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

评论列表(55条)

  • llz
    llz 2024年12月11日 下午3:50

    大佬,请教个问题,本机拉社区开发环境镜像,容器里编译之后可以用这种方式 debug 吗

    • Smith
      Smith 2024年12月11日 下午3:54

      @llz可以的,你保证端口通就行了。

    • llz
      llz 2024年12月11日 下午6:13

      @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

    • Smith
      Smith 2024年12月11日 下午7:20

      @llz你设置了 fe.conf 里面的 priority_networks 了吗。看起来是机器同时绑定了多个 IP,FE 不知道认哪个了。

    • llz
      llz 2024年12月12日 下午3:03

      @Smith感谢大佬,确实是 ip 问题,我在配 clion Toolchains 时,发现社区镜像里没有 /usr/bin/ninja,他这是用啥编的,这样的话要装一个吗,另外文章图里 /usr/bin/c 是指 /usr/bin/cc 吗

    • Smith
      Smith 2024年12月12日 下午3:12

      @llz有些地方是 gcc 和 g++,具体看情况。ninja 没有你可以用 make 代替,都一样。toolchain 主要是方便 clion 正确解析代码,又不会真的编译。

  • zx
    zx 2024年12月6日 下午3:38

    大佬,请教个问题,目前FILETable读取csv,没有使用状态机处理数据,存在异常数据列,这个怎么处理啊

    • Smith
      Smith 2024年12月7日 上午12:11

      @zxbug 的会只能反馈给 sr 社区修了,或者自己修

  • lmz
    lmz 2024年12月4日 上午10:44

    2024年12月亲测用mac来直接brew install thrift是0.21.0版本,跟fe的代码不兼容,还是得手动下载thrift0.13.0才行

    • Smith
      Smith 2024年12月4日 上午10:51

      @lmz不可能,你拉的是 main 的代码吗

    • Smith
      Smith 2024年12月10日 上午10:52

      @lmz我知道了,你得用 thrift 0.20,FE 用的是 thrift 0.20。brew 默认最新安装的是 0.21。

  • nou
    nou 2024年11月24日 下午4:44

    在 ubuntu 机器下 ,toolchain 也要配置一个远程的吗?本机的当作远程 ? 还是可以直接本地 clion 打开使用

    • nou
      nou 2024年11月24日 下午4:47

      @nou想要在 ubuntu 系统里直接用 clion 启动调试 , 源码已经编译好了

    • Smith
      Smith 2024年11月24日 下午5:27

      @nou你也只能远程,因为 start_backend.sh 脚本里面做了很多前置工作,Clion 是不会给你做的。

  • zx
    zx 2024年10月23日 下午8:30

    cn 节点要配置也是这样吗大佬

    • Smith
      Smith 2024年10月23日 下午9:54

      @zxcn 和 be 的代码是一起的,一样的。

    • zx
      zx 2024年10月24日 上午10:38

      @Smith确实一样,用3.2/3.3编译的结果 gdbserver都连接不上,can’t read symbols: file format not recognized.这个是gdb 版本的问题吗

    • Smith
      Smith 2024年10月24日 上午10:42

      @zx你要编译 Debug 版本,Release 版本 be 的符号表被 strip 掉了。

    • Smith
      Smith 2024年10月24日 上午10:42

      @SmithBUILD_TYPE=Debug ./build.sh –be

    • zx
      zx 2024年10月24日 上午11:18

      @Smith是这样编译的 应该没问题啊,之前2.5的都可以 BUILD_TYPE=Debug ./build.sh –be –enable-shared-data 我用gdb client 直接target就会报错,好奇怪

    • zx
      zx 2024年10月24日 下午1:02

      @Smith装了gdb 12 ,还是这个报错can’t read symbols: file format not recognized.大哭

    • Smith
      Smith 2024年10月24日 下午1:44

      @zx靠自己研究下吧,我也不知道了,没遇到过。

    • Smith
      Smith 2024年10月24日 上午11:21

      @zx你 gdb 要 12 吧,或者你用 lldb 试试。

    • zx
      zx 2024年10月24日 下午1:56

      @Smith嗯嗯,我再研究下,多谢

  • nou
    nou 2024年10月9日 上午9:54

    老哥 , starrocks 开发主机有啥推荐,

    • Smith
      Smith 2024年10月9日 上午10:31

      @nou你说云服务器吗?搞个内存大点的 ubuntu 都可以吧,或者拿自家电脑。

  • 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 看看吗