?一、概述
? ?在StarRocks中,insert的語(yǔ)法和mysql等數(shù)據(jù)庫(kù)的語(yǔ)法類似,并且每次insert into操作都是一次完整的導(dǎo)入事務(wù)。
?主要的 insertInto 命令包含以下兩種:
- insert into tbl select ...
- insert into tbl (col1, col2, ...) values (1, 2, ...), (1,3, ...);
? 其中第二種命令僅用于demo,不要使用在測(cè)試或生產(chǎn)環(huán)境中。在StarRocks中,例如使用JDBC或者insertInto導(dǎo)入時(shí),插入1000條左右時(shí)很快有類似報(bào)錯(cuò):close index channel failed,主要原因是導(dǎo)入太頻繁了,需要降頻率攢批導(dǎo)入。
二、高頻insert 報(bào)錯(cuò)的原因
? StarRocks中的數(shù)據(jù)組織圖如下:
? ? ?StarRocks中的分區(qū)分桶與tablet之間的關(guān)系為:?table?-- > partition --> tablet(物理描述,tablet數(shù)據(jù)分片是數(shù)據(jù)劃分的最小邏輯單元)
? ? ? 分區(qū)是邏輯上的概念,只記錄在表的元數(shù)據(jù)中,每個(gè)分區(qū)的數(shù)據(jù)會(huì)按照分桶鍵進(jìn)行hash分桶,表中的數(shù)據(jù)經(jīng)過(guò)分區(qū)分桶后,就會(huì)形成一個(gè)個(gè)的tablet,且盡量均勻分布在集群的各個(gè)BE中。? ? ? ? ? ? ?tablet是StarRocks中數(shù)據(jù)均衡的最小單位,默認(rèn)的三副本是指同一個(gè) tablet會(huì)在集群中保留三份,每個(gè)tablet之間的數(shù)據(jù)沒(méi)有交集,在物理上獨(dú)立存儲(chǔ)。集群的副本修復(fù)或磁盤均衡,均是以tablet為單位移動(dòng)或者克隆的。且每次的數(shù)據(jù)導(dǎo)入、更新或者刪除,本質(zhì)上也是對(duì)一個(gè)個(gè)tablet中的數(shù)據(jù)進(jìn)行操作。
? ?StarRocks中的分區(qū)分桶見(jiàn):
? 第2.4章 StarRocks表設(shè)計(jì)——分區(qū)分桶與副本數(shù)-CSDN博客文章瀏覽閱讀504次,點(diǎn)贊21次,收藏9次。2.4 StarRocks表設(shè)計(jì)——分區(qū)分桶與副本數(shù)https://blog.csdn.net/SHWAITME/article/details/136140126?spm=1001.2014.3001.5501
? ?一個(gè)tablet中包含若干連續(xù)的rowset(rowset是邏輯概念),rowset代表tablet中一次數(shù)據(jù)變更的數(shù)據(jù)集合(數(shù)據(jù)變更包括了數(shù)據(jù)新增,更新或刪除等),它是按版本信息進(jìn)行記錄的,每次變更就會(huì)生成一個(gè)新版本的rowset。一個(gè)rowset底層可能會(huì)包含多個(gè)segment,執(zhí)行數(shù)據(jù)導(dǎo)入時(shí),每成功寫入一個(gè)segment就會(huì)增加一個(gè)文件塊對(duì)應(yīng)。
? ? Segment的概念比較底層(這里不展開(kāi)),可以借鑒Doris底層存儲(chǔ)結(jié)構(gòu):
https://blog.csdn.net/SHWAITME/article/details/136155008?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22136155008%22%2C%22source%22%3A%22SHWAITME%22%7D文章瀏覽閱讀340次,點(diǎn)贊7次,收藏6次。Doris存儲(chǔ)層設(shè)計(jì)介紹1——存儲(chǔ)結(jié)構(gòu)設(shè)計(jì)解析(索引底層結(jié)構(gòu))https://blog.csdn.net/SHWAITME/article/details/136155008?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22136155008%22%2C%22source%22%3A%22SHWAITME%22%7D
? ?對(duì)上文提到的數(shù)據(jù)導(dǎo)入報(bào)錯(cuò)close index channel failed進(jìn)一步解析。在StarRocks中,每次insert into本質(zhì)都是一次完整的導(dǎo)入事務(wù),即:insert into實(shí)際上會(huì)在tablet內(nèi)部生成一個(gè)個(gè)連續(xù)版本號(hào)的rowset,對(duì)于新增的rowset,起始版本和終止版本是一樣的,表示為[ 6-6]、[ 7-7]....[999-999]等。多個(gè) rowset經(jīng)過(guò)compaction會(huì)形成一個(gè)大的rowset。合并后的起始版本和終止版本是多個(gè)版本的并集,如[ 6-6]、[ 7-7]、[8-8]合并后變成 [6-8]。一旦表的某個(gè)tablet中同時(shí)存在rowset個(gè)數(shù)達(dá)到1000,就會(huì)到達(dá)閾值,即觸發(fā)上述報(bào)錯(cuò)。
三、降低導(dǎo)入頻率
? ?單個(gè)tablet中的rowset版本個(gè)數(shù)過(guò)多會(huì)什么影響?主要影響兩個(gè)方面,一個(gè)是內(nèi)存的占用,當(dāng)rowset的版本過(guò)多時(shí),be節(jié)點(diǎn)的table_meta部分(主要是其中的rowset元數(shù)據(jù)部分)占用的內(nèi)存可能非常多。同時(shí)compaction合并消耗內(nèi)存也會(huì)比較大,容易引起oom,影響集群穩(wěn)定性;二是查詢會(huì)變慢,因?yàn)椴樵兊倪^(guò)程中是需要對(duì)tablet中的數(shù)據(jù)進(jìn)行解壓的,當(dāng)rowset版本很多,解壓會(huì)變慢,導(dǎo)致查詢scan的耗時(shí)增加。綜上考慮,StarRocks設(shè)置了單表中每個(gè)tablet最大閾值為1000的限制。
? ? 針對(duì)insert into 數(shù)據(jù)頻繁導(dǎo)入引發(fā)的rowset版本過(guò)多的問(wèn)題,StarRocksc是利用compaction解決的。compaction可以認(rèn)為是一個(gè)后臺(tái)的常駐線程,不斷的將tablet中的rowset版本進(jìn)行合并,將小文件合并成有序的大文件。
? ? StarRocks中的compaction操作,分為base compaction(BC) 和cumulative compaction
(CC)。其中cumulative compaction(簡(jiǎn)稱CC)負(fù)責(zé)將多個(gè)最新導(dǎo)入的增量數(shù)據(jù)進(jìn)行合并,當(dāng)增量數(shù)據(jù)合并后的大小達(dá)到一定閾值后,base compaction(簡(jiǎn)稱BC)將基線版本(起始版本start version為0的數(shù)據(jù))和與該增量數(shù)據(jù)版本合并。BC操作因?yàn)樯婕暗交€數(shù)據(jù),而基線數(shù)據(jù)通常比較大,所以操作耗時(shí)會(huì)比CC長(zhǎng)。
? ? BC和CC之間的分界線是cumulative point (cp),它是一個(gè)動(dòng)態(tài)變化的版本號(hào),比cp小的數(shù)據(jù)版本只能觸發(fā)BC,而比CP大的數(shù)據(jù)版本,只會(huì)觸發(fā)CC。如下圖:
? ?上述分析得出,在StarRocks集群運(yùn)行時(shí),對(duì)表的數(shù)據(jù)變更操作會(huì)不斷地產(chǎn)生新版本rowset,后臺(tái)的常駐線程compaction負(fù)責(zé)將tablet中的rowset版本進(jìn)行合并,進(jìn)而保證集群的整體穩(wěn)定高效。
? ? 綜上,快速insert into導(dǎo)致報(bào)錯(cuò):close index channel failed的原因可以總結(jié)為:短時(shí)間內(nèi)生成的rowset版本太快,如果compaction不及時(shí),就會(huì)造成大量版本堆積,導(dǎo)致累計(jì)版本超過(guò)了超過(guò)了1000,進(jìn)而觸發(fā)閾值報(bào)錯(cuò)。故為了保障集群的穩(wěn)定運(yùn)行及查詢效率,需要確保整體的compaction效率要大于rowset的生成速率。容易想到的解決思路一是:部分場(chǎng)景下通過(guò)調(diào)整compaction的幾個(gè)參數(shù)來(lái)加速compaction,例如在be.conf中配置以下參數(shù)(配置后需重啟BE):
#==每個(gè)磁盤 Cumulative Compaction 線程的數(shù)目(默認(rèn)是1)
cumulative_compaction_num_threads_per_disk = 4
#==每個(gè)磁盤 Base Compaction 線程的數(shù)目(默認(rèn)是1)
base_compaction_num_threads_per_disk = 2
#==Cumulative Compaction 線程輪詢的間隔(單位是秒,默認(rèn)值是1)
cumulative_compaction_check_interval_seconds = 2
? ? 弊端是:compaction任務(wù)本身比較耗費(fèi)cpu,內(nèi)存和磁盤IO資源,compaction開(kāi)啟的過(guò)多會(huì)占用過(guò)多的機(jī)器資源,也會(huì)影響查詢性能,還可能會(huì)造成OOM。上述報(bào)錯(cuò)還是需要從數(shù)據(jù)導(dǎo)入頻率這個(gè)入手。
? ?理論上,每次導(dǎo)入操作,不論是只導(dǎo)入一條還是十萬(wàn)、百萬(wàn)條,對(duì)于StarRocks來(lái)說(shuō),都是只生成一個(gè)新的roswet版本。那么在compaction效率有限的情況下,完全可以通過(guò)“攢微批+降頻率”來(lái)規(guī)避roswet版本過(guò)多的問(wèn)題。實(shí)際上,若業(yè)務(wù)實(shí)時(shí)性要求不高,在機(jī)器內(nèi)存充足的情況下,攢批越大、導(dǎo)入頻率越低,對(duì)StarRocks集群的穩(wěn)定性及查詢性能的影響就越小。
? ?ps:在StarRocks中有更快的攢批導(dǎo)入方式,即Stream Load
從本地文件系統(tǒng)導(dǎo)入 | StarRocks
STREAM LOAD | StarRocks? ?
compaction合并機(jī)制見(jiàn)文章:
第3.2章:Doris數(shù)據(jù)導(dǎo)入——Compaction機(jī)制(1)-CSDN博客文章瀏覽閱讀342次,點(diǎn)贊11次,收藏9次。第3.2章:Doris數(shù)據(jù)導(dǎo)入——Compaction機(jī)制(1)https://blog.csdn.net/SHWAITME/article/details/136172846
四、insert替代用法
? ? 可以概括總結(jié)為以下幾點(diǎn):
- 高頻率小數(shù)據(jù):insert into或者JDBC的executeUpdate()方法就完全不要用;
- 低頻率小數(shù)據(jù):insert into導(dǎo)入幾條測(cè)試數(shù)據(jù)可以用,但注意頻率;
- 低頻率較大數(shù)據(jù):insert into tbl values(data1),(data2)……或者類似JDBC executeBatch()方法,可以用,但不推薦,因?yàn)橛懈斓膶?shí)現(xiàn)方式;
- StarRocks系統(tǒng)內(nèi)部進(jìn)行ETL,推薦使用 insert into select 語(yǔ)法;
- 便捷導(dǎo)入其他系統(tǒng)的數(shù)據(jù),推薦使用外部表,例如:先構(gòu)建mysql外部表去映射mysql系統(tǒng)中的數(shù)據(jù),通過(guò) insert into select 語(yǔ)法將外部表中的數(shù)據(jù)導(dǎo)入到 StarRocks表中。
五、insert使用與調(diào)優(yōu)
5.1嚴(yán)格模式
? ?insert into是一種同步的導(dǎo)入方式,導(dǎo)入成功會(huì)直接顯示導(dǎo)入結(jié)果。如果導(dǎo)入失敗,insert也會(huì)返回錯(cuò)誤信息,例如我們導(dǎo)入錯(cuò)誤時(shí)間格式的數(shù)據(jù)(數(shù)據(jù)漏加引號(hào)):
?(1)針對(duì)tracking_url,使用web或者curl命令訪問(wèn)tracking_url,可以查看更詳細(xì)的錯(cuò)誤信息:顯示報(bào)錯(cuò)原因是:格式不對(duì),強(qiáng)轉(zhuǎn)為null引起的問(wèn)題,接著可以去排查數(shù)據(jù)格式。
(2)嚴(yán)格模式enable_insert_strict:當(dāng)該參數(shù)為false時(shí)(關(guān)閉嚴(yán)格模式),表示一次insert任務(wù)只要有一條或以上數(shù)據(jù)被正確導(dǎo)入,就返回成功。當(dāng)該參數(shù)設(shè)置為true時(shí),表示但凡有一條數(shù)據(jù)錯(cuò)誤,則任務(wù)整體失敗,該參數(shù)默認(rèn)為true。例如:set global enable_insert_strict = false;
? ?ps:當(dāng)關(guān)閉嚴(yán)格模式后,insert即使有錯(cuò)誤數(shù)據(jù),但只要有一條數(shù)據(jù)是正??捎玫?,就會(huì)忽視臟數(shù)據(jù),保證可用數(shù)據(jù)的正常導(dǎo)入。此外,enable_insert_strict參數(shù)是session參數(shù)(當(dāng)前會(huì)話生效),斷開(kāi)當(dāng)前session后,該參數(shù)就會(huì)失效,若需要全局修改,可以加上global。
5.2并行度
? ? insert導(dǎo)入語(yǔ)句本質(zhì)上還是sql,可以通過(guò)設(shè)置合適的并行度來(lái)進(jìn)行加速。例如可以設(shè)置全局并行度為單個(gè)BE節(jié)點(diǎn)的cpu核數(shù)的一半。假設(shè)部署的BE服務(wù)器core數(shù)是16C,那set global parallel_fragment_exec_instance_num = 8。注意:有些場(chǎng)景下,例如:insert into select語(yǔ)句進(jìn)行StarRocks系統(tǒng)內(nèi)部的ETL或者通過(guò)外部表來(lái)拉取數(shù)據(jù),當(dāng)速度過(guò)快。一方面可能導(dǎo)致源庫(kù)壓力過(guò)大影響源庫(kù)中的業(yè)務(wù),另一方面會(huì)導(dǎo)致StarRocks BE的load內(nèi)存和ColumnPool內(nèi)存占用較高,影響集群穩(wěn)定性。所以需要結(jié)合實(shí)際情況,來(lái)設(shè)置合適的并行度控制導(dǎo)入速率
5.3超時(shí)時(shí)間
? ?與insert相關(guān)的超時(shí)參數(shù)有兩個(gè):
- query_timeout
? ? ?可以通過(guò)show variables like '%query_timeout%' 語(yǔ)句查看,?該參數(shù)是session變量,通過(guò)增加global關(guān)鍵詞設(shè)置全局生效??梢酝ㄟ^(guò)set query_timeout = xxx 來(lái)增加超時(shí)時(shí)間,單位是秒(默認(rèn)為300秒)
- insert_load_default_timeout_second
? ? ? 該參數(shù)是fe.conf中的參數(shù),表示導(dǎo)入任務(wù)的超時(shí)時(shí)間(以秒為單位,默認(rèn)是3600秒,即1小時(shí))。如果導(dǎo)入任務(wù)在設(shè)定的超時(shí)時(shí)間內(nèi)未完成則會(huì)被系統(tǒng)取消,變成cancelled。
參考文章:
Insert Into - Apache Doris
通過(guò) INSERT 語(yǔ)句導(dǎo)入數(shù)據(jù) | StarRocks文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-832341.html
第3.1章:StarRocks數(shù)據(jù)導(dǎo)入--Insert into_starrocks insert into-CSDN博客文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-832341.html
到了這里,關(guān)于第3.1章:StarRocks數(shù)據(jù)導(dǎo)入——Insert into 同步模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!