导入BOS中的数据
本文档主要介绍如何导入 BOS 中存储的数据。
准备工作
请先通过以下步骤,在百度对象存储(Baidu Object Storage,BOS)上存放需导入到PALO中的数据。
-
开通 BOS 服务
请参阅 开始使用BOS
-
创建 Bucket
请参阅 创建Bucket
注意:Bucket 所属地域必须和 PALO 集群所属地域相同。PALO 地域通常可以在 PALO 控制台页面左上角查看
-
上传文件到 Bucket
有两种方式可以上传文件到 Bucket。
通过控制台直接上传,请参阅文档 上传Object。
通过命令行工具上传:
- 请先 下载 BOS CLI 命令行工具。这里以Linux操作系统的 bce-cli-0.10.10.zip 为例。
-
解压后,执行以下命令配置 BOS CLI:
Bash1./bce -c 2BOS Access Key ID []: 353b8dexxxxxxxxxxb156d3 3BOS Secret Access Key []: ea15a18xxxxxx29f78e8d77 4BCE Security Token [None]: 5Default region name [bj]: 6Default domain [bj.bcebos.com]: 7Default use auto switch domain [yes]: 8Default breakpoint_file_expiration [7] days: 9Default use https protocol [no]: 10Default multi upload thread num [10]:
- BOS Access Key ID 和 BOS Secret Access Key 可在公有云页面右上角点击
账户头像 -> 安全认证
获取。 - Default region name 和 Default domain 请填写Bucket所在地域的缩写,可查阅 访问域名 获取。
- 其他配置使用默认即可。
- BOS Access Key ID 和 BOS Secret Access Key 可在公有云页面右上角点击
-
使用以下命令上传文件:
Shell1 ./bce bos cp /path/to/local/your_file.txt bos:/your_bucket_name
开始导入
PALO 支持通过以下两种方式导入 BOS 中的数据。
通过 Broker Load 命令提交导入作业
Broker 是一个无状态的进程服务,已经内置在 PALO 集群中,主要用于对外部数据源的文件进行读写操作。Broker Load 则是利用 Broker 服务访问源数据,进行数据导入的一种方式。
-
创建一张表
通过
CREATE TABLE
命令创建一张表用于存储待导入的数据。具体的导入方式请查阅 CREATE TABLE 命令手册。示例如下:SQL1CREATE TABLE IF NOT EXISTS load_test 2( 3 id INT, 4 name VARCHAR(128) 5) 6DISTRIBUTED BY HASH(id) BUCKETS 8;
-
提交 Broker Load 导入作业
Broker Load 命令详细语法请参阅 Broker Load 命令手册。示例如下
SQL1LOAD LABEL example_db.exmpale_label_1 2( 3 DATA INFILE("bos://your_bucket_name/your_file.txt") 4 INTO TABLE load_test 5 COLUMNS TERMINATED BY "," 6) 7WITH BROKER "bos" 8( 9 "bos_endpoint" = "http://bj.bcebos.com", 10 "bos_accesskey" = "353b8dexxxxxxxxxxb156d3", 11 "bos_secret_accesskey" = "ea15a18xxxxxx29f78e8d77" 12) 13PROPERTIES 14( 15 "timeout" = "3600" 16);
- LABEL:每个导入作业都需要指定一个唯一的 Label,后续可以通过这个 Label 查看导入作业的运行状态。
- WITH BROKER "bos":"bos" 仅仅是 Broker 服务进程的名称,并不代表需要访问的数据源。Broker的名称可以使用 admin 用户连接 PALO 后,通过
SHOW BROKER
命令查看。 - "bos_accesskey" 和 "bos_secret_accesskey" 可在公有云页面右上角点击
账户头像 -> 安全认证
获取。 - "bos_endpoint" 和 BOS Bucket 所在地域有关,可查阅 访问域名 获取。
-
查看导入作业状态
Broker Load 是一个异步命令,第二步中的命令执行成功,仅代表作业提交成功。具体执行情况,须通过以下命令查看。
SQL1mysql> SHOW LOAD FROM example_db WHERE LABEL="exmpale_label_1" 2*************************** 1. row *************************** 3 JobId: 10041 4 Label: exmpale_label_1 5 State: FINISHED 6 Progress: ETL:100%; LOAD:100% 7 Type: BROKER 8 EtlInfo: unselected.rows=0; dpp.abnorm.ALL=0; dpp.norm.ALL=100000000 9 TaskInfo: cluster:N/A; timeout(s):14400; max_filter_ratio:0.0 10 ErrorMsg: NULL 11 CreateTime: 2020-11-17 09:38:04 12 EtlStartTime: 2020-11-17 09:38:09 13 EtlFinishTime: 2020-11-17 09:38:09 14 LoadStartTime: 2020-11-17 09:38:09 15LoadFinishTime: 2020-11-17 09:42:07 16 URL: N/A 17 JobDetails: {"Unfinished backends":{},"ScannedRows":0,"TaskNumber":0,"All backends":{},"FileNumber":0,"FileSize":0} 181 row in set (0.01 sec)
其中
State
字段状态为FINISHED
则代表导入成功,数据可查询。关于SHOW LOAD
返回结果的具体说明,可参阅SHOW LOAD
命令文档。 -
取消导入作业
正在运行中的 Broker Load 导入作业可以使用以下命令取消:
SQL1CANCEL LOAD WHERE LABEL="exmpale_label_1";
取消成功后,所有已导入的数据也会被回滚。PALO 会自动保证一个导入作业中的数据原子生效。
注:关于 Broker Load 命令的更多高级功能能详细介绍,请参阅 BROKER LOAD 命令文档。
通过外部表进行导入
PALO 也支持通过创建一张 Broker 外部表的方式引用BOS上存储的数据,然后通过 INSERT INTO SELECT
的方式导入数据。
-
创建一张表
创建一张用于存储数据的表。同上,不再赘述。
-
创建 Broker 外部表
创建外部表命令的具体说明可参阅 CREATE EXTERNAL TABLE 命令手册。示例如下:
SQL1CREATE EXTERNAL TABLE IF NOT EXISTS example_db.example_ext_table 2( 3 id INT, 4 name VARCHAR(128) 5) 6ENGINE=BROKER 7PROPERTIES 8( 9 "broker_name" = "bos", 10 "path" = "bos://your_bucket_name/your_file.txt", 11) 12BROKER PROPERTIES 13( 14 "bos_endpoint" = "http://bj.bcebos.com", 15 "bos_accesskey" = "353b8dexxxxxxxxxxb156d3", 16 "bos_secret_accesskey" = "ea15a18xxxxxx29f78e8d77" 17);
- ENGINE:ENGINE 的类型为 BROKER,表示这是一张借助 Broker 服务访问数据的外部表。
- "broker_name" 为 "bos","bos" 仅仅是 Broker 服务进程的名称,并不代表需要访问的数据源。Broker的名称可以使用 admin 用户连接 PALO 后,通过
SHOW BROKER
命令查看。 - "bos_accesskey" 和 "bos_secret_accesskey" 可在公有云页面右上角点击
账户头像 -> 安全认证
获取。 - "bos_endpoint" 和 BOS Bucket 所在地域有关,可查阅 访问域名 获取。
注:外部表中的数据也可以通过
SELECT
直接查询,但效率较低,推荐导入到 PALO 中后在执行查询。
-
导入数据
使用以下命令从外部表导入数据到内部表。
SQL1INSERT INTO load_test SELECT * FROM example_ext_table;
该命令为同步命令(异步提交 INSERT 作业的操作正在开发中),命令返回成功即表示数据导入完成。当导入数据量较大时,可能会因查询超时而任务取消。关于查询超时的设置,请参阅 变量 文档中的
query_timeout
变量。
注:关于INSERT命令的更多高级功能能详细介绍,请参阅 INSERT 命令文档。