數(shù)據(jù)導(dǎo)入及查詢(xún)
本文檔主要介紹 Doris 的數(shù)據(jù)導(dǎo)入及數(shù)據(jù)查詢(xún)。
數(shù)據(jù)導(dǎo)入方式
Doris 為了滿(mǎn)足不同業(yè)務(wù)場(chǎng)景的數(shù)據(jù)接入需求,提供不豐富的數(shù)據(jù)導(dǎo)入方式,去支持不同的數(shù)據(jù)源:外部存儲(chǔ)(HDFS,對(duì)象存儲(chǔ))、本地文件、消息隊(duì)列(Kafka)及其他外部業(yè)務(wù)系統(tǒng)數(shù)據(jù)庫(kù)(MySQL、Oracle、SQLServer、PostgreSQL等),支持同步和異步的方式將數(shù)據(jù)接入到 Doris 中。
Doris 數(shù)據(jù)計(jì)入方式及生態(tài)系統(tǒng):
Broker Load
Broker Load?是一種異步的數(shù)據(jù)導(dǎo)入方式,通過(guò)?Broker?進(jìn)程訪(fǎng)問(wèn)并讀取外部數(shù)據(jù)源(如:HDFS,對(duì)象存儲(chǔ)(支持S3協(xié)議)),然后通過(guò) MySQL 協(xié)議,通過(guò) Doris SQL 語(yǔ)句的方式將導(dǎo)入任務(wù)提交到 Doris ,然后通過(guò)?show load
?查看數(shù)據(jù)導(dǎo)入進(jìn)度及狀態(tài)。
這種導(dǎo)入方式可以以支撐數(shù)據(jù)量達(dá)數(shù)百 GB 的導(dǎo)入作業(yè)。該導(dǎo)入方式支持 Hive 數(shù)據(jù)源的導(dǎo)入。
支持的數(shù)據(jù)格式:csv、orc、parquet
因?yàn)镈oris 表里的數(shù)據(jù)是有序的,導(dǎo)入方式需要占用 Doris BE 資源進(jìn)行對(duì)數(shù)據(jù)進(jìn)行排序,在大數(shù)據(jù)量的數(shù)據(jù)導(dǎo)入的時(shí)候盡可能避開(kāi)業(yè)務(wù)使用高峰,在資源相對(duì)空閑的時(shí)候進(jìn)行導(dǎo)入。
Spark Load
Spark load?通過(guò)借助于外部的 Spark 計(jì)算資源實(shí)現(xiàn)對(duì)導(dǎo)入數(shù)據(jù)進(jìn)行排序,提高 Doris 大數(shù)據(jù)量的導(dǎo)入性能并且節(jié)省 Doris 集群的計(jì)算資源。主要用于初次遷移,大數(shù)據(jù)量導(dǎo)入 Doris 的場(chǎng)景。對(duì)于歷史海量數(shù)據(jù)遷移降低 Doris 集群資源使用及負(fù)載有很好的效果。
這種方式需要借助于Broker服務(wù),適用于遷移大數(shù)據(jù)量(TB 級(jí)別)的場(chǎng)景。
Spark 支持將 hive 生成的 bitmap 數(shù)據(jù)直接導(dǎo)入到 Doris。詳見(jiàn)?hive-bitmap-udf 文檔。
支持的數(shù)據(jù)格式:csv、orc、parquet
Spark load 是一種異步導(dǎo)入方式,用戶(hù)需要通過(guò) MySQL 協(xié)議創(chuàng)建 Spark 類(lèi)型導(dǎo)入任務(wù),并通過(guò)?SHOW LOAD
?查看導(dǎo)入結(jié)果
Stream Load
Stream Load?是一種同步的數(shù)據(jù)導(dǎo)入方式。用戶(hù)通過(guò) HTTP 協(xié)議提交請(qǐng)求并攜帶原始數(shù)據(jù)(可以是文件,也可以是內(nèi)存數(shù)據(jù))創(chuàng)建導(dǎo)入。主要用于快速將本地文件或數(shù)據(jù)流中的數(shù)據(jù)導(dǎo)入到 Doris。導(dǎo)入命令同步返回導(dǎo)入結(jié)果。
通過(guò)?SHOW STREAM LOAD
方式來(lái)查看 Stream load 作業(yè)情況,默認(rèn) BE 是不記錄 Stream Load 的記錄,如果你要查看需要在 BE 上啟用記錄,配置參數(shù)是:enable_stream_load_record=true
?,具體怎么配置請(qǐng)參照?BE 配置項(xiàng)
這種導(dǎo)入方式支持兩種格式的數(shù)據(jù) CVS 和 JSON 。
Stream load 支持本地文件導(dǎo)入,或者通過(guò)程序?qū)雽?shí)時(shí)數(shù)據(jù)流中的數(shù)據(jù),Spark Connector?和?Flink Connector?就是基于這種方式實(shí)現(xiàn)的。
Routine Load
Routine load?這種方式是以Kafka為數(shù)據(jù)源,從Kafka中讀取數(shù)據(jù)并導(dǎo)入到Doris對(duì)應(yīng)的數(shù)據(jù)表中,用戶(hù)通過(guò) Mysql 客戶(hù)端提交 Routine Load數(shù)據(jù)導(dǎo)入作業(yè),Doris 會(huì)在生成一個(gè)常駐線(xiàn)程,不間斷的從 Kafka 中讀取數(shù)據(jù)并存儲(chǔ)在對(duì)應(yīng)Doris表中,并自動(dòng)維護(hù) Kafka Offset位置。
通過(guò)SHOW ROUTINE LOAD
來(lái)查看Routine load作業(yè)情況。
Insert Into
這種導(dǎo)入方式和 MySQL 中的 Insert 語(yǔ)句類(lèi)似,Apache Doris 提供?INSERT INTO tbl SELECT ...;
?的方式從 Doris 的表(或者ODBC方式的外表)中讀取數(shù)據(jù)并導(dǎo)入到另一張表?;蛘咄ㄟ^(guò)?INSERT INTO tbl VALUES(...);
?插入單條數(shù)據(jù),單條插入方式不建議在生產(chǎn)和測(cè)試環(huán)境中使用,只是演示使用。
INSERT INTO tbl SELECT …
這種方式一般是在Doris內(nèi)部對(duì)數(shù)據(jù)進(jìn)行加工處理,生成中間匯總表,或者在Doris內(nèi)部對(duì)數(shù)據(jù)進(jìn)行ETL操作使用
這種方式是一種同步的數(shù)據(jù)導(dǎo)入方式。
數(shù)據(jù)導(dǎo)入
本例我們以 Stream load 導(dǎo)入當(dāng)時(shí)為例,將文件中的數(shù)據(jù)導(dǎo)入到我們的之前創(chuàng)建的表(expamle_tbl)中 。
CREATE TABLE IF NOT EXISTS test_doris.example_tbl
(
`timestamp` DATE NOT NULL COMMENT "['0000-01-01', '9999-12-31']",
`type` TINYINT NOT NULL COMMENT "[-128, 127]",
`error_code` INT COMMENT "[-2147483648, 2147483647]",
`error_msg` VARCHAR(300) COMMENT "[1-65533]",
`op_id` BIGINT COMMENT "[-9223372036854775808, 9223372036854775807]",
`op_time` DATETIME COMMENT "['0000-01-01 00:00:00', '9999-12-31 23:59:59']",
`target` float COMMENT "4 字節(jié)",
`source` double COMMENT "8 字節(jié)",
`lost_cost` decimal(12,2) COMMENT "",
`remark` string COMMENT "1m size",
`op_userid` LARGEINT COMMENT "[-2^127 + 1 ~ 2^127 - 1]",
`plate` SMALLINT COMMENT "[-32768, 32767]",
`iscompleted` boolean COMMENT "true 或者 false"
)
DUPLICATE KEY(`timestamp`, `type`)
DISTRIBUTED BY HASH(`type`) BUCKETS 1
PROPERTIES (
"replication_allocation" = "tag.location.default: 1"
);
我們創(chuàng)建一個(gè)本地文件 example_tbl.csv ,然后將下面的數(shù)據(jù)寫(xiě)入到這個(gè) csv 文件中,最后我們通過(guò) curl 命令行將這個(gè)文件中的數(shù)據(jù)導(dǎo)入到剛才我們創(chuàng)建的表里。
2022-9-06,1,101,None found,10000000000001,2022-9-06 12:23:24,1000001,2000001,2023.03,This is test doris import,10001,2,true
2022-9-05,2,102,Server Error,10000000000002,2022-9-05 15:23:24,1000003,2000003,202.03,This is test doris import,10002,3,false
我們通過(guò)下面的命令將數(shù)據(jù)導(dǎo)入到 Doris 表中
curl --location-trusted -u root: -T expamle_tbl.csv -H "column_separator:," -H "label:expamle_tbl_import_test" http://localhost:8030/api/test_doris/example_tbl/_stream_load
- 本例中 root 是 Doris 的用戶(hù)名,默認(rèn)密碼是空,若有密碼在root用戶(hù)名后面的冒號(hào)后面跟上密碼
- IP 地址是 FE 的 IP 地址,這里我們是在 FE 的本機(jī),使用了127.0.0.1
- 8030 是 FE 的 http 端口,默認(rèn)是8030
- test_doris 是我們的要導(dǎo)入數(shù)據(jù)表所在的數(shù)據(jù)庫(kù)名稱(chēng)
- example_tbl:使我們剛才創(chuàng)建的表,也是我們要導(dǎo)入的數(shù)據(jù)表的名稱(chēng)
導(dǎo)入完成后會(huì)返回下面這樣的 JSON 格式的響應(yīng)數(shù)據(jù)。
{
"TxnId": 14031,
"Label": "expamle_tbl_import_test",
"TwoPhaseCommit": "false",
"Status": "Success",
"Message": "OK",
"NumberTotalRows": 2,
"NumberLoadedRows": 2,
"NumberFilteredRows": 0,
"NumberUnselectedRows": 0,
"LoadBytes": 250,
"LoadTimeMs": 142,
"BeginTxnTimeMs": 1,
"StreamLoadPutTimeMs": 17,
"ReadDataTimeMs": 0,
"WriteDataTimeMs": 24,
"CommitAndPublishTimeMs": 96
}
- Status:導(dǎo)入任務(wù)的狀態(tài)
- NumberTotalRows : 我們要導(dǎo)入的總數(shù)據(jù)記錄數(shù)
- NumberLoadedRows:導(dǎo)入成功的記錄數(shù)
查詢(xún)
下面我們對(duì)剛才導(dǎo)入的數(shù)據(jù)表進(jìn)行查詢(xún)
select * from example_tbl;
查詢(xún)指定字段并進(jìn)行排序
mysql> select timestamp,error_code,op_id from example_tbl order by error_code desc;
+------------+------------+----------------+
| timestamp | error_code | op_id |
+------------+------------+----------------+
| 2022-09-05 | 102 | 10000000000002 |
| 2022-09-06 | 101 | 10000000000001 |
+------------+------------+----------------+
2 rows in set (0.02 sec)
Doris 支持多種 select 用法,包括:Join,子查詢(xún),With 子句 等,具體參照?SELECT 手冊(cè)。
函數(shù)
Doris 提供了豐富的函數(shù)支持,包括:日期函數(shù)、數(shù)組函數(shù)、地理位置函數(shù)、字符串函數(shù)、聚合函數(shù)、Bitmap函數(shù)、Bitwise函數(shù)、條件函數(shù)、JSON函數(shù)、Hash函數(shù)、數(shù)學(xué)函數(shù)、表函數(shù)、窗口函數(shù)、加密函數(shù)、脫敏函數(shù)等,具體可以參照?Doris SQL 手冊(cè) -> SQL函數(shù)。
外部表
Doris 支持多種數(shù)據(jù)的外部表:ODBC外部表?、?Hudi外部表?,?Iceberg外部表?,?ElasticSearch外部表?,?Hive外部表?。
其中 ODBC 外部表我們支持: MySQL、PostgreSQL、Oracle、SQLServer。
創(chuàng)建好外部表之后,可以通過(guò)查詢(xún)外部表的方式將外部表的數(shù)據(jù)接入到 Doris 里,同時(shí)還可以和 Doris 里的表進(jìn)行關(guān)聯(lián)查詢(xún)分析。
查詢(xún)分析
Doris 支持多種方式分析查詢(xún)瓶頸及優(yōu)化查詢(xún)性能
一般情況下出現(xiàn)慢查詢(xún),我們可以通過(guò)調(diào)整一個(gè) Fragment 實(shí)例的并行數(shù)量?set parallel_fragment_exec_instance_num = 8;
?來(lái)設(shè)置查詢(xún)并行度,從而提高 CPU 資源利用率和查詢(xún)效率。詳細(xì)的參數(shù)介紹及設(shè)置,參考?查詢(xún)并行度。
我們也可以通過(guò)分析 Doris SQL 執(zhí)行計(jì)劃和 Profile 來(lái)定位分析
查看執(zhí)行計(jì)劃
explain select timestamp,error_code,op_id from example_tbl order by error_code desc;
查看 Profile
首先我們需要開(kāi)啟Profile
set enable_profile = true;
然后執(zhí)行 SQL,我們就可以看到這個(gè) SQL 的 Profile
我們可以通過(guò) Doris 提供的 WEBUI 來(lái)進(jìn)行查看,我們?cè)跒g覽器里輸入FE的地址,登錄后就可以看到
http://FE_IP:8030
更詳細(xì)講解請(qǐng)參照?查詢(xún)分析。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-408186.html
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-408186.html
到了這里,關(guān)于Apache Doris 系列: 入門(mén)篇-數(shù)據(jù)導(dǎo)入及查詢(xún)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!