编辑

Broker Load 常见问题

1. Broker Load 是否支持再次执行已经执行成功、处于 FINISHED 状态的导入作业?

Broker Load 不支持再次执行已经执行成功、处于 FINISHED 状态的导入作业。而且,为了保证导入作业的不丢不重,每个执行成功的导入作业的标签 (Label) 均不可复用。可以使用 SHOW LOAD 命令查看历史的导入记录,找到想要再次执行的导入作业,复制作业信息,并修改作业标签后,重新创建一个导入作业并执行。

2. Broker Load 导入时出现内容乱码应该怎么处理?

通过错误 URL 查看内容乱码,如下所示:

Reason: column count mismatch, expect=6 real=1. src line: [$交通];
zcI~跟团+v];   count mismatch, expect=6 real=2. src line: [租e�rD��食休闲娱乐

出现内容乱码是因为导入作业请求中的 FORMAT AS 参数指定错误。修改 FORMAT AS 参数取值,改为待导入数据文件对应的文件类型,然后重试导入作业。

3. Broker Load 导入 HDFS 数据时,为什么数据的导入日期字段会出现异常,比正确的日期时间多加了 8 小时?这种情况应该怎么处理?

StarRocks 表在建表时设置的 timezone 为中国时区,创建 Broker Load 导入作业时设置的 timezone 也是中国时区,而服务器设置的是 UTC 时区。因此,日期字段在导入时,比正确的日期时间多加了 8 小时。建表时去掉 timezone 参数就可以了。

4. Broker Load 导入 ORC 格式的数据时,为什么会发生 "ErrorMsg: type:ETL_RUN_FAIL; msg:Cannot cast '<slot 6>' from VARCHAR to ARRAY<VARCHAR(30)>" 导入失败错误?这种情况应该怎么处理?

待导入数据文件和 Starrocks 表两侧的列名不一致,执行 SET 子句的时候系统内部会有一个类型推断,但是在调用 cast 函数执行数据类型转换的时候失败了。解决办法是确保两侧的列名一致,这样就不需要 SET 子句,也就不会调用 cast 函数执行数据类型转换,导入就可以成功了。

5. 为什么 Broker Load 导入作业没报错,但是却查询不到数据?

Broker Load 是一种异步的导入方式,创建导入作业的语句没报错,不代表导入作业成功了。可以通过 SHOW LOAD 语句来查看导入作业的结果状态和 errmsg 信息,然后修改导入作业的参数配置后,再重试导入作业。

6. 因数据质量问题报 "ETL_QUALITY_UNSATISFIED; msg:quality not good enough to cancel" 错误应该如何处理?

请参见导入通用常见问题

7. 导入报 "failed to send batch"或"TabletWriter add batch with unknown id" 错误应该如何处理?

该错误由数据写入超时而引起。需要修改 BE 上的 query_timeoutstreaming_load_rpc_max_alive_time_sec 参数的配置。具体请参考 BE 配置

8. 导入报 "LOAD-RUN-FAIL; msg:OrcScannerAdapter::init_include_columns. col name = xxx not found" 错误应该如何处理?

如果导入的是 Parquet 或 ORC 格式的数据,检查文件头的列名是否与 StarRocks 表中的列名一致,例如:

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

上述示例,表示将 Parquet 或 ORC 文件中以 tmp_c1tmp_c2 为列名的列,分别映射到 StarRocks 表中的 nameid 列。如果没有使用 SET 子句, 则以 column_list 参数中指定的列作为映射。具体请参见 BROKER LOAD

注意:如果导入的是 Apache Hive™ 版本直接生成的 ORC 文件,并且 ORC 文件中的表头并 Hive 表的元数据,而是 (_col0, _col1, _col2, ...),可能导致 "Invalid Column Name" 错误。这时候需要使用 SET 子句设置列转换规则。

9. 发生其他比如导入作业长时间没有结束等问题应该如何处理?

在 FE 上的日志文件 fe.log 中,根据导入作业的标签来搜索导入作业的 ID。然后,在 BE 上的日志文件 be.INFO 文件中,根据导入作业的 ID 来搜索上下文日志,进而查看具体原因。

10. 如何配置访问高可用 (HA) 模式下的 Apache HDFS 集群?

按照如下配置:

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

  • dfs.ha.namenodes.xxx:自定义 NameNode 的名字,多个名字以逗号 (,) 分隔。其中 xxxdfs.nameservices 中配置的 HDFS 服务的名字,如 "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:指定客户端连接 NameNode 的 provider,默认为 org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider

示例如下:

(
    "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" = "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider"
)

高可用模式可以和简单认证、Kerberos 认证两种认证方式组合,进行 HDFS 集群访问。例如,通过简单认证访问高可用模式部署的 HDFS 集群,需要指定如下配置:

(
    "username"="user",
    "password"="passwd",
    "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" = "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider"
)

关于 HDFS 集群的配置可以写入 hdfs-site.xml 文件中。这样您在使用 Broker 程序读取 HDFS 集群的数据时,只需要填写集群的文件路径名和认证信息即可。

11. 如何配置 Hadoop ViewFS Federation?

需要将 ViewFs 相关的配置文件 core-site.xmlhdfs-site.xml 拷贝到 broker/conf 目录中。

如果有自定义的文件系统,需要将文件系统相关的 .jar 文件拷贝到 broker/lib 目录中。

12. 访问 Kerberos 认证的集群时,报 "Can't get Kerberos realm" 错误应该如何处理?

首先检查是否所有的 Broker 所在的机器都配置了 /etc/krb5.conf 文件。

如果配置了仍然报错,需要在 Broker 的启动脚本中 JAVA_OPTS 变量的最后,加上 -Djava.security.krb5.conf:/etc/krb5.conf