数据导入实践和调优

初期数据源主要来自 Hive 数仓,因此大部分数据导入以 Broker Load 方式为主。大数据平台自助导入任务工作流适配了 Doris Broker Load 导入方式,数据开发零代码 —— 通过简单的勾选配置即可完成自助的 Doris 数据导入工作流创建。

而在 Broker Load 的使用过程中,我们也陆续遇到了一些问题,这里拿出几个典型的问题和一些调优经验来分享。

在 Broker Load 导入时遇到的问题:

  1. 因表分桶数设置过少造成 Broker Load 导入失败,具体表现为导入任务失败且异常信息为:
tablet writer write failed, tablet_id=xxx, txn_id=xxx, err=-238

我们推测造成 -238 错误的原因可能是分桶设置太少,接着我们通过 BE 节点的挂载数据来查看单个 Tablet 下的文件大小,我们发现单个 Tablet 的文件占用空间远大于官方推荐的 10GB 上限范围,这也证明了我们的推测正确,因此我们通过适当提高 Doris 表的分桶数,使得这个问题有了较大的缓解。

顺便说一下,如果出现 -235(旧版本是 - 215)异常,一般是由于 Compaction 过慢导致 Tablet 版本堆积超过限制,这个时候通过 Grafana 看到 BE Compaction Score 在导入前后有明显的波动,而且绝对值很高。如果遇到此问题可以参阅 ApacheDoris 公众号文章:Doris 最佳实践 - Compaction 调优 (3) 对 Compaction 过程进行调优。

  1. 因 Hive 表字段变更导致 Broker Load 导入失败:

Hive 表在使用过程中会有一些 DDL 的执行,从而导致表字段新增,我们数仓的 Hive 表均使用 ORC 格式存储,那么就会导致 Hive 表中部分历史分区的 ORC 文件中字段信息缺失(缺失新增字段),而新分区的 ORC 文件中字段是正常的,这个时候如果对历史数据重新导入,就会有下面的异常信息:

detailMessage: ParseError : Invalid column selected xxx

在阅读了 Broker Load 相关代码后确认了问题原因:在一次 Broker Load 导入过程中,导入任务的字段解析器会读取一个 ORC 文件头解析字段信息,但解析器只会解析一次,如果一次导入过程中同时有新、历史分区的 ORC 文件,那么就可能导致任务失败。

修复的方法也很简单,只需针对每个 ORC 文件重新解析一次文件头的字段信息即可。在了解问题原因及分析解决思路后,我们也和社区的同学一起修复了这个问题并提交了相关 PR。

  1. 遇到空 ORC 文件时 Broker Load 导入失败:

这个问题的错误表现和问题 2 比较类似,具体原因是 Broker Load 导入过程没有对 ORC 文件做判空,遇到空 ORC 文件仍会尝试解析 ORC 文件字段信息导致报错,我们把这个问题反馈给社区后,社区的同学很快修复了该问题。

  1. Broker Load 导入任务出现 Broker list path exception. path=hdfs:xxx

创建 Broker Load 任务,使用 Kerberos 认证访问 HDFS 的 Hive 文件导入数据,Hive 文件路径中分区和下一级目录使用通配符 *,访问所有分区所有文件,任务提交后隔 40 多秒出现如下的错误:

type:ETL_RUN_FAIL; msg:errCode = 2, detailMessage = Broker list path exception. path=hdfs:xxx

在阅读了 Broker Load 的访问 HDFS 相关代码后确认了问题原因,Broker Load 调用 HDFS 的 LS、DU 方法时会获取文件目录信息,由于路径下的文件过多导致耗时会超过 45 秒,而 Thrift 设置的 Socket 请求超时默认小于 40 秒,所以出现了上述的 RPC 异常,问题反馈社区后,对 FE 增加了配置参数 broker_timeout_ms,设置为 90 秒后解决问题。

你可能感兴趣的:(大数据,hive,hadoop)