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