导入失败: too many tablet version 问题解决方法

导入问题 too many tablet version解决方法

背景:

实时导入过程中经常遇到导入失败报错too many tablet version的情况,此原因是因为StarRocks内部,表级别version数量有1000的限制,通常见于数据写入频次过高,数据合并来不及从而堆积大量的verison。本文主要介绍此种情况下如何恢复导入任务。

现象:

导入失败时检索be日志

grep 'too many tablet versions' /data/xxx/starrocks/be/log/be.WARNING

会发现如下错误

恢复步骤:

在日志里搜索所示字样

grep 'Fail to init delta writer' /data/xxx/starrocks/be/log/be.WARNING

检索结果会有tablet=xxx的信息,

这里以tablet 716097为例

连接starrocks然后查询tablet所属表信息:

show tablet 716097

如下所示,DbName和TableName分别表示对应database和所属表

此时需要调整写入该表的任务间隔、并发、单次写入量:核心在于通过增大单次写入数据量,减少任务提交次数以及写入并发。

以routineload为例:

参考文档:https://docs.starrocks.com/zh-cn/main/loading/RoutineLoad

  • max_batch_interval :每个子任务最大执行时间,单位是「秒」。范围为 5 到 60。默认为10。 1.15版本后 : 该参数是子任务的调度时间,即任务多久执行一次,任务的消费数据时间为fe.conf中的routine_load_task_consume_second,默认为3s, 任务的执行超时时间为fe.conf中的routine_load_task_timeout_second,默认为15s。

  • max_batch_rows :每个子任务最多读取的行数。必须大于等于200000。默认是200000。 1.15版本后 : 该参数只用于定义错误检测窗口范围,窗口的范围是10 * max-batch-rows

  • max_batch_size :每个子任务最多读取的字节数。单位是「字节」,范围是 100MB 到 1GB。默认是 100MB。 1.15版本后 : 废弃该参数,任务消费数据的时间为fe.conf中的routine_load_task_consume_second,默认为3s。

如果配置了上述单个参数,可直接修改相应参数为较大值,如果配置了上述多个参数,starrocks内部触发任一参数阈值即会提交任务,所以根据实际导入数据调整相应多个参数。

datax相应参数:

参考文档:https://docs.starrocks.com/zh-cn/main/loading/DataX-starrocks-writer

  • maxBatchRows

    • 描述:单次StreamLoad导入的最大行数
  • 必选:否

  • 默认值:500000 (50W)

  • maxBatchSize

    • 描述:单次StreamLoad导入的最大字节数。
  • 必选:否

  • 默认值:104857600 (100M)

  • flushInterval

    • 描述:上一次StreamLoad结束至下一次开始的时间间隔(单位:ms)。
  • 必选:否

  • 默认值:300000 (ms)

flink相应参数:

参考文档:https://docs.starrocks.com/zh-cn/main/loading/Flink-connector-starrocks

sink.buffer-flush.max-bytes NO 94371840(90M) String the max batching size of the serialized data, range: [64MB, 10GB].
sink.buffer-flush.max-rows NO 500000 String the max batching rows, range: [64,000, 5000,000].
sink.buffer-flush.interval-ms NO 300000 String the flushing time interval, range: [1000ms, 3600000ms].