doris:Broker Load

Broker Load 通过 MySQL API 发起,Doris 会根据 LOAD 语句中的信息,主动从数据源拉取数据。Broker Load 是一个异步导入方式,需要通过 SHOW LOAD 语句查看导入进度和导入结果。

Broker Load 适合源数据存储在远程存储系统,比如对象存储或 HDFS,且数据量比较大的场景。 从 HDFS 或者 S3 直接读取,也可以通过 湖仓一体/TVF 中的 HDFS TVF 或者 S3 TVF 进行导入。基于 TVF 的 Insert Into 当前为同步导入,Broker Load 是一个异步的导入方式。

使用限制​

支持的存储后端:

  • S3 协议
  • HDFS 协议
  • 其他协议(需要相应的 Broker 进程)

支持的数据类型:

  • CSV
  • JSON
  • PARQUET
  • ORC

支持的压缩类型:

  • PLAIN
  • GZ
  • LZO
  • BZ2
  • LZ4FRAME
  • DEFLATE
  • LZOP
  • LZ4BLOCK
  • SNAPPYBLOCK
  • ZLIB
  • ZSTD

基本原理​

用户在提交导入任务后,FE 会生成对应的 Plan 并根据目前 BE 的个数和文件的大小,将 Plan 分给 多个 BE 执行,每个 BE 执行一部分导入数据。

BE 在执行的过程中会从 Broker 拉取数据,在对数据 transform 之后将数据导入系统。所有 BE 均完成导入,由 FE 最终决定导入是否成功。

Broker Load 基本原理

从上图中可以看到,BE 会依赖 Broker 进程来读取相应远程存储系统的数据。之所以引入 Broker 进程,主要是用来针对不同的远程存储系统,用户可以按照 Broker 进程的标准开发其相应的 Broker 进程,Broker 进程可以使用 Java 程序开发,更好的兼容大数据生态中的各类存储系统。由于 broker 进程和 BE 进程的分离,也确保了两个进程的错误隔离,提升 BE 的稳定性。

当前 BE 内置了对 HDFS 和 S3 两个 Broker 的支持,所以如果从 HDFS 和 S3 中导入数据,则不需要额外启动 Broker 进程。如果有自己定制的 Broker 实现,则需要部署相应的 Broker 进程。

快速上手​

本节演示了一个 S3 Load 的例子。具体的使用语法,请参考 SQL 手册中的 Broker Load。

前置检查​

  1. Doris 表权限

Broker Load 需要对目标表的 INSERT 权限。如果没有 INSERT 权限,可以通过 GRANT 命令给用户授权。

  1. S3 认证和连接信息

这里以 AWS S3 为例,从其他对象存储系统导入也可以作为参考。

  • AK 和 SK:首先需要找到或者重新生成 AWS Access keys,可以在 AWS console 的 My Security Credentials 找到生成方式。

  • REGION 和 ENDPOINT:REGION 可以在创建桶的时候选择也可以在桶列表中查看到。每个 REGION 的 S3 ENDPOINT 可以通过如下页面查到 AWS 文档。

创建导入作业​

  1. 创建 CSV 文件 brokerload_example.csv 文件存储在 S3 上,其内容如下:
1,Emily,25
2,Benjamin,35
3,Olivia,28
4,Alexander,60
5,Ava,17
6,William,69
7,Sophia,32
8,James,64
9,Emma,37
10,Liam,64

  1. 创建导入 Doris 表

在 Doris 中创建被导入的表,具体语法如下:

CREATE TABLE testdb.test_brokerload(user_id            BIGINT       NOT NULL COMMENT "user id",name               VARCHAR(20)           COMMENT "name",age                INT                   COMMENT "age"
)
DUPLICATE KEY(user_id)
DISTRIBUTED BY HASH(user_id) BUCKETS 10;

  1. 使用 Broker Load 从 S3 导入数据。其中 bucket 名称和 S3 认证信息要根据实际填写:
    LOAD LABEL broker_load_2022_04_01(DATA INFILE("s3://your_bucket_name/brokerload_example.csv")INTO TABLE test_brokerloadCOLUMNS TERMINATED BY ","FORMAT AS "CSV"(user_id, name, age))WITH S3("provider" = "S3","AWS_ENDPOINT" = "s3.us-west-2.amazonaws.com","AWS_ACCESS_KEY" = "<your-ak>","AWS_SECRET_KEY"="<your-sk>","AWS_REGION" = "us-west-2","compress_type" = "PLAIN")PROPERTIES("timeout" = "3600");

其中 provider 字段需要根据实际的对象存储服务商填写。 Doris 支持的 provider 列表:

  • "OSS" (阿里云)
  • "COS" (腾讯云)
  • "OBS" (华为云)
  • "BOS" (百度云)
  • "S3" (亚马逊 AWS)
  • "AZURE" (微软 Azure)
  • "GCP" (谷歌 GCP)

如不在列表中 (例如 MinIO),可以尝试使用 "S3" (兼容 AWS 模式)

查看导入作业​

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

mysql> show load order by createtime desc limit 1\G;
*************************** 1. row ***************************JobId: 41326624Label: broker_load_2022_04_01State: FINISHEDProgress: ETL:100%; LOAD:100%Type: BROKEREtlInfo: unselected.rows=0; dpp.abnorm.ALL=0; dpp.norm.ALL=27TaskInfo: cluster:N/A; timeout(s):1200; max_filter_ratio:0.1ErrorMsg: NULLCreateTime: 2022-04-01 18:59:06EtlStartTime: 2022-04-01 18:59:11EtlFinishTime: 2022-04-01 18:59:11LoadStartTime: 2022-04-01 18:59:11
LoadFinishTime: 2022-04-01 18:59:11URL: NULLJobDetails: {"Unfinished backends":{"5072bde59b74b65-8d2c0ee5b029adc0":[]},"ScannedRows":27,"TaskNumber":1,"All backends":{"5072bde59b74b65-8d2c0ee5b029adc0":[36728051]},"FileNumber":1,"FileSize":5540}
1 row in set (0.01 sec)

取消导入作业​

当 Broker load 作业状态不为 CANCELLED 或 FINISHED 时,可以被用户手动取消。取消时需要指定待取消导入任务的 Label。取消导入命令语法可执行 CANCEL LOAD 查看。

例如:取消数据库 demo 上,label 为 broker_load_2022_04_01 的导入作业

CANCEL LOAD FROM demo WHERE LABEL = "broker_load_2022_04_01";

参考手册​

导入命令​

LOAD LABEL load_label
(
data_desc1[, data_desc2, ...]
)
WITH [S3|HDFS|BROKER broker_name] 
[broker_properties]
[load_properties]
[COMMENT "comments"];

其中 WITH 子句指定了如何访问存储系统,broker_properties 则是该访问方式的配置参数

  • S3: 使用 S3 协议的存储系统
  • HDFS: 使用 HDFS 协议的存储系统
  • BROKER broker_name: 其他协议的存储系统。可以通过 SHOW BROKER 查看目前可选的 broker_name 列表。更多信息见常见问题中的 "其他 Broker 导入"

导入配置参数​

load properties

Property 名称类型默认值说明
"timeout"Long14400导入的超时时间,单位秒。范围是 1 秒 ~ 259200 秒。
"max_filter_ratio"Float0.0最大容忍可过滤(数据不规范等原因)的数据比例,默认零容忍。取值范围是 0~1。当导入的错误率超过该值,则导入失败。数据不规范不包括通过 where 条件过滤掉的行。
"exec_mem_limit"Long2147483648 (2GB)导入内存限制。默认为 2GB。单位为字节。
"strict_mode"Booleanfalse是否开启严格模式。
"partial_columns"Booleanfalse是否使用部分列更新,只在表模型为 Unique Key 且采用 Merge on Write 时有效。
"timezone"String"Asia/Shanghai"本次导入所使用的时区。该参数会影响所有导入涉及的和时区有关的函数结果。
"load_parallelism"Integer8每个 BE 上并发 instance 数量的上限。
"send_batch_parallelism"Integer1sink 节点发送数据的并发度,仅在关闭 memtable 前移时生效。
"load_to_single_tablet"Boolean"false"是否每个分区只导入一个 tablet,默认值为 false。该参数只允许在对带有 random 分桶的 OLAP 表导数的时候设置。
"skip_lines"Integer"0"跳过 CSV 文件的前几行。当设置 format 设置为 csv_with_names或csv_with_names_and_types时,该参数会失效。
"trim_double_quotes"Boolean"false"是否裁剪掉导入文件每个字段最外层的双引号。
"priority""HIGH" 或 "NORMAL" 或 "LOW""NORMAL"导入任务的优先级。

fe.conf

下面几个配置属于 Broker load 的系统级别配置,也就是作用于所有 Broker load 导入任务的配置。主要通过修改 fe.conf来调整配置值。

Session Variable类型默认值说明
min_bytes_per_broker_scannerLong67108864 (64 MB)一个 Broker Load 作业中单 BE 处理的数据量的最小值,单位:字节。
max_bytes_per_broker_scannerLong536870912000 (500 GB)一个 Broker Load 作业中单 BE 处理的数据量的最大值,单位:字节。通常一个导入作业支持的最大数据量为 max_bytes_per_broker_scanner * BE 节点数。如果需要导入更大数据量,则需要适当调整 max_bytes_per_broker_scanner 参数的大小。
max_broker_concurrencyInteger10限制了一个作业的最大的导入并发数。
default_load_parallelismInteger8每个 BE 节点最大并发 instance 数
broker_load_default_timeout_second14400Broker Load 导入的默认超时时间,单位:秒。

注:最小处理的数据量,最大并发数,源文件的大小和当前集群 BE 的个数共同决定了本次导入的并发数。

本次导入并发数 = Math.min(源文件大小/min_bytes_per_broker_scanner,max_broker_concurrency,当前BE节点个数 * load_parallelism)
本次导入单个BE的处理量 = 源文件大小/本次导入的并发数

session variable

Session Variable类型默认值说明
exec_mem_limitLong2147483648 (2GB)导入内存限制,单位:字节。
time_zoneString"Asia/Shanghai"默认时区,会影响导入中时区相关的函数结果。
send_batch_parallelismInteger1sink 节点发送数据的并发度,仅在关闭 memtable 前移时生效。

常见问题​

常见报错​

1. 导入报错:Scan bytes per broker scanner exceed limit:xxx

请参照文档中最佳实践部分,修改 FE 配置项 max_bytes_per_broker_scanner 和 max_broker_concurrency

2. 导入报错:failed to send batch 或 TabletWriter add batch with unknown id

适当修改 query_timeout 和 streaming_load_rpc_max_alive_time_sec

3. 导入报错:LOAD_RUN_FAIL; msg:Invalid Column Name:xxx

如果是 PARQUET 或者 ORC 格式的数据,则文件头的列名需要与 doris 表中的列名保持一致,如:

(tmp_c1,tmp_c2)
SET
(id=tmp_c2,name=tmp_c1
)

代表获取在 parquet 或 orc 中以 (tmp_c1, tmp_c2) 为列名的列,映射到 doris 表中的 (id, name) 列。如果没有设置 set, 则以 column 中的列作为映射。

注:如果使用某些 hive 版本直接生成的 orc 文件,orc 文件中的表头并非 hive meta 数据,而是(_col0, _col1, _col2, ...), 可能导致 Invalid Column Name 错误,那么则需要使用 set 进行映射

4. 导入报错:Failed to get S3 FileSystem for bucket is null/empty

bucket 信息填写不正确或者不存在。或者 bucket 的格式不受支持。使用 GCS 创建带_的桶名时,比如:s3://gs_bucket/load_tbl,S3 Client 访问 GCS 会报错,建议创建 bucket 路径时不使用_

5. 导入超时

导入的 timeout 默认超时时间为 4 小时。如果超时,不推荐用户将导入最大超时时间直接改大来解决问题。单个导入时间如果超过默认的导入超时时间 4 小时,最好是通过切分待导入文件并且分多次导入来解决问题。因为超时时间设置过大,那么单次导入失败后重试的时间成本很高。

可以通过如下公式计算出 Doris 集群期望最大导入文件数据量:

期望最大导入文件数据量 = 14400s * 10M/s * BE 个数
比如:集群的 BE 个数为 10个
期望最大导入文件数据量 = 14400s * 10M/s * 10 = 1440000M ≈ 1440G注意:一般用户的环境可能达不到 10M/s 的速度,所以建议超过 500G 的文件都进行文件切分,再导入。

S3 Load URL 访问方式​

  • S3 SDK 默认使用 virtual-hosted-style 方式。但某些对象存储系统可能没开启或没支持 virtual-hosted-style 方式的访问,此时我们可以添加 use_path_style 参数来强制使用 path-style 方式:

      WITH S3("AWS_ENDPOINT" = "AWS_ENDPOINT","AWS_ACCESS_KEY" = "AWS_ACCESS_KEY","AWS_SECRET_KEY"="AWS_SECRET_KEY","AWS_REGION" = "AWS_REGION","use_path_style" = "true")
    

S3 Load 临时密钥​

  • 支持使用临时秘钥 (TOKEN) 访问所有支持 S3 协议的对象存储,用法如下:

      WITH S3("AWS_ENDPOINT" = "AWS_ENDPOINT","AWS_ACCESS_KEY" = "AWS_TEMP_ACCESS_KEY","AWS_SECRET_KEY" = "AWS_TEMP_SECRET_KEY","AWS_TOKEN" = "AWS_TEMP_TOKEN","AWS_REGION" = "AWS_REGION")
    

HDFS 认证方式​

  1. 简单认证

简单认证即 Hadoop 配置 hadoop.security.authentication 为 simple

("username" = "user","password" = ""
);

username 配置为要访问的用户,密码置空即可。

  1. Kerberos 认证

该认证方式需提供以下信息:

  • hadoop.security.authentication:指定认证方式为 Kerberos。

  • hadoop.kerberos.principal:指定 Kerberos 的 principal。

  • hadoop.kerberos.keytab:指定 Kerberos 的 keytab 文件路径。该文件必须为 Broker 进程所在服务器上的文件的绝对路径。并且可以被 Broker 进程访问。

  • kerberos_keytab_content:指定 Kerberos 中 keytab 文件内容经过 base64 编码之后的内容。这个跟 kerberos_keytab 配置二选一即可。

示例如下:

("hadoop.security.authentication" = "kerberos","hadoop.kerberos.principal" = "doris@YOUR.COM","hadoop.kerberos.keytab" = "/home/doris/my.keytab"
)
("hadoop.security.authentication" = "kerberos","hadoop.kerberos.principal" = "doris@YOUR.COM","kerberos_keytab_content" = "ASDOWHDLAWIDJHWLDKSALDJSDIWALD"
)

采用 Kerberos 认证方式,需要 krb5.conf (opens new window) 文件,krb5.conf 文件包含 Kerberos 的配置信息,通常,应该将 krb5.conf 文件安装在目录/etc 中。可以通过设置环境变量 KRB5_CONFIG 覆盖默认位置。krb5.conf 文件的内容示例如下:

[libdefaults]default_realm = DORIS.HADOOPdefault_tkt_enctypes = des3-hmac-sha1 des-cbc-crcdefault_tgs_enctypes = des3-hmac-sha1 des-cbc-crcdns_lookup_kdc = truedns_lookup_realm = false[realms]DORIS.HADOOP = {kdc = kerberos-doris.hadoop.service:7005}

HDFS HA 模式​

这个配置用于访问以 HA 模式部署的 HDFS 集群。

  • dfs.nameservices:指定 HDFS 服务的名字,自定义,如:"dfs.nameservices" = "my_ha"。

  • dfs.ha.namenodes.xxx:自定义 namenode 的名字,多个名字以逗号分隔。其中 xxx 为 dfs.nameservices 中自定义的名字,如: "dfs.ha.namenodes.my_ha" = "my_nn"。

  • dfs.namenode.rpc-address.xxx.nn:指定 namenode 的 rpc 地址信息。其中 nn 表示 dfs.ha.namenodes.xxx 中配置的 namenode 的名字,如:"dfs.namenode.rpc-address.my_ha.my_nn" = "host:port"。

  • dfs.client.failover.proxy.provider.[nameservice ID]:指定 client 连接 namenode 的 provider,默认为:org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider。

示例如下:

("fs.defaultFS" = "hdfs://my_ha","dfs.nameservices" = "my_ha","dfs.ha.namenodes.my_ha" = "my_namenode1, my_namenode2","dfs.namenode.rpc-address.my_ha.my_namenode1" = "nn1_host:rpc_port","dfs.namenode.rpc-address.my_ha.my_namenode2" = "nn2_host:rpc_port","dfs.client.failover.proxy.provider.my_ha" = "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider"
)

HA 模式可以和前面两种认证方式组合,进行集群访问。如通过简单认证访问 HA HDFS:

("username"="user","password"="passwd","fs.defaultFS" = "hdfs://my_ha","dfs.nameservices" = "my_ha","dfs.ha.namenodes.my_ha" = "my_namenode1, my_namenode2","dfs.namenode.rpc-address.my_ha.my_namenode1" = "nn1_host:rpc_port","dfs.namenode.rpc-address.my_ha.my_namenode2" = "nn2_host:rpc_port","dfs.client.failover.proxy.provider.my_ha" = "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider"
)

其他 Broker 导入​

其他远端存储系统的 Broker 是 Doris 集群中一种可选进程,主要用于支持 Doris 读写远端存储上的文件和目录。目前提供了如下存储系统的 Broker 实现。

  • 阿里云 OSS

  • 百度云 BOS

  • 腾讯云 CHDFS

  • 腾讯云 GFS

  • 华为云 OBS

  • JuiceFS

  • GCS

Broker 通过提供一个 RPC 服务端口来提供服务,是一个无状态的 Java 进程,负责为远端存储的读写操作封装一些类 POSIX 的文件操作,如 open,pread,pwrite 等等。除此之外,Broker 不记录任何其他信息,所以包括远端存储的连接信息、文件信息、权限信息等等,都需要通过参数在 RPC 调用中传递给 Broker 进程,才能使得 Broker 能够正确读写文件。

Broker 仅作为一个数据通路,并不参与任何计算,因此仅需占用较少的内存。通常一个 Doris 系统中会部署一个或多个 Broker 进程。并且相同类型的 Broker 会组成一个组,并设定一个 名称(Broker name)。

这里主要介绍 Broker 在访问不同远端存储时需要的参数,如连接信息、权限认证信息等等。

Broker 信息

Broker 的信息包括 名称(Broker name)和 认证信息 两部分。通常的语法格式如下:

WITH BROKER "broker_name" 
("username" = "xxx","password" = "yyy","other_prop" = "prop_value",...
);

  • 名称

通常用户需要通过操作命令中的 WITH BROKER "broker_name" 子句来指定一个已经存在的 Broker Name。Broker Name 是用户在通过 ALTER SYSTEM ADD BROKER 命令添加 Broker 进程时指定的一个名称。一个名称通常对应一个或多个 Broker 进程。Doris 会根据名称选择可用的 Broker 进程。用户可以通过 SHOW BROKER 命令查看当前集群中已经存在的 Broker。

备注

Broker Name 只是一个用户自定义名称,不代表 Broker 的类型。

  • 认证信息

不同的 Broker 类型,以及不同的访问方式需要提供不同的认证信息。认证信息通常在 WITH BROKER "broker_name" 之后的 Property Map 中以 Key-Value 的方式提供。

导入示例​

导入 HDFS 上的 TXT 文件​

LOAD LABEL demo.label_20220402
(DATA INFILE("hdfs://host:port/tmp/test_hdfs.txt")INTO TABLE `load_hdfs_file_test`COLUMNS TERMINATED BY "\t"            (id,age,name)
) 
with HDFS
("fs.defaultFS"="hdfs://host:port","hadoop.username" = "user"
)
PROPERTIES
("timeout"="1200","max_filter_ratio"="0.1"
);

HDFS 需要配置 NameNode HA 的情况​

LOAD LABEL demo.label_20220402
(DATA INFILE("hdfs://hafs/tmp/test_hdfs.txt")INTO TABLE `load_hdfs_file_test`COLUMNS TERMINATED BY "\t"            (id,age,name)
) 
with HDFS
("hadoop.username" = "user","fs.defaultFS"="hdfs://hafs","dfs.nameservices" = "hafs","dfs.ha.namenodes.hafs" = "my_namenode1, my_namenode2","dfs.namenode.rpc-address.hafs.my_namenode1" = "nn1_host:rpc_port","dfs.namenode.rpc-address.hafs.my_namenode2" = "nn2_host:rpc_port","dfs.client.failover.proxy.provider.hafs" = "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider"
)
PROPERTIES
("timeout"="1200","max_filter_ratio"="0.1"
);

从 HDFS 导入数据,使用通配符匹配两批文件,分别导入到两个表中​

LOAD LABEL example_db.label2
(DATA INFILE("hdfs://host:port/input/file-10*")INTO TABLE `my_table1`PARTITION (p1)COLUMNS TERMINATED BY ","(k1, tmp_k2, tmp_k3)SET (k2 = tmp_k2 + 1,k3 = tmp_k3 + 1),DATA INFILE("hdfs://host:port/input/file-20*")INTO TABLE `my_table2`COLUMNS TERMINATED BY ","(k1, k2, k3)
)
with HDFS
("fs.defaultFS"="hdfs://host:port","hadoop.username" = "user"
);

使用通配符匹配导入两批文件 file-10* 和 file-20*。分别导入到 my_table1 和 my_table2 两张表中。其中 my_table1 指定导入到分区 p1 中,并且将导入源文件中第二列和第三列的值 +1 后导入。

使用通配符从 HDFS 导入一批数据​

LOAD LABEL example_db.label3
(DATA INFILE("hdfs://host:port/user/doris/data/*/*")INTO TABLE `my_table`COLUMNS TERMINATED BY "\\x01"
)
with HDFS
("fs.defaultFS"="hdfs://host:port","hadoop.username" = "user"
);

指定分隔符为 Hive 经常用的默认分隔符 \\x01,并使用通配符 * 指定 data 目录下所有目录的所有文件。

导入 Parquet 格式数据,指定 FORMAT 为 parquet

```SQL
LOAD LABEL example_db.label4
(DATA INFILE("hdfs://host:port/input/file")INTO TABLE `my_table`FORMAT AS "parquet"(k1, k2, k3)
)
with HDFS
("fs.defaultFS"="hdfs://host:port","hadoop.username" = "user"
);
```

默认是通过文件后缀判断。

导入数据,并提取文件路径中的分区字段​

LOAD LABEL example_db.label5
(DATA INFILE("hdfs://host:port/input/city=beijing/*/*")INTO TABLE `my_table`FORMAT AS "csv"(k1, k2, k3)COLUMNS FROM PATH AS (city, utc_date)
)
with HDFS
("fs.defaultFS"="hdfs://host:port","hadoop.username" = "user"
);

my_table 表中的列为 k1, k2, k3, city, utc_date

其中 hdfs://hdfs_host:hdfs_port/user/doris/data/input/dir/city=beijing 目录下包括如下文件:

hdfs://hdfs_host:hdfs_port/input/city=beijing/utc_date=2020-10-01/0000.csv
hdfs://hdfs_host:hdfs_port/input/city=beijing/utc_date=2020-10-02/0000.csv
hdfs://hdfs_host:hdfs_port/input/city=tianji/utc_date=2020-10-03/0000.csv
hdfs://hdfs_host:hdfs_port/input/city=tianji/utc_date=2020-10-04/0000.csv

文件中只包含 k1, k2, k3 三列数据,city, utc_date 这两列数据会从文件路径中提取。

对导入数据进行过滤​

LOAD LABEL example_db.label6
(DATA INFILE("hdfs://host:port/input/file")INTO TABLE `my_table`(k1, k2, k3)SET (k2 = k2 + 1)PRECEDING FILTER k1 = 1WHERE k1 > k2
)
with HDFS
("fs.defaultFS"="hdfs://host:port","hadoop.username" = "user"
);

只有原始数据中,k1 = 1,并且转换后,k1 > k2 的行才会被导入。

导入数据,提取文件路径中的时间分区字段​

LOAD LABEL example_db.label7
(DATA INFILE("hdfs://host:port/user/data/*/test.txt") INTO TABLE `tbl12`COLUMNS TERMINATED BY ","(k2,k3)COLUMNS FROM PATH AS (data_time)SET (data_time=str_to_date(data_time, '%Y-%m-%d %H%%3A%i%%3A%s'))
)
with HDFS
("fs.defaultFS"="hdfs://host:port","hadoop.username" = "user"
);

提示

时间包含 %3A。在 hdfs 路径中,不允许有 ':',所有 ':' 会由 %3A 替换。

路径下有如下文件:

/user/data/data_time=2020-02-17 00%3A00%3A00/test.txt
/user/data/data_time=2020-02-18 00%3A00%3A00/test.txt

表结构为:

CREATE TABLE IF NOT EXISTS tbl12 (data_time DATETIME,k2        INT,k3        INT
) DISTRIBUTED BY HASH(data_time) BUCKETS 10
PROPERTIES ("replication_num" = "3"
);

使用 Merge 方式导入​

LOAD LABEL example_db.label8
(MERGE DATA INFILE("hdfs://host:port/input/file")INTO TABLE `my_table`(k1, k2, k3, v2, v1)DELETE ON v2 > 100
)
with HDFS
("fs.defaultFS"="hdfs://host:port","hadoop.username"="user"
)
PROPERTIES
("timeout" = "3600","max_filter_ratio" = "0.1"
);

使用 Merge 方式导入。my_table 必须是一张 Unique Key 的表。当导入数据中的 v2 列的值大于 100 时,该行会被认为是一个删除行。导入任务的超时时间是 3600 秒,并且允许错误率在 10% 以内。

导入时指定 source_sequence 列,保证替换顺序​

LOAD LABEL example_db.label9
(DATA INFILE("hdfs://host:port/input/file")INTO TABLE `my_table`COLUMNS TERMINATED BY ","(k1,k2,source_sequence,v1,v2)ORDER BY source_sequence
) 
with HDFS
("fs.defaultFS"="hdfs://host:port","hadoop.username"="user"
);

my_table 必须是 Unique Key 模型表,并且指定了 Sequence 列。数据会按照源数据中 source_sequence 列的值来保证顺序性。

  • 导入指定文件格式为 json,并指定 json_rootjsonpaths

    LOAD LABEL example_db.label10
    (DATA INFILE("hdfs://host:port/input/file.json")INTO TABLE `my_table`FORMAT AS "json"PROPERTIES("json_root" = "$.item","jsonpaths" = "[\"$.id\", \"$.city\", \"$.code\"]")       
    )
    with HDFS
    ("fs.defaultFS"="hdfs://host:port","hadoop.username"="user"
    );
    

    jsonpaths 也可以与 column list 及 SET (column_mapping)配合使用:

    LOAD LABEL example_db.label10
    (DATA INFILE("hdfs://host:port/input/file.json")INTO TABLE `my_table`FORMAT AS "json"(id, code, city)SET (id = id * 10)PROPERTIES("json_root" = "$.item","jsonpaths" = "[\"$.id\", \"$.city\", \"$.code\"]")       
    )
    with HDFS
    ("fs.defaultFS"="hdfs://host:port","hadoop.username"="user"
    );
    

从其他 Broker 导入​

  • 阿里云 OSS
("fs.oss.accessKeyId" = "","fs.oss.accessKeySecret" = "","fs.oss.endpoint" = ""
)

  • 百度云 BOS

当前使用 BOS 时需要下载相应的 SDK 包,具体配置与使用,可以参考 BOS HDFS 官方文档。在下载完成并解压后将 jar 包放到 broker 的 lib 目录下。

("fs.bos.access.key" = "xx","fs.bos.secret.access.key" = "xx","fs.bos.endpoint" = "xx"
)

  • 华为云 OBS
("fs.obs.access.key" = "xx","fs.obs.secret.key" = "xx","fs.obs.endpoint" = "xx"
)

  • JuiceFS
("fs.defaultFS" = "jfs://xxx/","fs.jfs.impl" = "io.juicefs.JuiceFileSystem","fs.AbstractFileSystem.jfs.impl" = "io.juicefs.JuiceFS","juicefs.meta" = "xxx","juicefs.access-log" = "xxx"
)

  • GCS

在使用 Broker 访问 GCS 时,Project ID 是必须的,其他参数可选,所有参数配置请参考 GCS Config

("fs.gs.project.id" = "Your Project ID","fs.AbstractFileSystem.gs.impl" = "com.google.cloud.hadoop.fs.gcs.GoogleHadoopFS","fs.gs.impl" = "com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem",
)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/6265.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WPF5-x名称空间

1. x名称空间2. x名称空间内容3. x名称空间内容分类 3.1. x:Name3.2. x:Key3.3. x:Class3.4. x:TypeArguments 4. 总结 1. x名称空间 “x名称空间”的x是映射XAML名称空间时给它取的名字&#xff08;取XAML的首字母&#xff09;&#xff0c;里面的成员&#xff08;如x:Class、…

网站HTTP改成HTTPS

您不仅需要知道如何将HTTP转换为HTTPS&#xff0c;还必须在不妨碍您的网站自成立以来建立的任何搜索排名权限的情况下进行切换。 为什么应该从HTTP转换为HTTPS&#xff1f; 与非安全HTTP于不同&#xff0c;安全域使用SSL&#xff08;安全套接字层&#xff09;服务器上的加密代…

煤矿场景下拖链检测数据集VOC+YOLO格式21407张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;21407 标注数量(xml文件个数)&#xff1a;21407 标注数量(txt文件个数)&#xff1a;2140…

栈和队列(C语言)

目录 数据结构之栈 定义 实现方式 基本功能实现 1&#xff09;定义&#xff0c;初始化栈 2&#xff09;入栈 3&#xff09;出栈 4&#xff09;获得栈顶元素 5)获得栈中有效元素个数 6&#xff09;检测栈是否为空 7&#xff09;销毁栈 数据结构之队列 定义 实现方…

Flutter鸿蒙化中的Plugin

Flutter鸿蒙化中的Plugin 前言鸿蒙项目内PluginFlutter端实现鸿蒙端实现创建Plugin的插件类注册Plugin 开发纯Dart的package为现有插件项目添加ohos平台支持创建插件配置插件编写插件内容 参考资料 前言 大家知道Flutter和鸿蒙通信方式和Flutter和其他平台通信方式都是一样的&…

探索JavaScript前端开发:开启交互之门的神奇钥匙(二)

目录 引言 四、事件处理 4.1 事件类型 4.2 事件监听器 五、实战案例&#xff1a;打造简易待办事项列表 5.1 HTML 结构搭建 5.2 JavaScript 功能实现 六、进阶拓展&#xff1a;异步编程与 Ajax 6.1 异步编程概念 6.2 Ajax 原理与使用 七、前沿框架&#xff1a;Vue.js …

DeepSeek-R1:性能对标 OpenAI,开源助力 AI 生态发展

DeepSeek-R1&#xff1a;性能对标 OpenAI&#xff0c;开源助力 AI 生态发展 在人工智能领域&#xff0c;大模型的竞争一直备受关注。最近&#xff0c;DeepSeek 团队发布了 DeepSeek-R1 模型&#xff0c;并开源了模型权重&#xff0c;这一举动无疑为 AI 领域带来了新的活力。今…

假期day1

第一天&#xff1a;请使用消息队列实现2个终端之间互相聊天 singal1.c #include <stdio.h>#include <string.h>#include <unistd.h>#include <stdlib.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include &l…

go-zero框架基本配置和错误码封装

文章目录 加载配置信息配置 env加载.env文件配置servicecontext 查询数据生成model文件执行查询操作 错误码封装配置拦截器错误码封装 接上一篇&#xff1a;《go-zero框架快速入门》 加载配置信息 配置 env 在项目根目录下新增 .env 文件&#xff0c;可以配置当前读取哪个环…

考研机试:买房子

描述 某程序员开始工作&#xff0c;年薪 N万&#xff0c;他希望在中关村公馆买一套 60平米的房子&#xff0c;现在价格是 200 万&#xff0c;假设房子价格以每年百分之 K 增长&#xff0c;并且该程序员未来年薪不变&#xff0c;且不吃不喝&#xff0c;不用交税&#xff0c;每年…

Ansible fetch模块详解:轻松从远程主机抓取文件

在自动化运维的过程中&#xff0c;我们经常需要从远程主机下载文件到本地&#xff0c;以便进行分析或备份。Ansible的fetch模块正是为了满足这一需求而设计的&#xff0c;它可以帮助我们轻松地从远程主机获取文件&#xff0c;并将其保存到本地指定的位置。在这篇文章中&#xf…

前端开发中的模拟后端与MVVM架构实践[特殊字符][特殊字符][特殊字符]

平时&#xff0c;后端可能不能及时给接口给前端进行数据调用和读取。这时候&#xff0c;前端想到进行模拟后端接口。本文将介绍如何通过vite-plugin-mock插件模拟后端接口&#xff0c;并探讨MVVM架构在前端开发中的应用。此外&#xff0c;我们还将讨论Vue2与Vue3的区别&#xf…

JAVA毕业设计210—基于Java+Springboot+vue3的中国历史文化街区管理系统(源代码+数据库)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvue3的中国历史文化街区管理系统(源代码数据库)210 一、系统介绍 本项目前后端分离(可以改为ssm版本)&#xff0c;分为用户、工作人员、管理员三种角色 1、用户…

docker的前世今生

docker来自哪里&#xff1f; 从我们运维部署的历史来看&#xff0c;宿主机从最初的物理机到虚拟机&#xff0c;再到docker&#xff0c;一步步演进到现在。技术演进其实是为了解决当前技术的痛点&#xff0c;那我们来看看有哪些痛点以及如何克服痛点的。 物理机 一般来说&…

电脑办公技巧之如何在 Word 文档中添加文字或图片水印

Microsoft Word是全球最广泛使用的文字处理软件之一&#xff0c;它为用户提供了丰富的编辑功能来美化和保护文档。其中&#xff0c;“水印”是一种特别有用的功能&#xff0c;它可以用于标识文档状态&#xff08;如“草稿”或“机密”&#xff09;、公司标志或是版权信息等。本…

【机器学习案列】探索各因素对睡眠时间影响的回归分析

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

2024年度总结

迟来的2024年度总结&#xff0c;本文主要包括创作经历的回顾、个人成长与突破、以及职业与生活的平衡。 文章目录 1、 创作经历回顾2、 成长回顾3、 职业与生活的平衡4、 展望未来 1、 创作经历回顾 从高中开始就喜欢给别人解答疑问&#xff0c;大学学习模电、数电时&#xff…

vim在命令模式下的查找功能

/ab 从上往下 n 下一个 N 上一个 示例&#xff1a; 在命令模式下直接点击键盘上的/就可以进行查找&#xff0c;比如我要查找a&#xff0c;输入a后再回车&#xff0c;就可以检索出文件中所有和a有关的内容。 ?ab 从下往上 N 下一个 n 上一个 示例&#xff1a;和上图相同…

机器学习-使用梯度下降最小化均方误差

前面有一篇文章《机器学习-常用的三种梯度下降法》&#xff0c;这篇文章中对于均方误差的求偏导是错误的&#xff0c;为了澄清这个问题&#xff0c;我再写一篇文章来纠正一下&#xff0c;避免误导大家。 一、批量梯度下降法 我们用 批量梯度下降法 来求解一个简单的 线性回归…

基于quartz,刷新定时器的cron表达式

文章目录 前言基于quartz&#xff0c;刷新定时器的cron表达式1. 先看一下测试效果2. 实现代码 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&…