Doris(五) -- 數據的導入導出

来源:https://www.cnblogs.com/paopaoT/archive/2023/05/30/17444248.html
-Advertisement-
Play Games

# 數據導入 ## 使用 Insert 方式同步數據 用戶可以通過 MySQL 協議,使用 INSERT 語句進行數據導入 INSERT 語句的使用方式和 MySQL 等資料庫中 INSERT 語句的使用方式類似。 INSERT 語句支持以下兩種語法: ```SQL INSERT INTO tabl ...


數據導入

使用 Insert 方式同步數據

用戶可以通過 MySQL 協議,使用 INSERT 語句進行數據導入
INSERT 語句的使用方式和 MySQL 等資料庫中 INSERT 語句的使用方式類似。 INSERT 語句支持以下兩種語法:

INSERT INTO table SELECT ...
INSERT INTO table VALUES(...)

對於 Doris 來說,一個 INSERT 命令就是一個完整的導入事務。

因此不論是導入一條數據,還是多條數據,我們都不建議在生產環境使用這種方式進行數據導入。高頻次的 INSERT 操作會導致在存儲層產生大量的小文件,會嚴重影響系統性能。

該方式僅用於線下簡單測試或低頻少量的操作。
或者可以使用以下方式進行批量的插入操作:

INSERT INTO example_tbl VALUES
(1000, "baidu1", 3.25)
(2000, "baidu2", 4.25)
(3000, "baidu3", 5.25);

Stream Load

用於將本地文件導入到doris中。Stream Load 是通過 HTTP 協議與 Doris 進行連接交互的。
該方式中涉及 HOST:PORT 都是對應的HTTP 協議埠。
• BE 的 HTTP 協議埠,預設為 8040。
• FE 的 HTTP 協議埠,預設為 8030。
但須保證客戶端所在機器網路能夠聯通FE, BE 所在機器。

-- 創建表
drop table if exists load_local_file_test;
CREATE TABLE IF NOT EXISTS load_local_file_test
(
    id INT,
    name VARCHAR(50),
    age TINYINT
)
unique key(id)
DISTRIBUTED BY HASH(id) BUCKETS 3;
# 創建文件
1,zss,28
2,lss,28
3,ww,88

# 導入數據
## 語法示例
 curl \
 -u user:passwd \  # 賬號密碼
 -H "label:load_local_file_test" \  # 本次任務的唯一標識
 -T 文件地址 \
 http://主機名:埠號/api/庫名/表名/_stream_load
# user:passwd 為在 Doris 中創建的用戶。初始用戶為 admin / root,密碼初始狀態下為空。
# host:port 為 BE 的 HTTP 協議埠,預設是 8040,可以在 Doris 集群 WEB UI頁面查看。
# label: 可以在 Header 中指定 Label 唯一標識這個導入任務。


curl \
 -u root:123 \
 -H "label:load_local_file" \
 -H "column_separator:," \
 -T /root/data/loadfile.txt \
http://doitedu01:8040/api/test/load_local_file_test/_stream_load

curl的一些可配置的參數

  1. label: 導入任務的標簽,相同標簽的數據無法多次導入。(標簽預設保留30分鐘)
  2. column_separator:用於指定導入文件中的列分隔符,預設為\t。
  3. line_delimiter:用於指定導入文件中的換行符,預設為\n。
  4. columns:用於指定文件中的列和table中列的對應關係,預設一一對應
  5. where: 用來過濾導入文件中的數據
  6. max_filter_ratio:最大容忍可過濾(數據不規範等原因)的數據比例。預設零容忍。數據不規範不包括通過 where 條件過濾掉的行。
  7. partitions: 用於指定這次導入所設計的partition。如果用戶能夠確定數據對應的partition,推薦指定該項。不滿足這些分區的數據將被過濾掉。
  8. timeout: 指定導入的超時時間。單位秒。預設是 600 秒。可設置範圍為 1 秒 ~ 259200 秒。
  9. timezone: 指定本次導入所使用的時區。預設為東八區。該參數會影響所有導入涉及的和時區有關的函數結果。
  10. exec_mem_limit: 導入記憶體限制。預設為 2GB。單位為位元組。
  11. format: 指定導入數據格式,預設是csv,支持json格式。
  12. read_json_by_line: 布爾類型,為true表示支持每行讀取一個json對象,預設值為false。
  13. merge_type: 數據的合併類型,一共支持三種類型APPEND、DELETE、MERGE 其中,APPEND是預設值,表示這批數據全部需要追加到現有數據中,DELETE 表示刪除與這批數據key相同的所有行,MERGE 語義 需要與delete 條件聯合使用,表示滿足delete 條件的數據按照DELETE 語義處理其餘的按照APPEND 語義處理, 示例:-H "merge_type: MERGE" -H "delete: flag=1"
  14. delete: 僅在 MERGE下有意義, 表示數據的刪除條件 function_column.sequence_col: 只適用於UNIQUE_KEYS,相同key列下,保證value列按照source_sequence列進行REPLACE, source_sequence可以是數據源中的列,也可以是表結構中的一列。

建議一個導入請求的數據量控制在 1 - 2 GB 以內。如果有大量本地文件,可以分批併發提交。

導入json數據

# 準備數據
{"id":1,"name":"liuyan","age":18}
{"id":2,"name":"tangyan","age":18}
{"id":3,"name":"jinlian","age":18}
{"id":4,"name":"dalang","age":18}
{"id":5,"name":"qingqing","age":18}

curl \
 -u root: \
 -H "label:load_local_file_json_20221126" \
 -H "columns:id,name,age" \
 -H "max_filter_ratio:0.1" \
 -H "timeout:1000" \
 -H "exec_mem_limit:1G" \
 -H "where:id>1" \
 -H "format:json" \
 -H "read_json_by_line:true" \
 -H "merge_type:delete" \
 -T /root/data/json.txt \
http://doitedu01:8040/api/test/load_local_file_test/_stream_load
  -H "merge_type:append" \
  # 會把id = 3 的這條數據刪除
  -H "merge_type:MERGE" \
  -H "delete:id=3"

外部存儲數據導入(hdfs)

適用場景

• 源數據在 Broker 可以訪問的存儲系統中,如 HDFS。
• 數據量在幾十到百 GB 級別。

基本原理

  1. 創建提交導入的任務
  2. FE生成執行計劃並將執行計劃分發到多個BE節點上(每個BE節點都導入一部分數據)
  3. BE收到執行計劃後開始執行,從broker上拉取數據到自己的節點上
  4. 所有BE都完成後,FE決定是否導入成功,返回結果給客戶端
-- 新建一張表
drop table if exists load_hdfs_file_test1;
CREATE TABLE IF NOT EXISTS load_hdfs_file_test1
(
    id INT,
    name VARCHAR(50),
    age TINYINT
)
unique key(id)
DISTRIBUTED BY HASH(id) BUCKETS 3;
將本地的數據導入到hdfs上面
hdfs dfs -put ./loadfile.txt  hdfs://linux01:8020/
hdfs dfs -ls  hdfs://linux01:8020/
-- 導入語法
LOAD LABEL test.label_202204(
[MERGE|APPEND|DELETE]  -- 不寫就是append
DATA INFILE
(
"file_path1"[, file_path2, ...]  -- 描述數據的路徑   這邊可以寫多個 ,以逗號分割
)
[NEGATIVE]               -- 負增長
INTO TABLE `table_name`  -- 導入的表名字
[PARTITION (p1, p2, ...)] -- 導入到哪些分區,不符合這些分區的就會被過濾掉
[COLUMNS TERMINATED BY "column_separator"]  -- 指定分隔符
[FORMAT AS "file_type"] -- 指定存儲的文件類型
[(column_list)] -- 指定導入哪些列 
[COLUMNS FROM PATH AS (c1, c2, ...)]  -- 從路勁中抽取的部分列
[SET (column_mapping)] -- 對於列可以做一些映射,寫一些函數
-- 這個參數要寫在要寫在set的後面
[PRECEDING FILTER predicate]  -- 在mapping前做過濾做一些過濾
[WHERE predicate]  -- 在mapping後做一些過濾  比如id>10 
[DELETE ON expr] --根據欄位去做一些抵消消除的策略  需要配合MERGE
[ORDER BY source_sequence] -- 導入數據的時候保證數據順序
[PROPERTIES ("key1"="value1", ...)]  -- 一些配置參數
-- 將hdfs上的數據load到表中
LOAD LABEL test.label_20221125
(
DATA INFILE("hdfs://linux01:8020/test.txt")
INTO TABLE `load_hdfs_file_test`
COLUMNS TERMINATED BY ","
(id,name,age)
)
with HDFS (
"fs.defaultFS"="hdfs://linux01:8020",
"hadoop.username"="root"
)
PROPERTIES
(
"timeout"="1200",
"max_filter_ratio"="0.1"
);


-- 這是一個非同步的操作,所以需要去查看下執行的狀態
show load order by createtime desc limit 1\G;

從 HDFS 導入數據,使用通配符匹配兩批兩批文件。分別導入到兩個表中

LOAD LABEL example_db.label2
(
    DATA INFILE("hdfs://linux01:8020/input/file-10*")
    INTO TABLE `my_table1`
    PARTITION (p1)
    COLUMNS TERMINATED BY ","
    FORMAT AS "parquet"  
    (id, tmp_salary, tmp_score) 
    SET (
        salary= tmp_salary + 1000,
        score = tmp_score + 10
    ),
    DATA INFILE("hdfs://linux01:8020/input/file-20*")
    INTO TABLE `my_table2`
    COLUMNS TERMINATED BY ","
    (k1, k2, k3)
)
with HDFS (
"fs.defaultFS"="hdfs://linux01:8020",
"hadoop.username"="root"
)


-- 導入數據,並提取文件路徑中的分區欄位
LOAD LABEL example_db.label10
(
    DATA INFILE("hdfs://linux01:8020/user/hive/warehouse/table_name/dt=20221125/*")
    INTO TABLE `my_table`
    FORMAT AS "csv"
    (k1, k2, k3)
    COLUMNS FROM PATH AS (dt)
)
WITH BROKER hdfs
(
    "username"="root",
    "password"="123"
);

-- 對待導入數據進行過濾。
LOAD LABEL example_db.label6
(
    DATA INFILE("hdfs://linux01:8020/input/file")
    INTO TABLE `my_table`
    (k1, k2, k3)
    SET (
        k2 = k2 + 1
    )
        PRECEDING FILTER k1 = 1  ==》前置過濾
    WHERE k1 > k2   ==》 後置過濾
)
WITH BROKER hdfs
(
    "username"="root",
    "password"="123"
);

-- 只有原始數據中,k1 = 1,並且轉換後,k1 > k2 的行才會被導入。

取消導入任務

當 Broker load 作業狀態不為 CANCELLED 或 FINISHED 時,可以被用戶手動取消。
取消時需要指定待取消導入任務的 Label 。取消導入命令語法可執行 HELP CANCEL LOAD 查看。

CANCEL LOAD [FROM db_name] WHERE LABEL="load_label"; 

通過外部表同步數據

Doris 可以創建外部表。創建完成後,可以通過 SELECT 語句直接查詢外部表的數據,也可以通過 INSERT INTO SELECT 的方式導入外部表的數據。

Doris 外部表目前支持的數據源包括:MySQL,Oracle,Hive,PostgreSQL,SQLServer,Iceberg,ElasticSearch

-- 整體語法
CREATE [EXTERNAL] TABLE table_name ( 
 col_name col_type [NULL | NOT NULL] [COMMENT "comment"] 
) ENGINE=HIVE
[COMMENT "comment"]
PROPERTIES (
-- 我要映射的hive表在哪個庫裡面
-- 映射的表名是哪一張
-- hive的元數據服務地址
 'property_name'='property_value',
 ...
);

-- 參數說明:
-- 1.外表列 
-- 	列名要與 Hive 表一一對應
-- 	列的順序需要與 Hive 表一致
-- 	必須包含 Hive 表中的全部列
-- 	Hive 表分區列無需指定,與普通列一樣定義即可。 
-- 2.ENGINE 需要指定為 HIVE 
-- 3.PROPERTIES 屬性: 
-- 	hive.metastore.uris:Hive Metastore 服務地址 
-- 	database:掛載 Hive 對應的資料庫名 
-- 	table:掛載 Hive 對應的表名 

完成在 Doris 中建立 Hive 外表後,除了無法使用 Doris 中的數據模型(rollup、預聚合、物化視圖等)外,與普通的 Doris OLAP 表並無區別

-- 在Hive 中創建一個測試用表:
CREATE TABLE `user_info` ( 
 `id` int, 
 `name` string, 
 `age` int
) stored as orc;

insert into user_info values (1,'zss',18);
insert into user_info values (2,'lss',20);
insert into user_info values (3,'ww',25);

-- Doris 中創建外部表
CREATE EXTERNAL TABLE `hive_user_info` (
 `id` int, 
 `name` varchar(10), 
 `age` int 
) ENGINE=HIVE 
PROPERTIES ( 
'hive.metastore.uris' = 'thrift://linux01:9083', 
'database' = 'db1', 
'table' = 'user_info' 
);

外部表創建好後,就可以直接在doris中對這個外部表進行查詢了
直接查詢外部表,無法利用到doris自身的各種查詢優化機制!

select * from hive_user_info;

-- 將數據從外部表導入內部表
-- 數據從外部表導入內部表後,就可以利用doris自身的查詢優勢了!
-- 假設要導入的目標內部表為: doris_user_info  (需要提前創建)

CREATE TABLE IF NOT EXISTS doris_user_info
(
    id INT,
    name VARCHAR(50),
    age TINYINT
)
unique key(id)
DISTRIBUTED BY HASH(id) BUCKETS 3;

-- 就是用sql查詢,從外部表中select出數據後,insert到內部表即可
insert into doris_user_info
select
 *
from hive_user_info;

註意:
Hive 表 Schema 變更不會自動同步,需要在 Doris 中重建 Hive 外表。
當前 Hive 的存儲格式僅支持 Text,Parquet 和 ORC 類型

Binlog Load

Binlog Load提供了一種使Doris增量同步用戶在Mysql資料庫中對數據更新操作的CDC(Change Data Capture)功能。

基本原理
當前版本設計中,Binlog Load需要依賴canal作為中間媒介,讓canal偽造成一個從節點去獲取Mysql主節點上的Binlog並解析,再由Doris去獲取Canal上解析好的數據,主要涉及Mysql端、Canal端以及Doris端

  1. FE會為每個數據同步作業啟動一個canal client,來向canal server端訂閱並獲取數據。
  2. client中的receiver將負責通過Get命令接收數據,每獲取到一個數據batch,都會由consumer根據對應表分發到不同的channel,每個channel都會為此數據batch產生一個發送數據的子任務Task。
  3. 在FE上,一個Task是channel向BE發送數據的子任務,裡面包含分發到當前channel的同一個batch的數據。
  4. channel控制著單個表事務的開始、提交、終止。一個事務周期內,一般會從consumer獲取到多個batch的數據,因此會產生多個向BE發送數據的子任務Task,在提交事務成功前,這些Task不會實際生效。
  5. 滿足一定條件時(比如超過一定時間、達到提交最大數據大小),consumer將會阻塞並通知各個channel提交事務。
  6. 當且僅當所有channel都提交成功,才會通過Ack命令通知canal並繼續獲取並消費數據。
  7. 如果有任意channel提交失敗,將會重新從上一次消費成功的位置獲取數據並再次提交(已提交成功的channel不會再次提交以保證冪等性)。
  8. 整個數據同步作業中,FE通過以上流程不斷的從canal獲取數據並提交到BE,來完成數據同步。

Mysql端

在Mysql Cluster模式的主從同步中,二進位日誌文件(Binlog)記錄了主節點上的所有數據變化,數據在Cluster的多個節點間同步、備份都要通過Binlog日誌進行,從而提高集群的可用性。架構通常由一個主節點(負責寫)和一個或多個從節點(負責讀)構成,所有在主節點上發生的數據變更將會複製給從節點。
註意:目前必須要使用Mysql 5.7及以上的版本才能支持Binlog Load功能。

# 打開mysql的二進位binlog日誌功能,則需要編輯my.cnf配置文件設置一下。
find / -name my.cnf
/etc/my.cnf
# 修改mysqld中的一些配置文件
[mysqld]
server_id = 1
log-bin = mysql-bin
binlog-format = ROW

#binlog-format 的三種模式
#ROW   記錄每一行數據的信息
#Statement  記錄sql語句
#Mixed   上面兩種的混合

# 重啟 MySQL 使配置生效
systemctl restart mysqld 
-- 創建用戶並授權
-- 設置這些參數可以使得mysql的密碼簡單化
set global validate_password_length=4; 
set global validate_password_policy=0; 
-- 新增一個canal的用戶,讓他監聽所有庫中的所有表,並且設置密碼為canal
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%' IDENTIFIED BY 'canal' ;
-- 刷新一下許可權
FLUSH PRIVILEGES;

-- 準備測試表
CREATE TABLE `user_doris2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `gender` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

配置 Canal 端

Canal 是屬於阿裡巴巴 otter 項目下的一個子項目,主要用途是基於 MySQL 資料庫增量日誌解析,提供增量數據訂閱和消費,用於解決跨機房同步的業務場景,建議使用 canal 1.1.5及以上版本。

下載地址:https://github.com/alibaba/canal/releases

# 上傳並解壓 canal deployer壓縮包
mkdir /opt/apps/canal
tar -zxvf canal.deployer-1.1.5.tar.gz -C /opt/apps/canal

# 在 conf 文件夾下新建目錄並重命名 
# 一個 canal 服務中可以有多個 instance,conf/下的每一個目錄即是一個實例,每個實例下麵都有獨立的配置文件
mkdir /opt/apps/canel/conf/doris

# 拷貝配置文件模板 
cp /opt/apps/canal/conf/example/instance.properties /opt/apps/canal/conf/doris/
# 修改 conf/canal.properties 的配置
vi canal.properties

# 進入找到canal.destinations = example
# 將其修改為 我們自己配置的目錄
canal.destinations = doris
# 修改 instance 配置文件
vi instance.properties 
# 修改:
canal.instance.master.address=doitedu01:3306
# 啟動
sh bin/startup.sh

註意:canal client 和 canal instance 是一一對應的,Binlog Load 已限制多個數據同步作 業不能連接到同一個 destination。

配置目標表

基本語法:
CREATE SYNC [db.]job_name
(
 channel_desc,
 channel_desc
 ...
)
binlog_desc
-- 參數說明:
-- job_name:是數據同步作業在當前資料庫內的唯一標識
-- channel_desc :用來定義任務下的數據通道,可表示 MySQL 源表到 doris 目標表的映射關係。在設置此項時,如果存在多個映射關係,必須滿足 MySQL 源表應該與 doris 目標表是一一對應關係,其他的任何映射關係(如一對多關係),檢查語法時都被視為不合法。
-- column_mapping:主要指MySQL源表和doris目標表的列之間的映射關係,如果不指定,FE 會預設源表和目標表的列按順序一一對應。但是我們依然建議顯式的指定列的映射關係,這樣當目標表的結構發生變化(比如增加一個 nullable 的列),數據同步作業依然可以進行。否則,當發生上述變動後,因為列映射關係不再一一對應,導入將報錯。 
-- binlog_desc:定義了對接遠端 Binlog 地址的一些必要信息,目前可支持的對接類型只有 canal 方式,所有的配置項前都需要加上 canal 首碼。
-- 	canal.server.ip: canal server 的地址 
-- 	canal.server.port: canal server 的埠 
-- 	canal.destination: 前文提到的 instance 的字元串標識 
-- 	canal.batchSize: 每批從 canal server 處獲取的 batch 大小的最大值,預設 8192 
-- 	canal.username: instance 的用戶名 
-- 	canal.password: instance 的密碼 
-- 	canal.debug: 設置為 true 時,會將 batch 和每一行數據的詳細信息都列印出來,會影響性能。



-- Doris 創建與 Mysql 對應的目標表
CREATE TABLE `binlog_mysql` ( 
 `id` int(11) NOT NULL COMMENT "", 
 `name` VARCHAR(50) NOT NULL COMMENT "", 
 `age` int(11) NOT NULL COMMENT "" ,
 `gender` VARCHAR(50) NOT NULL COMMENT ""
) ENGINE=OLAP 
UNIQUE KEY(`id`) 
DISTRIBUTED BY HASH(`id`) BUCKETS 1; 


CREATE SYNC test.job20221228
(
 FROM test.binlog_test INTO binlog_test
)
FROM BINLOG 
(
 "type" = "canal",
 "canal.server.ip" = "linux01",
 "canal.server.port" = "11111",
 "canal.destination" = "doris",
 "canal.username" = "canal",
 "canal.password" = "canal"
);

-- 查看作業狀態
-- 展示當前資料庫的所有數據同步作業狀態。 
SHOW SYNC JOB; 
-- 展示資料庫 `test_db` 下的所有數據同步作業狀態。 
SHOW SYNC JOB FROM `test`; 

-- 停止名稱為 `job_name` 的數據同步作業 
STOP SYNC JOB [db.]job_name 

-- 暫停名稱為 `job_name` 的數據同步作業 
PAUSE SYNC JOB [db.]job_name 

-- 恢複名稱為 `job_name` 的數據同步作業 
RESUME SYNC JOB `job_name` 

數據導出

數據導出(Export)是 Doris 提供的一種將數據導出的功能。該功能可以將用戶指定的表或分區的數據,以文本的格式,通過 Broker 進程導出到遠端存儲上,如 HDFS / 對象存儲(支持S3協議) 等。
原理

  1. 用戶提交一個 Export 作業到 FE。
  2. FE 的 Export 調度器會通過兩階段來執行一個 Export 作業:
  3. PENDING:FE 生成 ExportPendingTask,向 BE 發送 snapshot 命令,對所有涉及到的 Tablet 做一個快照。並生成多個查詢計劃。
  4. EXPORTING:FE 生成 ExportExportingTask,開始執行查詢計劃。

查詢計劃拆分

Export 作業會生成多個查詢計劃,每個查詢計劃負責掃描一部分 Tablet。每個查詢計劃掃描的 Tablet 個數由 FE 配置參數 export_tablet_num_per_task 指定,預設為 5。即假設一共 100 個 Tablet,則會生成 20 個查詢計劃。用戶也可以在提交作業時,通過作業屬性 tablet_num_per_task 指定這個數值。
一個作業的多個查詢計劃順序執行

查詢計劃執行

一個查詢計劃掃描多個分片,將讀取的數據以行的形式組織,每 1024 行為一個 batch,調用 Broker 寫入到遠端存儲上。
查詢計劃遇到錯誤會整體自動重試 3 次。如果一個查詢計劃重試 3 次依然失敗,則整個作業失敗。
Doris 會首先在指定的遠端存儲的路徑中,建立一個名為 __doris_export_tmp_12345 的臨時目錄(其中 12345 為作業 id)。導出的數據首先會寫入這個臨時目錄。每個查詢計劃會生成一個文件,文件名示例:

export-data-c69fcf2b6db5420f-a96b94c1ff8bccef-1561453713822

其中 c69fcf2b6db5420f-a96b94c1ff8bccef 為查詢計劃的 query id。1561453713822 為文件生成的時間戳。當所有數據都導出後,Doris 會將這些文件 rename 到用戶指定的路徑中

示例:導出到hdfs

EXPORT TABLE test.event_info_log1 -- 庫名.表名
to "hdfs://linux01:8020/event_info_log1"  -- 導出到那裡去
PROPERTIES
(
    "label" = "event_info_log1",
    "column_separator"=",",
    "exec_mem_limit"="2147483648",
    "timeout" = "3600"
)
WITH BROKER "broker_name"
(
    "username" = "root",
    "password" = ""
);

-- 1.label:本次導出作業的標識。後續可以使用這個標識查看作業狀態。
-- 2.column_separator:列分隔符。預設為 \t。支持不可見字元,比如 '\x07'。
-- 3.columns:要導出的列,使用英文狀態逗號隔開,如果不填這個參數預設是導出表的所有列。
-- 4.line_delimiter:行分隔符。預設為 \n。支持不可見字元,比如 '\x07'。
-- 5.exec_mem_limit: 表示 Export 作業中,一個查詢計劃在單個 BE 上的記憶體使用限制。預設 2GB。單位位元組。
-- 6.timeout:作業超時時間。預設 2小時。單位秒。
-- 7.tablet_num_per_task:每個查詢計劃分配的最大分片數。預設為 5。


-- 查看導出狀態
show EXPORT \G;

註意事項

  1. 不建議一次性導出大量數據。一個 Export 作業建議的導出數據量最大在幾十 GB。過大的導出會導致更多的垃圾文件和更高的重試成本。
  2. 如果表數據量過大,建議按照分區導出。
  3. 在 Export 作業運行過程中,如果 FE 發生重啟或切主,則 Export 作業會失敗,需要用戶重新提交。
  4. 如果 Export 作業運行失敗,在遠端存儲中產生的 __doris_export_tmp_xxx 臨時目錄,以及已經生成的文件不會被刪除,需要用戶手動刪除。
  5. 如果 Export 作業運行成功,在遠端存儲中產生的 __doris_export_tmp_xxx 目錄,根據遠端存儲的文件系統語義,可能會保留,也可能會被清除。比如在百度對象存儲(BOS)中,通過 rename 操作將一個目錄中的最後一個文件移走後,該目錄也會被刪除。如果該目錄沒有被清除,用戶可以手動清除
  6. 當 Export 運行完成後(成功或失敗),FE 發生重啟或切主,則 SHOW EXPORT展示的作業的部分信息會丟失,無法查看。
  7. Export 作業只會導出 Base 表的數據,不會導出 Rollup Index 的數據。
  8. Export 作業會掃描數據,占用 IO 資源,可能會影響系統的查詢延遲

查詢結果導出

SELECT INTO OUTFILE 語句可以將查詢結果導出到文件中。目前支持通過 Broker進程, 通過 S3 協議, 或直接通過 HDFS 協議,導出到遠端存儲,如 HDFS,S3,BOS,COS (騰訊雲)上。

-- 語法
query_stmt  -- 查詢語句
INTO OUTFILE "file_path"  --導出文件的路勁
[format_as]  -- 指定文件存儲的格式
[properties]  -- 一些配置文件

file_path:指向文件存儲的路徑以及文件首碼。如 hdfs://path/to/my_file_.最終的文件名將由 my_file_,文件序號以及文件格式尾碼組成。其中文件序號由 0 開始,數量為文件被分割的數量

-- 如
my_file_abcdefg_0.csv 
my_file_abcdefg_1.csv 
my_file_abcdegf_2.csv 

-- [format_as]:指定導出格式。預設為 CSV
-- [properties]:指定相關屬性。目前支持通過 Broker 進程,hdfs協議等
-- Broker 相關屬性需加首碼 broker.
-- HDFS 相關屬性需加首碼 hdfs. 其中hdfs.fs.defaultFS 用於填寫 namenode地址和埠,屬於必填項。
-- 如:
("broker.prop_key" = "broker.prop_val", ...)
("hdfs.fs.defaultFS" = "xxx", "hdfs.hdfs_user" = "xxx")

-- 其他屬性:
-- column_separator:列分隔符,僅對 CSV 格式適用。預設為 \t。 
-- line_delimiter:行分隔符,僅對 CSV 格式適用。預設為 \n。 
-- max_file_size:單個文件的最大大小。預設為 1GB。取值範圍在 5MB 到 2GB 之間。超過這個大小的文件將會被切分。
-- schema:PARQUET 文件 schema 信息。僅對 PARQUET 格式適用。導出文件格式為 PARQUET 時,必須指定 schema。

使用 broker 方式,將簡單查詢結果導出

select * from log_detail where id >2
INTO OUTFILE "hdfs://doitedu01:8020/doris-out/broker_a_" 
FORMAT AS CSV 
PROPERTIES 
( 
"broker.name" = "broker_name", 
"column_separator" = ",", 
"line_delimiter" = "\n", 
"max_file_size" = "100MB" 
); 

使用 HDFS 方式導出

EXPLAIN SELECT * FROM log_detail
INTO OUTFILE "hdfs://doris-out/hdfs_" 
FORMAT AS CSV 
PROPERTIES 
( 
"fs.defaultFS" = "hdfs://doitedu01:8020", 
"hadoop.username" = "root",
"column_separator" = ","
);


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • # 使用Unity Console視窗的LogEntries私有類實現自定義日誌系統 在Unity開發過程中,我們經常需要使用Console視窗來查看程式運行時的日誌信息。Unity內置的日誌系統提供了基本的日誌功能,但有時我們需要更多的自定義選項。本文將介紹如何使用Unity Console視窗的 ...
  • 在學習或者日常工作中,有時我們需要把幻燈片的東西整理成文字,而從 PowerPoint 演示文稿中一張一張的整理手動複製粘貼,整個過程會非常費精力且耗時。那麼怎麼樣才能比較輕鬆且快速地提取PowerPoint中的文字呢?今天這篇文章就將為你介紹如何通過編程方式提取PowerPoint中的文字,文章最 ...
  • ## 一:背景 ### 1. 講故事 訓練營中有朋友問在 Linux 上如何抓 crash dump,在我的系列文章中演示的大多是在 Windows 平臺上,這也沒辦法要跟著市場走,誰讓 .NET 的主戰場在**工控** 和 **醫療** 呢,上一張在 合肥 分享時的一個統計圖。 ![](https ...
  • 在visual studio開發H5網站的調試時候,需要在多環境調試,比如在不同瀏覽器和不同解析度的電腦、不同的手機瀏覽器測試。或者項目比較著急,需要邊測試邊開發,可不可以不發佈讓測試人員來測試呢?visual studio 2022在17.5版本推出了開發隧道(Dev Tunnels)的功能,就是 ...
  • # 1.創建Yarp項目 目的:通過代理解決網路無法訪問openAI的問題 項目源碼地址:[https://github.com/raokun/YarpProject](https://github.com/raokun/YarpProject) ## 1.創建.net7 webapi項目 創建一個 ...
  • # 前言 在剛剛開始學習網路安全時候,裝好了kali準備測試一下。 運行了py結尾的腳本出現了以下錯誤: ![](https://img2023.cnblogs.com/blog/2572943/202305/2572943-20230531000850176-695077837.png) #解決方 ...
  • 前言 大家好,我是 god23bin。歡迎來到這個系列,每天只需一分鐘,記住一個 Linux 命令不成問題。今天讓我們從 cd 命令開始,掌握在 Linux 系統中切換目錄的技巧。 ...
  • 大家好,我是 god23bin。今天我給大家帶來的是 Linux 命令系列,每天只需一分鐘,記住一個 Linux 命令不成問題。今天,我們要介紹的是一個常用而又強大的命令:ls(list)。 ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...