外部存储数据导入

本文档主要介绍如何导入外部系统中存储的数据。例如(HDFS,所有支持S3协议的对象存储)

HDFS LOAD

准备工作

上传需要导入的文件到HDFS上,具体命令可参阅HDFS上传命令

开始导入

Hdfs load 创建导入语句,导入方式和Broker Load 基本相同,只需要将 WITH BROKER broker_name () 语句替换成如下部分

1. LOAD LABEL db_name.label_name
2. (data_desc, ...)
3. WITH HDFS
4. [PROPERTIES (key1=value1, ... )]
  1. 创建一张表

通过 CREATE TABLE 命令在demo创建一张表用于存储待导入的数据。具体的导入方式请查阅 CREATE TABLE 命令手册。示例如下:

1. CREATE TABLE IF NOT EXISTS load_hdfs_file_test 2. ( 3. id INT, 4. age TINYINT, 5. name VARCHAR(50) 6. ) 7. unique key(id) 8. DISTRIBUTED BY HASH(id) BUCKETS 3; 2. 导入数据执行以下命令导入HDFS文件:

1. LOAD LABEL demo.label_20220402 2. ( 3. DATA INFILE("hdfs://host:port/tmp/test_hdfs.txt") 4. INTO TABLE `load_hdfs_file_test` 5. COLUMNS TERMINATED BY "\t" 6. (id,age,name) 7. ) 8. with HDFS ( 9. "fs.defaultFS"="hdfs://testFs", 10. "hdfs_user"="user" 11. ) 12. PROPERTIES 13. ( 14. "timeout"="1200", 15. "max_filter_ratio"="0.1" 16. );

关于参数介绍,请参阅Broker Load,HA集群的创建语法,通过HELP BROKER LOAD查看 3. 查看导入状态

Broker load 是一个异步的导入方式,具体导入结果可以通过SHOW LOAD命令查看

1. mysql> show load order by createtime desc limit 1\G; 2. *************************** 1. row *************************** 3. JobId: 41326624 4. Label: broker_load_2022_04_15 5. State: FINISHED 6. Progress: ETL:100%; LOAD:100% 7. Type: BROKER 8. EtlInfo: unselected.rows=0; dpp.abnorm.ALL=0; dpp.norm.ALL=27 9. TaskInfo: cluster:N/A; timeout(s):1200; max_filter_ratio:0.1 10. ErrorMsg: NULL 11. CreateTime: 2022-04-01 18:59:06 12. EtlStartTime: 2022-04-01 18:59:11 13. EtlFinishTime: 2022-04-01 18:59:11 14. LoadStartTime: 2022-04-01 18:59:11 15. LoadFinishTime: 2022-04-01 18:59:11 16. URL: NULL 17. JobDetails: {"Unfinished backends":{"5072bde59b74b65-8d2c0ee5b029adc0":[]},"ScannedRows":27,"TaskNumber":1,"All backends":{"5072bde59b74b65-8d2c0ee5b029adc0":[36728051]},"FileNumber":1,"FileSize":5540} 18. 1 row in set (0.01 sec)

S3 LOAD

从0.14 版本开始,Doris 支持通过S3协议直接从支持S3协议的在线存储系统导入数据。

下面主要介绍如何导入 AWS S3 中存储的数据。也支持导入其他支持S3协议的对象存储系统导入。

适用场景

  • 源数据在 支持S3协议的存储系统中,如 S3 等。
  • 数据量在 几十到百GB 级别。

准备工作

  1. 准本AK 和 SK 首先需要找到或者重新生成 AWS Access keys,可以在 AWS console 的 My Security Credentials 找到生成方式, 如下图所示: AK_SK 选择 Create New Access Key 注意保存生成 AK和SK.
  2. 准备 REGION 和 ENDPOINT REGION 可以在创建桶的时候选择也可以在桶列表中查看到。ENDPOINT 可以通过如下页面通过 REGION 查到 AWS 文档

其他云存储系统可以相应的文档找到与S3兼容的相关信息

开始导入

导入方式和 Broker Load 基本相同,只需要将 WITH BROKER broker_name () 语句替换成如下部分

1. WITH S3
2. (
3. "AWS_ENDPOINT" = "AWS_ENDPOINT",
4. "AWS_ACCESS_KEY" = "AWS_ACCESS_KEY",
5. "AWS_SECRET_KEY"="AWS_SECRET_KEY",
6. "AWS_REGION" = "AWS_REGION"
7. )

完整示例如下

1. LOAD LABEL example_db.exmpale_label_1
2. (
3. DATA INFILE("s3://your_bucket_name/your_file.txt")
4. INTO TABLE load_test
5. COLUMNS TERMINATED BY ","
6. )
7. WITH S3
8. (
9. "AWS_ENDPOINT" = "AWS_ENDPOINT",
10. "AWS_ACCESS_KEY" = "AWS_ACCESS_KEY",
11. "AWS_SECRET_KEY"="AWS_SECRET_KEY",
12. "AWS_REGION" = "AWS_REGION"
13. )
14. PROPERTIES
15. (
16. "timeout" = "3600"
17. );

常见问题

  1. S3 SDK 默认使用 virtual-hosted style 方式。但某些对象存储系统可能没开启或没支持 virtual-hosted style 方式的访问,此时我们可以添加 use_path_style 参数来强制使用 path style 方式:
1. WITH S3
2. (
3. "AWS_ENDPOINT" = "AWS_ENDPOINT",
4. "AWS_ACCESS_KEY" = "AWS_ACCESS_KEY",
5. "AWS_SECRET_KEY"="AWS_SECRET_KEY",
6. "AWS_REGION" = "AWS_REGION",
7. "use_path_style" = "true"
8. )

SinceVersion 1.2

  1. 支持使用临时秘钥(TOKEN) 访问所有支持 S3 协议的对象存储,用法如下:
1. WITH S3
2. (
3. "AWS_ENDPOINT" = "AWS_ENDPOINT",
4. "AWS_ACCESS_KEY" = "AWS_TEMP_ACCESS_KEY",
5. "AWS_SECRET_KEY" = "AWS_TEMP_SECRET_KEY",
6. "AWS_TOKEN" = "AWS_TEMP_TOKEN",
7. "AWS_REGION" = "AWS_REGION"
8. )