Broker 以插件的形式,独立于 Doris 部署。如果需要从第三方存储系统导入数据,需要部署相应的 Broker,默认提供了读取 HDFS 、百度云 BOS 及 Amazon S3 的 fs_broker。fs_broker 是无状态的,建议每一个 FE 和 BE 节点都部署一个 Broker。Broker 为一个独立的无状态进程。封装了文件系统接口,提供 Doris 读取远端存储系统中文件的能力。
Doris-0.15 编译后链接: https://pan.baidu.com/s/117FCTIvIyoL7cY5qXGmnJw 提取码: 9qmk
-
拷贝源码 fs_broker 的 output 目录下的相应 Broker 目录到需要部署的所有节点上。建议和 BE 或者 FE 目录保持同级。
-
修改相应 Broker 配置
在相应 broker/conf/ 目录下对应的配置文件中,可以修改相应配置。
-
启动停止 Broker
./start_broker.sh --daemon ./stop_broker.sh --daemon
-
添加、去除Broker
# 在fe节点下执行sql,Broker 是无状态的进程,可以随意启停。当然,停止后,正在其上运行的作业会失败,重试即可。 # 添加 # 其中 broker_host 为 Broker 所在节点 ip;broker_ipc_port 在 Broker 配置文件中的conf/apache_hdfs_broker.conf。 ALTER SYSTEM ADD BROKER broker_name "broker_host1:broker_ipc_port1","broker_host2:broker_ipc_port2",...; # 删除 ALTER SYSTEM DROP BROKER broker_name "broker_host:broker_ipc_port"; ALTER SYSTEM DROP ALL BROKER broker_name;
-
查看 Broker 状态
SHOW PROC "/brokers";
-
Broker Load
适用场景:
1. 源数据在 Broker 可以访问的存储系统中,如 HDFS。
2. 数据量在 几十到百GB 级别。
基本原理:
用户在提交导入任务后,FE 会生成对应的 Plan 并根据目前 BE 的个数和文件的大小,将 Plan 分给 多个 BE 执行,每个 BE 执行一部分导入数据。
BE 在执行的过程中会从 Broker 拉取数据,在对数据 transform 之后将数据导入系统。所有 BE 均完成导入,由 FE 最终决定导入是否成功。
+ | 1. user create broker load v +----+----+ | | | FE | | | +----+----+ | | 2. BE etl and load the data +--------------------------+ | | | +---v---+ +--v----+ +---v---+ | | | | | | | BE | | BE | | BE | | | | | | | +---+-^-+ +---+-^-+ +--+-^--+ | | | | | | | | | | | | 3. pull data from broker +---v-+-+ +---v-+-+ +--v-+--+ | | | | | | |Broker | |Broker | |Broker | | | | | | | +---+-^-+ +---+-^-+ +---+-^-+ | | | | | | +---v-+-----------v-+----------v-+-+ | HDFS/BOS/AFS cluster | | |
基本操作:
创建导入:
LOAD LABEL db_name.label_name (data_desc, ...) WITH BROKER broker_name broker_properties [PROPERTIES (key1=value1, ... )] * data_desc: DATA INFILE ('file_path', ...) [NEGATIVE] INTO TABLE tbl_name [PARTITION (p1, p2)] [COLUMNS TERMINATED BY separator ] [(col1, ...)] [PRECEDING FILTER predicate] [SET (k1=f1(xx), k2=f2(xx))] [WHERE predicate] * broker_properties: (key1=value1, ...) # eg, 如果没有设置set,则以column中的列作为映射。 LOAD LABEL db1.label1 ( DATA INFILE("hdfs://abc.com:8888/user/palo/test/ml/file1") INTO TABLE tbl1 COLUMNS TERMINATED BY "," (tmp_c1,tmp_c2) SET ( id=tmp_c2, name=tmp_c1 ), DATA INFILE("hdfs://abc.com:8888/user/palo/test/ml/file2") INTO TABLE tbl2 COLUMNS TERMINATED BY "," (col1, col2) where col1 > 1 ) WITH BROKER 'broker' ( "username"="hdfs", "password"="hdfs" ) PROPERTIES ( "timeout" = "3600" ); # 更多语法参考 HELP BROKER LOAD
Label
导入任务的标识。每个导入任务,都有一个在单 database 内部唯一的 Label。Label 是用户在导入命令中自定义的名称。通过这 个 Label,用户可以查看对应导入任务的执行情况。
Label 的另一个作用,是防止用户重复导入相同的数据。强烈推荐用户同一批次数据使用相同的label。这样同一批次数据的重 复请求只会被接受一次,保证了 At-Most-Once 语义
当 Label 对应的导入作业状态为 CANCELLED 时,可以再次使用该 Label 提交导入作业。
查看导入:
show load order by createtime desc limit 1\G
# 更多
HELP SHOW LOAD
取消导入:
当 Broker load 作业状态不为 CANCELLED 或 FINISHED 时,可以被用户手动取消。取消时需要指定待取消导入任务的 Label 。取 消导入命令语法可执行 HELP CANCEL LOAD
查看。
相关系统配置:
FE 配置
下面几个配置属于 Broker load 的系统级别配置,也就是作用于所有 Broker load 导入任务的配置。主要通过修改 fe.conf
来调 整配置值。
-
min_bytes_per_broker_scanner/max_bytes_per_broker_scanner/max_broker_concurrency
前两个配置限制了单个 BE 处理的数据量的最小和最大值。第三个配置限制了一个作业的最大的导入并发数。最小处理的数据量,最大并发数,源文件的大小和当前集群 BE 的个数 共同决定了本次导入的并发数。
本次导入并发数 = Math.min(源文件大小/最小处理量,最大并发数,当前BE节点个数) 本次导入单个BE的处理量 = 源文件大小/本次导入的并发数
通常一个导入作业支持的最大数据量为
max_bytes_per_broker_scanner * BE 节点数
。如果需要导入更大数据量,则需要适当调整max_bytes_per_broker_scanner
参数的大小。默认配置:
参数名:min_bytes_per_broker_scanner, 默认 64MB,单位bytes。 参数名:max_broker_concurrency, 默认 10。 参数名:max_bytes_per_broker_scanner,默认 3G,单位bytes。
参考官方文档: https://doris.apache.org/zh-CN/administrator-guide/load-data/broker-load-manual.html#%E9%80%82%E7%94%A8%E5%9C%BA%E6%99%AF