八、Doris外部表及数据导入
DorisDB提供了多種導(dǎo)入方式,用戶(hù)可以根據(jù)數(shù)據(jù)量大小、導(dǎo)入頻率等要求選擇最適合自己業(yè)務(wù)需求的導(dǎo)入方式。
數(shù)據(jù)導(dǎo)入:
1、離線(xiàn)數(shù)據(jù)導(dǎo)入:如果數(shù)據(jù)源是Hive/HDFS,推薦采用Broker Load導(dǎo)入, 如果數(shù)據(jù)表很多導(dǎo)入比較麻煩可以考慮使用Hive外表直連查詢(xún),性能會(huì)比Broker load導(dǎo)入效果差,但是可以避免數(shù)據(jù)搬遷,如果單表的數(shù)據(jù)量特別大,或者需要做全局?jǐn)?shù)據(jù)字典來(lái)精確去重可以考慮Spark Load導(dǎo)入。
2、實(shí)時(shí)數(shù)據(jù)導(dǎo)入:日志數(shù)據(jù)和業(yè)務(wù)數(shù)據(jù)庫(kù)的binlog同步到Kafka以后,優(yōu)先推薦通過(guò)Routine load 導(dǎo)入DorisDB,如果導(dǎo)入過(guò)程中有復(fù)雜的多表關(guān)聯(lián)和ETL預(yù)處理可以使用Flink處理以后用stream load寫(xiě)入DorisDB
3、程序?qū)懭隓orisDB:推薦使用Stream Load
4、Mysql數(shù)據(jù)導(dǎo)入:推薦使用Mysql外表,insert into new_table select * from external_table 的方式導(dǎo)入
5、DorisDB內(nèi)部導(dǎo)入:可以在DorisDB內(nèi)部使用 insert into tablename select 的方式導(dǎo)入,可以跟外部調(diào)度器配合實(shí)現(xiàn)簡(jiǎn)單的ETL處理
6、其他數(shù)據(jù)源導(dǎo)入:推薦使用 DataX 導(dǎo)入
外部表:
DorisDB支持以外部表的形式,接入其他數(shù)據(jù)源。
外部表指的是保存在其他數(shù)據(jù)源中的數(shù)據(jù)表。
目前DorisDB已支持的第三方數(shù)據(jù)源包括 MySQL、HDFS、ElasticSearch,Hive。
重點(diǎn)目錄:
1.1Broker Load
1.2Spark Load
1.3Stream Load
1.4Routine Load
2.1MySQL外部表
2.2ElasticSearch外部表
1.1 Broker Load
在Broker Load模式下,通過(guò)部署的 Broker 程序,DorisDB可讀取對(duì)應(yīng)數(shù)據(jù)源(如HDFS, S3、阿里云 OSS、騰訊 COS)上的數(shù)據(jù),利用自身的計(jì)算資源對(duì)數(shù)據(jù)進(jìn)行預(yù)處理和導(dǎo)入。這是一種異步的導(dǎo)入方式,用戶(hù)需要通過(guò)MySQL協(xié)議創(chuàng)建導(dǎo)入,并通過(guò)查看導(dǎo)入命令檢查導(dǎo)入結(jié)果。
1、名詞解釋
Broker:Broker 為一個(gè)獨(dú)立的無(wú)狀態(tài)進(jìn)程,封裝了文件系統(tǒng)接口,為 DorisDB 提供讀取遠(yuǎn)端存儲(chǔ)系統(tǒng)中文件的能力。
Plan:導(dǎo)入執(zhí)行計(jì)劃,BE會(huì)執(zhí)行導(dǎo)入執(zhí)行計(jì)劃將數(shù)據(jù)導(dǎo)入到DorisDB系統(tǒng)中。
2、語(yǔ)法:
LOAD LABEL db_name.label_name
(data_desc, ...)
WITH BROKER broker_name broker_properties
[PROPERTIES (key1=value1, ... )]
data_desc:
DATA INFILE ('file_path', ...)
[NEGATIVE]
INTO TABLE tbl_name
[PARTITION (p1, p2)]
[COLUMNS TERMINATED BY column_separator ]
[FORMAT AS file_type]
[(col1, ...)]
[SET (k1=f1(xx), k2=f2(xx))]
[WHERE predicate]
broker_properties:
(key2=value2, ...)
說(shuō)明:
1)、Label:導(dǎo)入任務(wù)的標(biāo)識(shí)。每個(gè)導(dǎo)入任務(wù),都有一個(gè)數(shù)據(jù)庫(kù)內(nèi)部唯一的Label。Label是用戶(hù)在導(dǎo)入命令中自定義的名稱(chēng)。
通過(guò)這個(gè)Label,用戶(hù)可以查看對(duì)應(yīng)導(dǎo)入任務(wù)的執(zhí)行情況,并且Label可以用來(lái)防止用戶(hù)導(dǎo)入相同的數(shù)據(jù)。
當(dāng)導(dǎo)入任務(wù)狀態(tài)為FINISHED時(shí),對(duì)應(yīng)的Label就不能再次使用了。
當(dāng) Label 對(duì)應(yīng)的導(dǎo)入任務(wù)狀態(tài)為CANCELLED時(shí),可以再次使用該Label提交導(dǎo)入作業(yè)。
2)、data_desc:每組 data_desc表述了本次導(dǎo)入涉及到的數(shù)據(jù)源地址,ETL 函數(shù),目標(biāo)表及分區(qū)等信息。
示例 :參見(jiàn):https://www.kancloud.cn/dorisdb/dorisdb/2146000
1.2Spark Load
Spark Load 通過(guò)外部的 Spark 資源實(shí)現(xiàn)對(duì)導(dǎo)入數(shù)據(jù)的預(yù)處理,提高 DorisDB 大數(shù)據(jù)量的導(dǎo)入性能并且節(jié)省 Doris 集群的計(jì)算資源。主要用于初次遷移、大數(shù)據(jù)量導(dǎo)入 DorisDB 的場(chǎng)景(數(shù)據(jù)量可到TB級(jí)別)
1、基本原理
Spark Load 任務(wù)的執(zhí)行主要分為以下幾個(gè)階段:
1、用戶(hù)向 FE 提交 Spark Load 任務(wù);
2、FE 調(diào)度提交 ETL 任務(wù)到 Spark 集群執(zhí)行。
3、Spark 集群執(zhí)行 ETL 完成對(duì)導(dǎo)入數(shù)據(jù)的預(yù)處理。包括全局字典構(gòu)建(BITMAP類(lèi)型)、分區(qū)、排序、聚合等。
4、ETL 任務(wù)完成后,F(xiàn)E 獲取預(yù)處理過(guò)的每個(gè)分片的數(shù)據(jù)路徑,并調(diào)度相關(guān)的 BE 執(zhí)行 Push 任務(wù)。
5、BE 通過(guò) Broker 讀取數(shù)據(jù),轉(zhuǎn)化為 DorisDB 存儲(chǔ)格式。
6、FE 調(diào)度生效版本,完成導(dǎo)入任務(wù)。
2、預(yù)處理流程:
1、從數(shù)據(jù)源讀取數(shù)據(jù),上游數(shù)據(jù)源可以是HDFS文件,也可以是Hive表。
2、對(duì)讀取到的數(shù)據(jù)完成字段映射、表達(dá)式計(jì)算,并根據(jù)分區(qū)信息生成分桶字段bucket_id。
3、根據(jù)DorisDB表的Rollup元數(shù)據(jù)生成RollupTree。
4、遍歷RollupTree,進(jìn)行分層的聚合操作,下一個(gè)層級(jí)的Rollup可以由上一個(gè)層的Rollup計(jì)算得來(lái)。
5、每次完成聚合計(jì)算后,會(huì)對(duì)數(shù)據(jù)根據(jù)bucket_id進(jìn)行分桶然后寫(xiě)入HDFS中。
6、后續(xù)Broker會(huì)拉取HDFS中的文件然后導(dǎo)入DorisDB BE節(jié)點(diǎn)中。
3、基本操作參見(jiàn):https://www.kancloud.cn/dorisdb/dorisdb/2146001
1.3Stream Load
Stream Load 是一種同步的導(dǎo)入方式,用戶(hù)通過(guò)發(fā)送 HTTP 請(qǐng)求將本地文件或數(shù)據(jù)流導(dǎo)入到 DorisDB 中。Stream Load 同步執(zhí)行導(dǎo)入并返回導(dǎo)入結(jié)果。用戶(hù)可直接通過(guò)請(qǐng)求的返回值判斷導(dǎo)入是否成功。
1、主要流程:
說(shuō)明:
Stream Load 中,用戶(hù)通過(guò)HTTP協(xié)議提交導(dǎo)入命令。
如果提交到FE節(jié)點(diǎn),則FE節(jié)點(diǎn)會(huì)通過(guò)HTTP redirect指令將請(qǐng)求轉(zhuǎn)發(fā)給某一個(gè)BE節(jié)點(diǎn),用戶(hù)也可以直接提交導(dǎo)入命令給某一指定BE節(jié)點(diǎn)。
該BE節(jié)點(diǎn)作為Coordinator節(jié)點(diǎn),將數(shù)據(jù)按表schema劃分并分發(fā)數(shù)據(jù)到相關(guān)的BE節(jié)點(diǎn)。
導(dǎo)入的最終結(jié)果由 Coordinator節(jié)點(diǎn)返回給用戶(hù)。
2、基本操作參見(jiàn):https://www.kancloud.cn/dorisdb/dorisdb/2146002
1.4Routine Load
Routine Load 是一種例行導(dǎo)入方式,DorisDB通過(guò)這種方式支持從Kafka持續(xù)不斷的導(dǎo)入數(shù)據(jù),并且支持通過(guò)SQL控制導(dǎo)入任務(wù)的暫停、重啟、停止
1、基本原理
導(dǎo)入流程說(shuō)明:
1、用戶(hù)通過(guò)支持MySQL協(xié)議的客戶(hù)端向 FE 提交一個(gè)Kafka導(dǎo)入任務(wù)。
2、FE將一個(gè)導(dǎo)入任務(wù)拆分成若干個(gè)Task,每個(gè)Task負(fù)責(zé)導(dǎo)入指定的一部分?jǐn)?shù)據(jù)。
3、每個(gè)Task被分配到指定的 BE 上執(zhí)行。在 BE 上,一個(gè) Task 被視為一個(gè)普通的導(dǎo)入任務(wù),通過(guò) Stream Load 的導(dǎo)入機(jī)制進(jìn)行導(dǎo)入。
4、BE導(dǎo)入完成后,向 FE 匯報(bào)。
5、FE 根據(jù)匯報(bào)結(jié)果,繼續(xù)生成后續(xù)新的 Task,或者對(duì)失敗的 Task 進(jìn)行重試。
6、FE 會(huì)不斷的產(chǎn)生新的 Task,來(lái)完成數(shù)據(jù)不間斷的導(dǎo)入。
2、基本操作參見(jiàn):https://www.kancloud.cn/dorisdb/dorisdb/2146003
2.1MySQL外部表
星型模型中,數(shù)據(jù)一般劃分為維度表和事實(shí)表。維度表數(shù)據(jù)量少,但會(huì)涉及UPDATE操作。目前DorisDB中還不直接支持UPDATE操作(可以通過(guò)Unique數(shù)據(jù)模型實(shí)現(xiàn)),在一些場(chǎng)景下,可以把維度表存儲(chǔ)在MySQL中,查詢(xún)時(shí)直接讀取維度表。
在使用MySQL的數(shù)據(jù)之前,需在DorisDB創(chuàng)建外部表,與之相映射。DorisDB中創(chuàng)建MySQL外部表時(shí)需要指定MySQL的相關(guān)連接信息,如下圖。
2.2ElasticSearch外部表
DorisDB與ElasticSearch都是目前流行的分析系統(tǒng),DorisDB強(qiáng)于大規(guī)模分布式計(jì)算,ElasticSearch擅長(zhǎng)全文檢索。DorisDB支持ElasticSearch訪(fǎng)問(wèn)的目的,就在于將這兩種能力結(jié)合,提供更完善的一個(gè)OLAP解決方案。
1、建表示例
2、謂詞下推
DorisDB支持對(duì)ElasticSearch表進(jìn)行謂詞下推,把過(guò)濾條件推給ElasticSearch進(jìn)行執(zhí)行,讓執(zhí)行盡量靠近存儲(chǔ),提高查詢(xún)性能。目前支持哪個(gè)下推的算子如下表。
3、詳細(xì)說(shuō)明參見(jiàn):https://www.kancloud.cn/dorisdb/dorisdb/2146013
參考資料:
https://www.kancloud.cn/dorisdb/dorisdb/2145999
總結(jié)
以上是生活随笔為你收集整理的八、Doris外部表及数据导入的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 招隐-古琴曲-山中鸣琴,万籁声沉沉,何泠
- 下一篇: 20175213 2018-2019-2