StarRocks Docker 开发环境搭建指南

这篇文章介绍了如何借助 Docker 为 StarRocks 构建统一的开发环境,重点解决 BE 本地编译复杂、依赖沉重以及远程调试不便的问题。正文先分析这套方案在 thirdparty 编译、链接速度、SSH 远程开发、GDB 调试和端口隔离上的优势与限制,再说明镜像、目录映射和容器启动方式,随后分别比较 VS Code、Jetbrains Gateway 和代码同步式远程开发的使用体验,并给出 FE 与 BE 的远程 Debug 配置方法和一些实际开发中的注意事项。

这篇文章已经 Deprecated 了,请大家看 https://www.inlighting.org/archives/setup-perfect-starrocks-dev-env
因为 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 自带的端口映射功能,很方便。当然你也可以通过命令行建立端口转发。 image-20220730011509034
  • FE 的远程调试还好用,IDEA 可以直接 Remote Debug。但是 BE 我建议还是直接用 GDB 本地调试吧,CLion 远程开发太卡了,亲测。
  • BE 的 GDB 符号表首次加载很慢,毕竟二进制文件太大了,目前还没有什么好的解决办法。

总结

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

原创文章,作者:Smith,如若转载,请注明出处:https://www.inlighting.org/archives/setup-starrocks-development

打赏 微信扫一扫 微信扫一扫
SmithSmith
上一篇 2022年7月2日 下午11:40
下一篇 2022年8月13日 下午12:20

相关推荐

  • StarRocks 完美开发环境搭建

    这篇文章给出了一套面向 StarRocks 3.4 的完整开发环境搭建方案,目标是在 Mac 本地写代码、远程 Ubuntu 服务器负责编译和调试的前提下,同时满足 FE、BE 的编译、跳转和 Debug 需求。正文先说明本地与服务器的依赖准备、`thirdparty` 的获取方式和一键编译流程,再分别介绍 FE 在 IDEA 中的本地与远程 Debug 配置,以及 BE 在 Clion 中的远程 Toolchain、Deployment、CMake 和环境变量设置,最后补充了使用 gdb、LLDB 调试 BE 的方法和一些实际开发中的注意事项。

    2022年12月24日
    12.7K65
  • StarRocks 常见疑难杂症

    这篇文章汇总了作者在使用 StarRocks 过程中遇到的一些常见疑难杂症及处理办法。当前内容主要围绕对象存储访问问题展开,包括官方 Release 包在 Ubuntu 上运行时因 SSL 证书路径不一致导致 AWS SDK 报错,以及使用 KS3、OBS 等兼容 S3 的存储时因路径中包含等号触发 403 的兼容性问题,并给出了通过补充证书文件和调整配置项规避这些故障的方法。

    2023年10月28日
    2.4K0
  • StarRocks perfect IDE development setup (Support IDEA & Clion)

    This article provides an English guide for setting up a workable StarRocks development environment with both IDEA and Clion, aiming to let contributors write code on a local MacBook while compiling and debugging on a remote Ubuntu server. It walks through local and remote dependency setup, the first full build of StarRocks, FE development and remote debug in IDEA, and BE development in Clion with remote toolchain, deployment mapping, generated source handling, and GDB-based debugging, so that FE and BE can both be developed with normal code navigation and analysis support.

    2023年1月20日
    2.0K0

发表回复

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


评论列表(34条)

  • zx
    zx 2023年7月12日 下午8:36

    大佬,拉了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

    • Smith
      Smith 2023年7月13日 上午10:39

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

    • zx
      zx 2023年7月13日 上午11:05

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

    • Smith
      Smith 2023年7月13日 上午11:20

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

  • amory
    amory 2023年1月17日 下午2:31

    大佬 你本地代码 是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)
    有解释莫

  • huldarchen
    huldarchen 2022年11月18日 下午10:46

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

  • Tom
    Tom 2022年9月21日 下午9:11

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

    • Smith
      Smith 2022年9月21日 下午9:17

      @Tom你是用Clion打开be目录吗

    • Tom
      Tom 2022年9月22日 上午8:23

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

    • Tom
      Tom 2022年9月22日 上午8:33

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

    • Smith
      Smith 2022年9月22日 上午9:23

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

    • Tom
      Tom 2022年9月22日 上午9:33

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

  • zx
    zx 2022年8月24日 下午6:41

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

    • Smith
      Smith 2022年8月24日 下午7:05

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

    • zx
      zx 2022年8月24日 下午8:05

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

    • Smith
      Smith 2022年8月24日 下午8:11

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

    • Smith
      Smith 2022年8月24日 下午8:12

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

    • zx
      zx 2022年8月24日 下午8:22

      @Smith加了个issue

  • zx
    zx 2022年8月21日 下午12:03

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

    • Smith
      Smith 2022年8月21日 下午12:13

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

    • zx
      zx 2022年8月21日 下午12:15

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

    • Smith
      Smith 2022年8月21日 下午12:55

      @zx额,我也不清楚,没搞过。

    • zx
      zx 2022年8月21日 下午12:56

      @Smith哈哈,好的

  • zx
    zx 2022年8月18日 下午8:35

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

    • Smith
      Smith 2022年8月18日 下午9:04

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

    • zx
      zx 2022年8月19日 下午3:37

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

    • Smith
      Smith 2022年8月19日 下午3:38

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

  • zx
    zx 2022年8月17日 上午9:32

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

    • Smith
      Smith 2022年8月17日 上午10:18

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

    • zx
      zx 2022年8月17日 上午10:21

      @Smith好的,感谢大佬