【高手問答彙總】——聊聊 Apache Doris 的效能優化實戰技巧

語言: CN / TW / HK

隨著 Apache Doris 在越來越多的企業中得到落地和應用,越來越多使用者開始關注如何在海量資料下對Doris的查詢效能進行優化。有哪些效能優化的小技巧?如何降低查詢耗時?資料模型和分割槽分桶策略該如何設計?針對慢查詢該如何進行分析及優化?

OSCHINA 本期高手問答 1月18日-1月24日,來自百度的資深研發工程師、Apache Doris PPMC 繆翎,與大家一起探討 Apache Doris 效能優化實戰技巧,包括但不限於:

  • 慢查詢定位、Profile 解讀及SQL優化;
  • 資料模型、索引及分割槽分桶策略設計;
  • 物化檢視及Rollup使用技巧;
  • Doris查詢優化器解讀;

嘉賓介紹

繆翎,百度資深研發工程師、Apache Doris PPMC,專注於 Apache Doris 查詢引擎的設計和研發,在資料庫查詢引擎、查詢優化器方向有豐富的研究和實踐經驗。

 


問答彙總

問:請教一個具體場景的問題,在 Apache Doris 中,如果表按天分割槽,每天大約 2000 至 3000 萬資料量,通常按照業務欄位查詢最近 30 天的明細資訊。如何設計能支援更多的併發查詢呢?

答:如果是明細查詢,建議利用字首索引、分桶分割槽裁剪以及 Bitmap 索引這類的優化策略。

 

問:進一步瞭解下,如果是 Uniq 資料模型,在查詢的過程中存在對資料的 update 操作,那麼對查詢會有哪些影響呢?

答:update 操作可以,如果 update 的操作頻率和匯入佔比很小,就不會對查詢有影響。

 

問:

1. 開源 Doris 和 Clickhouse 之間的優勢和劣勢是什麼?

2. Doris 在多執行緒設計上,有沒有使用什麼設計模式?

3. Doris 入門門檻高嗎?超過多大的資料量比較合適使用 Doris ?哪些場景下特別適合doris資料庫的發揮優勢?哪些場景下 Doris 的效能不好?

答:Doris 是 MPP 架構的資料庫,這點是和 Clickhouse 從架構上有本質的不同。Doris 在 多表 Join 和分散式管理上更有優勢,Clickhouse 單機效能突出。不過我們的向量化引擎也馬上就能和大家見面了,效能上可以期待一下。

Doris 入門門檻不高,G-TB的資料量都適合使用。Doris 因為沒有其他依賴,所以運維會方便一些。 場景方面,當然是面向分析的 OLAP 場景。OLTP 場景,比如 qps 上萬的點查這類以及頻繁的 update/delete的場景並不適合 Doris。

 

問: Doris 叢集 不定期的出現某個 BE 節點直接掛掉的情況,每次掛掉的 BE 節點並不一樣。檢視監控看機器 Load 比較高(主要是磁碟IO write高)怎麼排查這個問題,怎麼知道這臺機器上在做什麼,有什麼命令可以知道。

答:BE 掛掉最常見的兩種情況:

1. oom 被系統 Kill,通過 dmesg 方式排查,並且結合使用方式確定 匯入還是查詢導致的記憶體使用量過大,需要優化使用方式。

2. be core 了,通過 core dump 方式找到 core 棧,core 棧就可以看到是哪部分行為導致的 BE 掛掉。並且在 Issue 裡面搜尋,看是否是 Doris 舊版本已知問題。每次不一樣節點,那就要逐個分析,可能雖然節點不一樣但原因都一樣。

 

問:core dump 這個檔案存放在哪裡的?

答:core dump檔案存放地址可以參考連結 https://www.jianshu.com/p/60a5df15093c

 

問:

1:在做 100-200 個相同 sql 併發測試時,總是越往後面的查詢,尤其是做group by的時候,看 profile越慢,好像哪裡卡住了似的,這個應該怎麼定位是哪裡的問題?

2: 通過 Broker Load 匯入資料時,總偶然碰到查詢超時,而且這個問題是必現,我怎麼定位問題,還請給點指點。

答:

1. 這種 qps 效能分析問題,主要工具是 pprof ,看看 CPU 集中耗時在哪裡。

2. 匯入過程中的查詢超時,建議先看監控,grafana 上的資料。比如是否匯入佔用了過多的 IO或者 cpu 等,導致了相互影響,再逐步根據 pprof + 程式碼分析。

 

問:請教下 Doris 叢集規模為 6個 BE節點,在聚合模型下用天 Date做時間分割槽、每天資料近2億行,發現 select max(date) 效能不佳(接近10秒),看了下執行計劃發現全表掃描了,這樣設計的主要考慮是什麼呢?

答:確實,如果對 Range 分割槽欄位求 Max 或者 Min 等,邏輯上可以只讀最大分割槽資料。Doris 沒對這種特殊場景做優化,所以是全表掃描。需要增加 Where 條件從而匹配到分割槽分桶裁剪,才能減少資料量。比如這樣寫 select max(date) from table where date >xxx。分割槽欄位和索引欄位需要出現在 Where 條件中效果最好。

 

問:想問一下,關於效能優化這方面,與資料型別是否有什麼關聯,各種資料來源中的表聯合查詢的時候,對於複雜型別的效能優化是從哪方面著手的?

答:和資料型別關係還是很大的。比如 Int 型別的效能就會比 String 要好。複雜型別的效能優化我舉個 Bitmap 的例子。Bitmap 的聚合函式在 Bitmap 分佈相對稠密情況下,會比稀疏的要效能高不少。

 

問:對於聚合模型, MODIFY COLUMN 某一個已經存在的列, 從型別 BIGINT 變更為 VARCHAR , 該表按每天分割槽,每天資料量 1億+,發現該表這一列歷史資料過多,一直處於 SCHEMA_CHANGE【 state is not NORMAL】 狀態 (大概5小時),導致後續其他的增加列,增加動態分割槽都不斷失敗重試,直到表恢復 NORMAL 狀態才成功。這種情況有什麼建議嗎

答:同一時間單個表只能做一個 schema change 操作。所以做第一個 schema change 的時候後面增加列和增加分割槽的操作都被禁止了。schema change 的時間過長主要原因是表資料量大導致的。對於這種大表的表結構變更最好是等到業務不太忙的時候,比如半夜。再者,如果需要多次 schema change 建議合併為一次。

 

問:doris 後續會新增對複雜型別 Array、Map、Struct 的支援嗎?Doris On ES 這個拓展功能後期會進一步優化嗎?

答:會支援,目前正在開發 Array 、後面還會增加對 List / Map 等複雜型別的支援。Doris On ES 後續也會有優化,例如聚合下推、讀寫統一、分割槽裁剪等。

 

問:2021 的 Roadmap 提到會落地向量化引擎,具體什麼時間能發行呢,向量化引擎和目前查詢相比,查詢效率大概能提升多少倍呢?

答:可以看下之前釋出文章 https://my.oschina.net/u/4021972/blog/5393281

這個月底或下月初就會發布新版向量化執行引擎

 

問:多表關聯的物化檢視有計劃嗎?

答:有計劃,可以關注下我們在 GitHub 上釋出的 2022 年 RoadMap https://github.com/apache/incubator-doris/issues/7502

 

問:請問高吞吐量的即席查詢實時性如何,比如1張1億條資料的表,查出200萬條資料,大約需要多少毫秒?

答:這個差異可能會非常大,需要結合建表語句、查詢 SQL 、機器配置、叢集規模等多方面因素綜合來看。在 Doris 官網上基於 Star-Schema-Benchmark 標準測試資料集做過效能測試,可以參考一下 https://doris.apache.org/zh-CN/benchmark/star-schema-benchmark.html#

 

問:後續會有 GO 語言版嗎?

答:目前 Doris 還只支援 Java(FE)和 C++(BE)開發,暫時沒有GO語言版的計劃。

 

問:Doris 現在是否支援修改列的名稱?

答:目前不支援修改列名,可以看下官網上的 FAQ-11  https://doris.apache.org/zh-CN/faq/faq.html

因為一些歷史原因,目前列名稱是直接寫入到資料檔案中的。Doris 在查詢時,也是通過類名查詢到對應的列的。所以修改列名不僅是簡單的元資料修改,還會涉及到資料的重寫,是一個非常重的操作。後續可能通過一些相容手段來支援輕量化的列名修改操作。

 

問:您好,想要諮詢一下關於物聯網時序資料這種場景下是否適合?

答:之前也有社群使用者使用 Doris 應用在時序場景的,主要瓶頸在寫入頻率,不建議特別高頻的寫入。

 

問:介面效能優化都有哪些好的方案

答:首先要看你的情況是提升 QPS 還是提升單個慢查詢。

先說慢查詢:

1. 開啟 Profile 觀察慢查詢主要的效能瓶

2. 梳理 Doris 的常見優化,比如 Join Reorder 、Runtime Filter、謂詞下推等等需要手動開啟的優化策略,並觀察作用。

3. 從資料模型入手,比如是否存在資料版本過多、資料模型和列型別設計不合理等等問題。

 

問:Doris 有沒有配置引數說明文件以及一些效能優化方面的調參建議。譬如影響資料匯入,查詢,合併引數指導,方便小白入門

答:最直觀的就是官方文件,詳細的話可以期待一下即將出版的書 ~

 

問:請問 String 型別在使用上存在 Bug ,後續有在完善嗎,預計哪個版本會比較穩定呢?

答:String 是今年新加入的功能,在功能和效能方面還在改善中。今年上半年會持續對 String 進行優化,如果有 String 方面的使用問題,歡迎給 Apache Doris 開發者郵件組發郵件:[email protected]

 

問:對於 Doris 的編碼質量,後續有沒有策略或者計劃,提升產品質量?

答:開源 Doris 目前在快速迭代中,為了保證穩定性,我們正在準備將測試框架開源給社群。

 

問:如果需要把 MySQL、Elastic Search 這種資料批量匯入到 Doris ,有沒有推薦的工具使用?用什麼方式比較好遷移資料到 Doirs 使用?

答:MySQL 可以存量用csv + stream load,增量用 Binlog Load 功能,可參考文件:

https://doris.apache.org/zh-CN/administrator-guide/load-data/binlog-load-manual.html

ES 的話 Doris 本身就支援直接讀取 ES 外表,並不一定非要匯入 Doris。

 

問:關於 BE 原始碼除錯有沒有什麼好的建議,如果用 Mac 或 Windows 作業系統的電腦,一般怎麼進行除錯?

答:如果是 Mac 或者 Windows 電腦的話,需要借用 Docker,在 Docker 裡面啟動 BE 並且 gdb 除錯。

 

問:Doris擴容方便麼?節點有無狀態?

答:節點分為 FE 和 BE 兩類, FE 節點是管控節點、BE 是計算和儲存節點,擴容比較簡單,往往只需要擴充套件 BE 節點即可,支援線上擴縮容,擴容期間正常查詢不受影響。

 

問:Doris 和 Elastic Search 區別在哪裡?還有對於企業想從 ES 切換到這個,有什麼成本或者值得注意的地方,謝謝。

答:Doris 跟 ES 稍微有些差異,Doris 是 MPP 資料庫,ES 是搜尋引擎。Doris 的 SQL 更加友好、支援標準 SQL ,分散式比 ES 更完備。而全文檢索、任意列更新、分詞等 ES 特性目前 Doris 還不支援。如果同時在使用 Doris 和 ES 的話,可以考慮 Doris On ES 方案。

 

問:請問 Doris 有沒有計劃增加一個"自增函式"?或者是目前的 sequence 特性(

https://doris.apache.org/zh-CN/administrator-guide/load-data/sequence-column-manual.html大體也能達到自增列的效果,但它僅限 Uniq 資料模型, 有沒有計劃將其推廣到非聚合型別的列上去,比如 Aggregate 表的 Key 列、 Duplicate 表的任意列?

答:目前自增列僅限 Uniq 表,後續計劃可以到我們的 2022 Roadmap 中提出,我們會評估可行性的。Https://github.com/apache/incubator-doris/issues/7502

 

問:我們最近在做響應治理:不同維度的查詢會對效能有不同的影響,比如 1 億資料的場景下,資料許可權的條件每個人都不一樣,很多資料無法提前預聚合,此時 IO 會成為高效能的最大瓶頸,請問 Doris 在這方面有什麼比較好的實踐?

答:建議使用明細模型 + 物化檢視的方式,保留明細的同時,也能有預聚合的資料,而且目前 Doris 的物化檢視是可以保證基礎表與物化視圖表資料的強一致性。

 

問:老師能不能出一些 Doris 資料庫的原始碼分析文章,如果想從事資料庫方面的開發,需要學習哪些內容,希望能推薦一些書籍

答:分析原始碼的話可以去看下我們上傳在B站的影片,可以關注 ApacheDoris 官方微信公眾號下載課件。

書籍的話推薦以下兩本:《Designing Data-Intensive Applications》(中文版叫資料密集型應用系統設計,建議看英文版)和《Architecture of a Database System》

 

問:請教一下分桶的優化技巧

答:資料分桶主要是為了分桶裁剪,並且避免資料傾斜。所以首先,最好選用像 id,uuid 這種不容易產生資料傾斜,且分散廣的列作為分桶列。同時可以選擇查詢的 Where 條件列作為分桶列,來更好的減少讀取的資料量,提升查詢效能。

 

問:MySQL 業務庫是分表的,如何通過 Binlog Load 把 MySQL 多表資料實時同步到 Doris 中一張表,對於這種場景有什麼建議麼?

答:目前 Binlog Load 還不支援多張 MySQL 表同步到一張 Doris 表,後續這塊我們會優化。

 

問:目前是否支援部分列更新的功能?

答:目前部分列更新比較侷限,只支援在 Agg 模型上對 Value 列進行 replace_if_not_null 的值替換。

 

問:目前我們已經在使用doris,所以很希望知道 Doris 後續的一些計劃和時間節點,我們好安排自己的計劃。

總體開發計劃我們釋出在GitHub上了,歡迎關注。最近有兩個重要的時間點:

  1. 1月底或2月初,我們會發布 Apache Doris 1.0 版本的 beta 版本,主要包含完整的向量化執行引擎、Manager 視覺化運維平臺、Hive 外表、Lateral View、SeaTunnel Connector 等功能,正式 Release 應該在2月。
  2. 3月份我們將會支援 Array 陣列型別、基於物件儲存的冷熱資料分離、記憶體管理優化、Iceberg整合等功能。

高手問答欄目檢視:主題 高手問答 - OSCHINA - 中文開源技術交流社群