Stream Load
Stream load 是一个同步的导入方式,用户通过发送 HTTP 协议发送请求将本地文件或数据流导入到 Doris 中。Stream load 同步执行导入并返回导入结果。用户可直接通过请求的返回体判断本次导入是否成功。
支持数据格式
Doris Stream Load支持csv,json两种格式的文件进行数据导入,在1.2.0之后的版本开始支持PARQUET 和 ORC。
基本原理
Doris的提供的Stream Load的HTTP API是在FE(Front End)上实现的,但是FE的工作只是做一些基本的校验,然后重新拼接一个到BE(back end)的URL,去做一个重定向。BE在接到tream load 请求之后,Doris 会选定一个节点作为 Coordinator 节点。该节点负责接数据并分发数据到其他数据节点。
所以如果用户在通过FE的HTTP API去执行Stream Load的时候,需要注意重定向问题,如apache的httpclient默认的调用是无重定向策略,需要手动设置,而且httpclient在4.5.13.之前的版本做重定向请求的时候,会有bug,导致请求是吧,如果需要通过apache的httpclient去做Stream Load的话需要把版本升级至4.5.13.+。
当然用户也可以通过调用BE的HTTP API去做Stream Load,这样也能避免重定向问题。
HTTP API
FE -Stream Load HTTP API:
curl --location-trusted -u user:passwd [-H ""...] -T data.file -XPUT http://fe_host:http_port/api/{db}/{table}/_stream_load
# Header 中支持属性见下面的 ‘导入任务参数’ 说明
# 格式为: -H "key1:value1"
签名参数
-
user/passwd
Stream load 由于创建导入的协议使用的是 HTTP 协议,通过 Basic access authentication 进行签名。Doris 系统会根据签名验证用户身份和导入权限。
导入任务参数
Stream Load 由于使用的是 HTTP 协议,所以所有导入任务有关的参数均设置在 Header 中。下面主要介绍了 Stream Load 导入任务参数的部分参数意义。
-
label
导入任务的标识。每个导入任务,都有一个在单 database 内部唯一的 label。label 是用户在导入命令中自定义的名称。通过这个 label,用户可以查看对应导入任务的执行情况。
label 的另一个作用,是防止用户重复导入相同的数据。强烈推荐用户同一批次数据使用相同的 label。这样同一批次数据的重复请求只会被接受一次,保证了 At-Most-Once
当 label 对应的导入作业状态为 CANCELLED 时,该 label 可以再次被使用。
-
column_separator
用于指定导入文件中的列分隔符,默认为\t。如果是不可见字符,则需要加\x作为前缀,使用十六进制来表示分隔符。
如hive文件的分隔符\x01,需要指定为-H "column_separator:\x01"。
可以使用多个字符的组合作为列分隔符。
-
line_delimiter
用于指定导入文件中的换行符,默认为\n。
可以使用做多个字符的组合作为换行符。
-
format
指定导入数据格式,支持csv、json,默认是csv
(以上参数源于官方文档:https://doris.apache.org/zh-CN/docs/dev/data-operate/import/import-way/stream-load-manual,由于参数较多且Doris仍在迭代中,更多参数详情请以官方文档为主)
查看 Stream Load
用户可以通过 show stream load
来查看已经完成的 stream load 任务。
默认 BE 是不记录 Stream Load 的记录,如果你要查看需要在 BE 上启用记录,配置参数是:enable_stream_load_record=true
,具体怎么配置请参照官方文档,本文不再赘述。
如果有Stream Load的Label的话,可以通过SHOW LOAD WHERE LABEL = “xxx”来获取Load任务执行情况。
Stream Load 优点
Stream load 的原理是由 BE 发起的导入并分发数据,建议的导入数据量在 1G 到 10G 之间。由于默认的最大 Stream load 导入数据量为 10G,所以如果要导入超过 10G 的文件需要修改 BE 的配置 streaming_load_max_mb
相比使用insert 语句和stream load通过文件的形式实现了导入,不需要去构建相对复杂的说sql语句,同时基于http协议的数据传输也比Doris实现的mysql协议要更高效一点,而且也省去了FE在执行insert语句时,对语句分析的时间和性能消耗。
但是在几十G以上的数据量时,建议还是使用Broker Load等方式,通过使用hdfs、S3等Doris支持的第三方数据源去做文件传输载体,以实现更高效的大数据同步功能。