StarRocks 開發(fā)環(huán)境搭建踩坑指北
背景
最近這段時間在處理一個 StarRocks 的關(guān)于物化視圖優(yōu)化的一個問題,在此之前其實我也沒有接觸過 StarRocks 這類主要處理數(shù)據(jù)分析的數(shù)據(jù)庫,就更別提在這上面做優(yōu)化了。
在解決問題之前我先花了一兩天時間熟悉了一下 StarRocks 的一些概念和使用方法,然后又花了一些時間搭建環(huán)境然后復(fù)現(xiàn)了該問題。
之后便開始閱讀源碼,大概知道了相關(guān)代碼的執(zhí)行流程,但即便是反復(fù)閱讀了多次代碼也沒有找到具體出現(xiàn)問題的地方。
所以便考慮在本地 Debug 源碼,最終調(diào)試半天之后知道了問題所以,也做了相關(guān)修改,給社區(qū)提交了 PR,目前還在推進過程中。
環(huán)境搭建
這里比較麻煩的是如何在本地 debug 代碼。
圖片
根據(jù)官方的架構(gòu)圖會發(fā)現(xiàn) StarRocks 主要分為兩個部分:
- FE:也就是常說的前端部分,主要負責元數(shù)據(jù)管理和構(gòu)建執(zhí)行計劃。
- BE:后端存儲部分,執(zhí)行查詢計劃并存儲數(shù)據(jù)。
其中 FE 是 Java 寫的,而存儲的 BE 則是 C++ 寫的,我這次需要修改的是 FE 前端的部分,所以本篇文章主要討論的是 FE 相關(guān)的內(nèi)容。
好在社區(qū)已經(jīng)有關(guān)于如何編譯和構(gòu)建源碼的教程,這里我列舉一些重點,F(xiàn)E 首先需要安裝以下一些工具:
- Thrift
- Protobuf
- Python3
- JDK8+
brew install alberttwong/thrift/thrift@0.13
$ thrift -version
Thrift version 0.13.0
brew install protobuf
以上默認是在 Mac 平臺上安裝的流程,所以全程使用 brew 最方便了,如果是其他平臺也是同理,只要安裝好這些工具即可。
緊接著便是編譯 FE,我們需要先下載源碼,然后進入 FE 的目錄:
git clone https://github.com/StarRocks/starrocks.git
cd fe
mvn install -DskipTests
然后直接使用 maven 編譯安裝即可。
這里需要注意??,因為編譯過程中需要使用 Python3 來執(zhí)行一些構(gòu)建任務(wù),新版本的 Mac 都是內(nèi)置 Python3 的,但如果是老版本的 Mac 內(nèi)置的則是 Python2。
這時就需要我們將 Python3 的命令手動在構(gòu)建任務(wù)里指定一下:
圖片
比如我這里的 Python3 命令為 python3。
我們需要在 fe/fe-core/pom.xml 目錄里修改下 Python 的命令名稱:
圖片
修改之后再 mvn install 編譯一次,如果一切順利的話便會編譯成功。
搭建本地集群
啟動 FE
我的最終目的是可以在本地 IDEA 中啟動 FE 然后再配合啟動一個 BE,這樣就可以在 IDEA 中調(diào)試 FE 的源碼了。
在啟動 FE 之前還需要創(chuàng)建一些目錄:
cp -r conf fe/conf
cp -r bin fe/bin
cp -r webroot fe/webroot
cd fe
mkdir log
mkdir meta
主要就是要在 FE 的目錄下創(chuàng)建配置文件、執(zhí)行腳本、日志、元數(shù)據(jù)等目錄。
接著便可以打開 com.starrocks.StarRocksFE 類在 IDEA 中運行了,在啟動之前還需要配置一下環(huán)境變量:
# 修改為自己的目錄
export PID_DIR=/Users/smith/Code/starrocks/fe/bin
export STARROCKS_HOME=/Users/smith/Code/starrocks/fe
export LOG_DIR=/Users/smith/Code/starrocks/fe/log
同時需要配置下 fe.conf 中的 priority_networks 網(wǎng)絡(luò)配置:
priority_networks = 10.10.10.0/24
這個 IP 得是宿主機的 IP,后續(xù)我們使用 docker 啟動 BE 的時候也需要用到。
圖片
如果啟動失敗,可以在日志目錄下查看日志:
2024-09-16 21:21:59.942+08:00 ERROR (main|1) [NodeMgr.getCheckedSelfHostPort():642] edit_log_port 9010 is already in use. will exit.
碰到這個異常:提示端口被占用,那可以嘗試關(guān)閉代理之后再試試。
啟動成功后我們便可以使用 MySQL 兼容的客戶端進行連接了,這里我使用的是 tableplus:
圖片
然后我們使用以下 sql 可以查詢 fe 的節(jié)點狀態(tài):
SHOW PROC '/frontends';
圖片
看到類似的輸出則代表啟動成功了。
啟動 BE
之后我們便可以使用 Docker 來啟動 BE 了,之所以用 docker 啟動,是因為 BE 是 C++ 編寫的,想要在 Mac 上運行比較麻煩,最好是得有一臺 Ubuntu22 的虛擬機。
如果我們不需要調(diào)試 BE 的話,只使用 docker 啟動是再合適不過了。
docker run -p 9060:9060 -p 8040:8040 -p 9050:9050 -p 8060:8060 -p 9070:9070 -itd --rm --name be -e "TZ=Asia/Shanghai" starrocks/be-ubuntu
我們需要將 FE 需要連接 BE 的端口暴露出來,啟動成功后該鏡像并不會直接啟動 BE,我們需要進入容器手動啟動。
docker exec -it be bash
在啟動之前我們依然需要修改下 be.conf 中的 priority_networks 配置:
圖片
修改為和 fe.conf 中相同的配置。
之后使用以下命令啟動 be:
bin/start_be.sh --daemon
啟動日志我們可以在 logs 目錄中查看。
綁定 FE 和 BE
接下來還有最后一步就是將 FE 和 BE 綁定在一起。
我們在 fe 中執(zhí)行以下 sql:
ALTER SYSTEM ADD BACKEND "127.0.0.1:9050";
手動添加一個節(jié)點,之后再使用:
SHOW PROC '/backends';
可以查詢到 BE 的節(jié)點狀態(tài):
圖片
如果出現(xiàn)以下結(jié)果代表連接成功,這樣我們就可以創(chuàng)建數(shù)據(jù)庫和表了。
總結(jié)
這部分內(nèi)容(本地 FE 聯(lián)結(jié) docker 里的 FE)官方文檔并沒有提及,也是我踩了不少坑、同時還咨詢了一些大佬才全部調(diào)試成功。
還有一點需要注意的事:如果我們網(wǎng)絡(luò)環(huán)境發(fā)生了變化,比如從家里的 Wi-Fi 切換到了公司的,需要手動刪除下 FE/meta 下的所有文件再次啟動,BE 則是需要重啟一下容器。
參考鏈接:
- https://docs.starrocks.io/zh/docs/developers/development-environment/IDEA/
- https://docs.starrocks.io/zh/docs/deployment/deploy_manually/#%E7%AC%AC%E5%9B%9B%E6%AD%A5%E6%90%AD%E5%BB%BA%E9%9B%86%E7%BE%A4