StarRocks 開發環境搭建踩坑指北
背景
最近這段時間在處理一個 StarRocks 的關于物化視圖優化的一個問題,在此之前其實我也沒有接觸過 StarRocks 這類主要處理數據分析的數據庫,就更別提在這上面做優化了。
在解決問題之前我先花了一兩天時間熟悉了一下 StarRocks 的一些概念和使用方法,然后又花了一些時間搭建環境然后復現了該問題。
之后便開始閱讀源碼,大概知道了相關代碼的執行流程,但即便是反復閱讀了多次代碼也沒有找到具體出現問題的地方。
所以便考慮在本地 Debug 源碼,最終調試半天之后知道了問題所以,也做了相關修改,給社區提交了 PR,目前還在推進過程中。
環境搭建
這里比較麻煩的是如何在本地 debug 代碼。
圖片
根據官方的架構圖會發現 StarRocks 主要分為兩個部分:
- FE:也就是常說的前端部分,主要負責元數據管理和構建執行計劃。
- BE:后端存儲部分,執行查詢計劃并存儲數據。
其中 FE 是 Java 寫的,而存儲的 BE 則是 C++ 寫的,我這次需要修改的是 FE 前端的部分,所以本篇文章主要討論的是 FE 相關的內容。
好在社區已經有關于如何編譯和構建源碼的教程,這里我列舉一些重點,FE 首先需要安裝以下一些工具:
- 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 來執行一些構建任務,新版本的 Mac 都是內置 Python3 的,但如果是老版本的 Mac 內置的則是 Python2。
這時就需要我們將 Python3 的命令手動在構建任務里指定一下:
圖片
比如我這里的 Python3 命令為 python3。
我們需要在 fe/fe-core/pom.xml 目錄里修改下 Python 的命令名稱:
圖片
修改之后再 mvn install 編譯一次,如果一切順利的話便會編譯成功。
搭建本地集群
啟動 FE
我的最終目的是可以在本地 IDEA 中啟動 FE 然后再配合啟動一個 BE,這樣就可以在 IDEA 中調試 FE 的源碼了。
在啟動 FE 之前還需要創建一些目錄:
cp -r conf fe/conf
cp -r bin fe/bin
cp -r webroot fe/webroot
cd fe
mkdir log
mkdir meta
主要就是要在 FE 的目錄下創建配置文件、執行腳本、日志、元數據等目錄。
接著便可以打開 com.starrocks.StarRocksFE 類在 IDEA 中運行了,在啟動之前還需要配置一下環境變量:
# 修改為自己的目錄
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 網絡配置:
priority_networks = 10.10.10.0/24
這個 IP 得是宿主機的 IP,后續我們使用 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.
碰到這個異常:提示端口被占用,那可以嘗試關閉代理之后再試試。
啟動成功后我們便可以使用 MySQL 兼容的客戶端進行連接了,這里我使用的是 tableplus:
圖片
然后我們使用以下 sql 可以查詢 fe 的節點狀態:
SHOW PROC '/frontends';
圖片
看到類似的輸出則代表啟動成功了。
啟動 BE
之后我們便可以使用 Docker 來啟動 BE 了,之所以用 docker 啟動,是因為 BE 是 C++ 編寫的,想要在 Mac 上運行比較麻煩,最好是得有一臺 Ubuntu22 的虛擬機。
如果我們不需要調試 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 中執行以下 sql:
ALTER SYSTEM ADD BACKEND "127.0.0.1:9050";
手動添加一個節點,之后再使用:
SHOW PROC '/backends';
可以查詢到 BE 的節點狀態:
圖片
如果出現以下結果代表連接成功,這樣我們就可以創建數據庫和表了。
總結
這部分內容(本地 FE 聯結 docker 里的 FE)官方文檔并沒有提及,也是我踩了不少坑、同時還咨詢了一些大佬才全部調試成功。
還有一點需要注意的事:如果我們網絡環境發生了變化,比如從家里的 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