参考官方文档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 http://$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/对象存储上大批量数据的导入