Apache Doris 2.3 以下的版本會存在一個 bug,導致資料在合併時存在異常,在後續查詢該欄位資料時會提示
[1105] [HY000]: errCode = 2, detailMessage = (192.168.15.228)[CANCELLED]failed to initialize storage reader. tablet=106408, res=[NOT_IMPLEMENTED_ERROR]to be implemented 0# doris::RowwiseIterator::next_block_view(std::vector<doris::vectorized::IteratorRowRef, std::allocator<doris::vectorized::IteratorRowRef> >*) at /home/zcp/repo_center/doris_release/doris/be/src/olap/iterators.h:147
由於在 Google 直接搜尋解決方案時並沒有看到非常好的方式,所以此處將我的一些處理方式分享一下:
前置知識
在 Doris 中,每一個表都會有一個對應的合併策略,我們可以透過 GET /api/compaction/show?tablet_id={int} 這個 API 來檢視指定tablet_id的壓縮策略等詳細資訊。
關於這個 API的詳情可以檢視 這裡
在 Doris 中包含的壓縮策略有:
size_based:基於資料大小的策略。當累積的資料大小達到一定閾值時,觸發累積 Compaction。它允許系統根據資料增長自動調整 Compaction 的頻率。
time_based:基於時間的策略。無論資料大小如何,只要達到一定的時間間隔,就會觸發 Compaction。
incremental:增量策略,通常是指只合並最近新增的資料檔案。
full:全量策略,指的是合併所有的資料檔案,不管它們的新舊。
表資料修復
瞭解了上述的壓縮策略後,就可以發現,我們資料的分片檔案本身沒有丟失的情況下,只要重新進行一次資料的合併即可,採用 full 策略,無論新舊檔案
全部執行一次資料合併,就可以解決該問題。
在 Doris 的架構中,存在 FE 和 BE,BE 的節點本身會開啟 8040 的http介面,這個介面是用於管理 BE 使用的。
我們再看一下上述的異常,異常提示是 tablet 106408 存在異常。 failed to initialize storage reader. tablet=106408
此時我們根據自己的 BE 節點所在的 IP 直接訪問: http://IP:8040/api/meta/header/106408
會得到針對該 tablet 的詳細後設資料資訊
此處我們會發現該 tablet 所對應的 table 是 "table_id": 106227。 此處要注意哦:table 和 tablet 是兩個不同的概念。
獲取到異常表的 Id 後,我們就可以登入到對應的 BE 伺服器上執行:
curl -X POST "http://localhost:8040/api/compaction/run?table_id=106227&compact_type=full"
執行成功後,等待片刻,再執行對應的 sql 查詢,會發現異常解決解決了、、
關於compaction api 可以看這裡
終極解決方案
終極解決方案就是升級Doris 的版本,2.1.3 的版本已經修復了該問題,只要是使用 2.1.3 以及以上的版本即可。