StarRocks Docker 开发环境搭建指南

因为 StarRocks 源自于 Apache Doris,故 Apache Doris 也可以参考此方案。

StarRocks 分为 FE 和 BE,其中 FE 使用 Java 编写,凭借 JVM,环境其实还算好搭,我个人在 M1 的 MacBook 上也能成功跑起来,具体可以参考 StarRocks FE 在 IDEA 上开发环境设置 这篇文章。但是 BE 就很难了,毕竟 C++ 写的,估计光是那个 thirdparty 的编译,就没几个人能搞定。

故这里我使用 Docker 统一开发环境,然后通过 IDE 的远程开发进行开发。

特性

开始介绍之前,我说说这一个月我 Docker 开发的利弊,给大家作为一个参考。

优势:

  • 借助官方提供的 Docker 镜像,无需手动编译 thirdparty,开箱即用。
  • 使用 mold 进行链接,让 BE 的编译速度更上一层楼。
  • 支持 ssh 远程开发,目前各大 IDE 都已支持。
  • 内置 GDB,GDB Server 模块,支持 Debug 操作。
  • 内置 tmux,mysql-client 辅助开发。
  • 无视端口冲突,省了改配置的功夫。

缺点

  • 暂时只支持 x86 的机器,如果将来 StarRocks 提供的镜像支持 Arm 环境,那么在 Mac M1 上也能进行开发。
  • 镜像体积较大,差不多 8G。
  • 编译和后续的开发至少需要 8G 内存,否则大概率你连 Docker 的镜像都 build 不出来。

Dockerfile

你可以自己编译 Dockerfile,也可以用现成的镜像。我把镜像部署在 GitHub 上,并且做了 CI 自动编译,确保镜像的时效性。

GitHub 仓库:https://github.com/Smith-Cruise/StarRocks-Docker-Dev

镜像的默认 ssh 用户名为 root,密码为 xxx,默认端口为 2222。

Dockerfile 中可以修改的地方已在注释中声明,其它地方请不要动。能动的地方分别是 ssh 密码ssh 端口gcc-mold 的 clone 地址

使用

在本地新建一个 ~/.m2 目录和 StarRocks 的源码目录。其中 .m2 目录用于持久化 Maven 下载的 jar 包,源码目录则用来存源码。否则你 Docker 没了,你写的代码和辛辛苦苦缓存的 jar 包都没了。

拉取镜像:sudo docker pull d87904488/starrocks-docker-dev:main

使用如下的启动命令:

sudo docker run -it -p 2222:2222 \
  --privileged \
  --cap-add SYS_PTRACE \
  -v ~/.m2:/root/.m2 \
  -v /home/smith/starrocks:/root/starrocks \
  --name smith-dev \
  -d d87904488/starrocks-docker-dev:main

下面我会对命令进行解释,这样你可以自己发挥。

  • -p 2222:2222:开 ssh 端口。你也可以使用 --net=host 命令直接和宿主机共享网络,这样你可以不用手动一个一个开端口,但是容易端口冲突。
  • --privileged --cap-add SYS_PTRACE:不加这个你用不了 GDB。
  • -v ~/.m2:/root/.m2 -v /home/smith/starrocks:/root/starrocks:和容器中相应目录进行映射,对代码进行持久化。
  • --name smith-dev:自定义的容器名称。
  • -d:后台运行。

注意映射到容器中的位置不要动,就是 /root/starrocks/root/.m2 这两个不能动,因为镜像中的环境变量已经映射好了。

远程开发方案的选择

  1. 使用 VIM 开发,🐮。
  2. 使用 VS Code 远程开发,简单,ssh 连进去就可以开干,就是没 Jetbrains 全家桶牛。因为比较简单后面不做阐述。
  3. 使用 Jetbrains 的 Gateway 开发,相当于在 Docker 里面内嵌了一个 IDE,然后你通过远程控制进行开发。优点是和 VS Code 一样开箱即用,缺点就是比较卡,有些小 BUG,体验没有本机的好。
  4. 使用 Jetbrains 的代码同步实现远程开发,我目前使用的就是这种方法(推荐)。即用 IDEA 打开 FE,CLion 打开 BE,然后映射远程的代码。

Debug 方法

关于 DEBUG 你需要修改启动脚本 start_be.shstart_fe.sh 脚本。方法有很多,我只介绍我自己使用的方法。

FE

start_fe.sh 脚本中的:

if [ ${RUN_DAEMON} -eq 1 ]; then
    nohup $LIMIT $JAVA $final_java_opt com.starrocks.StarRocksFE ${HELPER} "$@" >> $LOG_DIR/fe.out 2>&1 </dev/null &
else
    $LIMIT $JAVA $final_java_opt com.starrocks.StarRocksFE ${HELPER} "$@" >> $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} "$@" >> $LOG_DIR/fe.out 2>&1 </dev/null &
else
    $LIMIT $JAVA $final_java_opt -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8001 com.starrocks.StarRocksFE ${HELPER} "$@" >> $LOG_DIR/fe.out
fi

即可。

之后使用 sh start_fe.sh 命令启动,然后就可以通过 IDEA 的 Remote Debug 进行远程 Debug,这里的端口号是 8001。

BE

start_be.sh 脚本中的

if [ ${RUN_DAEMON} -eq 1 ]; then
    nohup ${STARROCKS_HOME}/lib/starrocks_be "$@" >> $LOG_DIR/be.out 2>&1 </dev/null &
else
    ${STARROCKS_HOME}/lib/starrocks_be "$@" >> $LOG_DIR/be.out 2>&1 </dev/null
fi

替换为

if [ ${RUN_DAEMON} -eq 1 ]; then
    nohup ${STARROCKS_HOME}/lib/starrocks_be "$@" >> $LOG_DIR/be.out 2>&1 </dev/null &
else
    gdb -tui ${STARROCKS_HOME}/lib/starrocks_be
fi

即可。

使用 sh start_be.sh 命令开启 tui 模式的 gdb。

当然你可以把前缀 gdb -tui 换成 gdbserver 0.0.0.0:5555 开启 gdbserver,然后使用 Clion 的 Remote GDB 接入调试。

TIPS

  • 第一次同步代码建议在容器里面 git clone 一份代码,这样可以节省首次 IDE 代码同步的时间。
  • IDEA 和 CLion 首次启动可能会报文件缺失,这是因为 gensrc 中文件没有生成,里面主要是一些 Thrift 和 Protobuf 文件。你可以先在容器中的 /root/starrocks 目录中执行 sh build.sh 命令一次,然后将容器中 root/starrocks/gensrc/build 生成的代码拷贝到本地相同目录。(当然你也可以不这么做,自己本地生成,参考 StarRocks FE 在 IDEA 上开发环境设置 这篇文章)。
  • 因为我们只开放了 2222 端口,一些内部组件可能无法访问(比如远程 JVM DEBUG 端口),这时可以使用 VS Code 自带的端口映射功能,很方便。当然你也可以通过命令行建立端口转发。 StarRocks Docker 开发环境搭建指南
  • FE 的远程调试还好用,IDEA 可以直接 Remote Debug。但是 BE 我建议还是直接用 GDB 本地调试吧,CLion 远程开发太卡了,亲测。
  • BE 的 GDB 符号表首次加载很慢,毕竟二进制文件太大了,目前还没有什么好的解决办法。

总结

如果 Docker 镜像出现问题或你有什么好的意见,请反馈。

34 条回复 A文章作者 M管理员
  1. 大佬,拉了main分支最新的代码,尝试编译报错,这个有什么解决方案吗
    Downloading incubator-brpc-0.9.7.tar.gz from https://github.com/apache/incubator-brpc/archive/0.9.7.tar.gz to /var/local/thirdparty/src
    –2023-07-12 20:33:44– https://github.com/apache/incubator-brpc/archive/0.9.7.tar.gz
    Resolving github.com (github.com)… 20.205.243.166
    Connecting to github.com (github.com)|20.205.243.166|:443… connected.
    HTTP request sent, awaiting response… 301 Moved Permanently
    Location: https://github.com/apache/brpc/archive/0.9.7.tar.gz [following]
    –2023-07-12 20:33:44– https://github.com/apache/brpc/archive/0.9.7.tar.gz
    Reusing existing connection to github.com:443.
    HTTP request sent, awaiting response… 302 Found
    Location: https://codeload.github.com/apache/brpc/tar.gz/refs/tags/0.9.7 [following]
    –2023-07-12 20:33:45– https://codeload.github.com/apache/brpc/tar.gz/refs/tags/0.9.7
    Resolving codeload.github.com (codeload.github.com)… 20.205.243.165
    Connecting to codeload.github.com (codeload.github.com)|20.205.243.165|:443… connected.
    HTTP request sent, awaiting response… 200 OK
    Length: 17985539 (17M) [application/x-gzip]
    Saving to: ‘/var/local/thirdparty/src/incubator-brpc-0.9.7.tar.gz’
    100%[=================================================================================================================================>] 17,985,539 463KB/s in 38s
    2023-07-12 20:34:24 (463 KB/s) – ‘/var/local/thirdparty/src/incubator-brpc-0.9.7.tar.gz’ saved [17985539/17985539]
    /var/local/thirdparty/src/incubator-brpc-0.9.7.tar.gz md5sum check failed!
    except-md5 a5b79339d139d1c55d39689c0a69bcef
    actual-md5 98efa987b7328476e26519be73727fa1 /var/local/thirdparty/src/incubator-brpc-0.9.7.tar.gz
    Archive incubator-brpc-0.9.7.tar.gz will be removed and download again.
    Failed to download incubator-brpc-0.9.7.tar.gz
    Failed to download incubator-brpc-0.9.7.tar.gz

    • 一般这个就是网络问题,我现在都是从官方的 docker 镜像里面,把 thirdparty 这个目录拷贝出来,然后重新指定 STARROCKS_THIRDPARTY 目录。
      因为我们官方 docker 镜像里面已经有编译好的 thirdparty,到时候直接用就行了。

    • Smith

      所以我需要新建一个官方容器,把整个thirdparty目录弄出来,这个能理解,为什么还需要重新制定STARROCKS_THIRDPARTY呢,这个要怎么操作呢

    • 因为我们的 build.sh 会根据 STARROCKS_THIRDPARTY 这个环境变量来找 thirdparty,默认这个环境变量会指向 starrocks 目录下面的 thirdparty 这个文件夹。

  2. 大佬 你本地代码 是main 分支莫 ?我build.sh 出错啦
    CMake Error at /var/local/thirdparty/installed/lib64/cmake/AWSSDK/AWSSDKConfig.cmake:307 (find_package):
    By not providing “Findaws-cpp-sdk-sts.cmake” in CMAKE_MODULE_PATH this
    project has asked CMake to find a package configuration file provided by
    “aws-cpp-sdk-sts”, but CMake did not find one.
    Could not find a package configuration file provided by “aws-cpp-sdk-sts”
    with any of the following names:

    aws-cpp-sdk-stsConfig.cmake
    aws-cpp-sdk-sts-config.cmake

    Add the installation prefix of “aws-cpp-sdk-sts” to CMAKE_PREFIX_PATH or
    set “aws-cpp-sdk-sts_DIR” to a directory containing one of the above files.
    If “aws-cpp-sdk-sts” provides a separate development package or SDK, be
    sure it has been installed.
    Call Stack (most recent call first):
    CMakeLists.txt:225 (find_package)
    有解释莫

    • 更新下你的 thirdparty 把,这地方是我新改的。。。

    • Smith

      ? 是直接 重新 build-thirdparty 莫

  3. 在容器中启动be是运行/root/starrocks/output/be/bin下的start_be.sh呢,还是?

    • 就是 output 下面的 start_be.sh

  4. 我用Clion远程连接Docker之后,CMake可以执行成功,代码也可以同步。但是代码不能高亮显示,不能跳转。请问博主遇到过这个问题吗?怎么解决呢?

    • 你是用Clion打开be目录吗

    • Smith

      是的,打开的是be的本地目录。不知道是否哪里配置有问题?

    • Smith

      我试过invalidate cache and restart,也是不行。

    • 你去 github 发一个 issue,那里能贴图片,我给你看看我的配置。

    • Smith

      好的,我提了一个issue。我们在那边讨论吧,多谢啦!

  5. 大佬,idea debugFE一直连不上啊,改动了之后启动,在idea端应该怎么设置啊,我打开了对应位置的工程代码,在main函数打上断点,但是连接上很快就断开了

    • 不要在 main 函数打断点,好像是有这个问题,你换一个别的地方打看看。

    • Smith

      不行啊,就是闪一下就没了

    • idea 有报什么错呢,你可以加下 starrocks 的 slack,在那里提问。

    • 或者你在我的 github 仓库里面开个 issue 问。

    • Smith

      加了个issue

  6. 大佬,改过函数吗,想添加一个函数,照着这个https://github.com/apache/doris/pull/6982/files#diff3423db98a931d36778a2e008528ec6275a109cc3c42065cce119ab4a5e33ba56来的,改了cpp,h和py但是不起作用,是不是还有要改动的地方?

    • CMakefile 改了吗,我不确定 doris 这个 docker 好用不,没试过。
      你可能要改 Dockerfile 里面的 FROM image 为 doris 的镜像。

    • Smith

      不是,我用的是starrocks,两者比较相似啊,我按照这个教程改的starrocks,结果修改没什么用

    • 额,我也不清楚,没搞过。

    • Smith

      哈哈,好的

  7. 使用虚拟机是不是会快一点,可以debug?

    • 差不多的,docker 的好处是这里环境都给你打包好了。

    • Smith

      试了一下,不知道为啥,Docker更快一点,哈哈哈

    • 可能是因为用了 mold 的原因,有什么问题这里提出来,我可以改进。

  8. 大佬,BE端进行debug如何操作呢,一直解决不了,请教一下

    • 我博客更新了教程,你看看吧。

    • Smith

      好的,感谢大佬

搜索