參考官方文檔doris官方文檔streamload
基本原理?
下圖展示了 Stream load 的主要流程,省略了一些導入細節。
^ +
| |
| | 1A. User submit load to FE
| |
| +--v-----------+
| | FE |
5. Return result to user | +--+-----------+
| |
| | 2. Redirect to BE
| |
| +--v-----------+
+---+Coordinator BE| 1B. User submit load to BE
+-+-----+----+-+
| | |
+-----+ | +-----+
| | | 3. Distrbute data
| | |
+-v-+ +-v-+ +-v-+
|BE | |BE | |BE |
+---+ +---+ +---+
Stream load 中,Doris 會選定一個節點作為 Coordinator 節點。該節點負責接數據并分發數據到其他數據節點。
用戶通過 HTTP 協議提交導入命令。如果提交到 FE,則 FE 會通過 HTTP redirect 指令將請求轉發給某一個 BE。用戶也可以直接提交導入命令給某一指定 BE。
導入的最終結果由 Coordinator BE 返回給用戶。
具體操作命令:
curl --location-trusted -u $user:$passwd -H"columns:a=a,b=b,c=c" -H"column_separator:," -T $file_name //$ip:$port/api/$DB/$Table/_stream_load
命令含義:
1、column_separator指文件分隔符
2、端口號
2.1 8030 指向 FE 的 HTTP 協議端口。這種方式,FE 會直接將請求做 307 轉發到隨機的一個 BE 節點。最終請求和數據直接和這個 BE 節點通訊。這種方式需要客戶端和 BE 節點的網絡能夠正常通訊。
2.2 8040 指向 BE 的 HTTP 協議端口。則請求直接和 BE 節點交互
3、label
-H 如果沒有指定,則系統會生成一個 UUID
4、streaming_load_max_mb
自定義設置 -H "Label:XXXX" (label不區分大小寫),label: 一次導入的標簽,相同標簽的數據無法多次導入。用戶可以通過指定Label的方式來避免一份數據重復導入的問題。
Stream load 的最大導入大小,默認為 10G ,如果用戶的原始文件超過這個值,則需要調整 BE 的參數
5、merge_type
一共支持三種類型APPEND、DELETE、MERGE 其中,APPEND是默認值,表示這批數據全部需要追加到現有數據中,DELETE 表示刪除與這批數據key相同的所有行,MERGE 語義 需要與delete 條件聯合使用,表示滿足delete 條件的數據按照DELETE 語義處理其余的按照APPEND 語義處理
-H "merge_type: [MERGE|APPEND|DELETE]" -H "delete: label_c3=1"。
默認是追加
6、測試target 與文件列數不一致
目標表只有3列,文件有n大于3列,需要加占位符,自定義寫全文件里面的字段
例: 表中有3個列“c1, c2, c3", 源文件中前三列依次對應,但是有多余2列;那么需要指定-H "columns: c1, c2, c3, x1,x2";最后2列隨意指定個名稱占位即可
7、format
文件格式要求,可以是orc,可以是parquet,json
加一個參數 -H "format:orc|parquet|json",不加默認是csv
總結:
stream load適合文件比較小的,本地文件,broker load 適合源數據在Broker進程可訪問的HDFS/對象存儲上大批量數據的導入