这篇文章已经 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
这两个不能动,因为镜像中的环境变量已经映射好了。
远程开发方案的选择
- 使用 VIM 开发,🐮。
- 使用 VS Code 远程开发,简单,ssh 连进去就可以开干,就是没 Jetbrains 全家桶牛。因为比较简单后面不做阐述。
- 使用 Jetbrains 的 Gateway 开发,相当于在 Docker 里面内嵌了一个 IDE,然后你通过远程控制进行开发。优点是和 VS Code 一样开箱即用,缺点就是比较卡,有些小 BUG,体验没有本机的好。
- 使用 Jetbrains 的代码同步实现远程开发,我目前使用的就是这种方法(推荐)。即用 IDEA 打开 FE,CLion 打开 BE,然后映射远程的代码。
Debug 方法
关于 DEBUG 你需要修改启动脚本 start_be.sh
和 start_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 自带的端口映射功能,很方便。当然你也可以通过命令行建立端口转发。
- FE 的远程调试还好用,IDEA 可以直接 Remote Debug。但是 BE 我建议还是直接用 GDB 本地调试吧,CLion 远程开发太卡了,亲测。
- BE 的 GDB 符号表首次加载很慢,毕竟二进制文件太大了,目前还没有什么好的解决办法。
总结
如果 Docker 镜像出现问题或你有什么好的意见,请反馈。
原创文章,作者:Smith,如若转载,请注明出处:https://www.inlighting.org/archives/setup-starrocks-development
评论列表(34条)
大佬,拉了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
@zx:一般这个就是网络问题,我现在都是从官方的 docker 镜像里面,把 thirdparty 这个目录拷贝出来,然后重新指定 STARROCKS_THIRDPARTY 目录。
因为我们官方 docker 镜像里面已经有编译好的 thirdparty,到时候直接用就行了。
@Smith:所以我需要新建一个官方容器,把整个thirdparty目录弄出来,这个能理解,为什么还需要重新制定STARROCKS_THIRDPARTY呢,这个要怎么操作呢
@zx:因为我们的 build.sh 会根据 STARROCKS_THIRDPARTY 这个环境变量来找 thirdparty,默认这个环境变量会指向 starrocks 目录下面的 thirdparty 这个文件夹。
大佬 你本地代码 是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:
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)
有解释莫
@amory:更新下你的 thirdparty 把,这地方是我新改的。。。
@Smith:? 是直接 重新 build-thirdparty 莫
@amory:建议你看看这篇文章:https://www.inlighting.org/archives/setup-perfect-starrocks-dev-env
这里的 docker 里面的容器我好久没更新了,在更新中。Docker 开发这个方法不太好,准备废弃了。
在容器中启动be是运行/root/starrocks/output/be/bin下的start_be.sh呢,还是?
@huldarchen:就是 output 下面的 start_be.sh
我用Clion远程连接Docker之后,CMake可以执行成功,代码也可以同步。但是代码不能高亮显示,不能跳转。请问博主遇到过这个问题吗?怎么解决呢?
@Tom:你是用Clion打开be目录吗
@Smith:是的,打开的是be的本地目录。不知道是否哪里配置有问题?
@Smith:我试过invalidate cache and restart,也是不行。
@Tom:你去 github 发一个 issue,那里能贴图片,我给你看看我的配置。
@Smith:好的,我提了一个issue。我们在那边讨论吧,多谢啦!
大佬,idea debugFE一直连不上啊,改动了之后启动,在idea端应该怎么设置啊,我打开了对应位置的工程代码,在main函数打上断点,但是连接上很快就断开了
@zx:不要在 main 函数打断点,好像是有这个问题,你换一个别的地方打看看。
@Smith:不行啊,就是闪一下就没了
@zx:idea 有报什么错呢,你可以加下 starrocks 的 slack,在那里提问。
@zx:或者你在我的 github 仓库里面开个 issue 问。
@Smith:加了个issue
大佬,改过函数吗,想添加一个函数,照着这个https://github.com/apache/doris/pull/6982/files#diff3423db98a931d36778a2e008528ec6275a109cc3c42065cce119ab4a5e33ba56来的,改了cpp,h和py但是不起作用,是不是还有要改动的地方?
@zx:CMakefile 改了吗,我不确定 doris 这个 docker 好用不,没试过。
你可能要改 Dockerfile 里面的 FROM image 为 doris 的镜像。
@Smith:不是,我用的是starrocks,两者比较相似啊,我按照这个教程改的starrocks,结果修改没什么用
@zx:额,我也不清楚,没搞过。
@Smith:哈哈,好的
使用虚拟机是不是会快一点,可以debug?
@zx:差不多的,docker 的好处是这里环境都给你打包好了。
@Smith:试了一下,不知道为啥,Docker更快一点,哈哈哈
@zx:可能是因为用了 mold 的原因,有什么问题这里提出来,我可以改进。
大佬,BE端进行debug如何操作呢,一直解决不了,请教一下
@zx:我博客更新了教程,你看看吧。
@Smith:好的,感谢大佬