错误一
项目场景:
MySQL迁移数据到Doris。MySQL数据在5亿多条,批量导入Doris,一万一个batch。导致Doris出现问题
问题描述
- doris日志
W1027 17:38:00.901333 4904 stream_load_executor.cpp:80] fragment execute failed, query_id=0f46824a8fa39a96-2b7c40d20e2fdf82, err_msg=tablet writer write failed, tablet_id=27417, txn_id=32813, err=-235, host: 192.168.1.xx, id=0f46824a8fa39a96-2b7c40d20e2fdf82, job_id=-1, txn_id=32813, label=spark_streamload_20221027_173808_4dabc5d9133147f2a92bbb7e9b00b146, elapse(s)=0
W1027 17:38:00.901369 5191 stream_load.cpp:144] handle streaming load failed, id=0f46824a8fa39a96-2b7c40d20e2fdf82, errmsg=tablet writer write failed, tablet_id=27417, txn_id=32813, err=-235, host: 192.168.1.xx
W1027 17:38:00.920799 5145 delta_writer.cpp:110] failed to init delta writer. version count: 503, exceed limit: 500. tablet: 27417.508232187.46488e8eca2abee0-322a1614ebf23dad
W1027 17:38:00.920818 5145 tablets_channel.cpp:134] tablet writer write failed, tablet_id=27417, txn_id=32814, err=-235
- spark日志
java.io.IOException: Failed to load data on BE: http://192.168.1.xx:8140/api/doris_testdb/sha1_attribute_partition/_stream_load? node and exceeded the max retry times.
at org.apache.doris.spark.sql.DorisSourceProvider.$anonfun$createRelation$4(DorisSourceProvider.scala:118)
at scala.util.control.Breaks.breakable(Breaks.scala:42)
at org.apache.doris.spark.sql.DorisSourceProvider.flush$1(DorisSourceProvider.scala:92)
at org.apache.doris.spark.sql.DorisSourceProvider.$anonfun$createRelation$2(DorisSourceProvider.scala:78)
at org.apache.doris.spark.sql.DorisSourceProvider.$anonfun$createRelation$2$adapted(DorisSourceProvider.scala:70)
错误原因:
重要信息:version count: 503, exceed limit: 500
- 这个错误通常发生在数据导入操作中。新版错误码为 -235,老版本错误码可能是 -215。
- 这个错误的含义是,对应tablet的数据版本超过了最大限制(默认500,由 BE 参数
max_tablet_version_num
控制),后续写入将被拒绝。比如问题中这个错误,即表示 27417 这个tablet的数据版本超过了限制。 - 这个错误通常是因为导入的频率过高,大于后台数据的compaction速度,导致版本堆积并最终超过了限制。
- 此时,我们可以先通过
show tablet 27417
语句,然后执行结果中的show proc
语句,查看tablet各个副本的情况。 - 结果中的
versionCount即表示版本数量
。如果发现某个副本的版本数量过多,则需要降低导入频率或停止导入,并观察版本数是否有下降。 - 如果停止导入后,版本数依然没有下降,则需要去对应的BE节点查看
be.INFO日志
,搜索tablet id以及 compaction关键词,检查compaction是否正常运行。 - 关于compaction调优相关,可以参阅 ApacheDoris 公众号文章:Doris 最佳实践-Compaction调优(3)
解决方案:
- 调大数据版本
max_tablet_version_num
类型:int
描述:限制单个 tablet 最大 version 的数量。用于防止导入过于频繁,或 compaction 不及时导致的大量 version 堆积问题。当超过限制后,导入任务将被拒绝。
默认值:500
- 缩减插入频率
如果你用的也是spark 的话可以调整以下参数:
sink.batch.size
单次写BE的最大行数
我把它提高到10万就不报错了
错误二
fe 日志
[DatabaseTransactionMgr.abortTransaction():1231] abort transaction: TransactionState. transaction id: 48014, label:
spark_streamload_20230214_151611_4fae143214d44f25a1a5a677f1ed7509, db id: 24621, table id list: 43058, callback id: -1, coordinator: BE: 192.168.1.xx,
transaction status: ABORTED, error replicas num: 0, replica ids: , prepare time: 1676359146398, commit time: -1, finish time: 1676359146465,
reason: too many filtered rows successfully
重点 :reason: too many filtered rows successfully
原因
非法数据太多,当写入数据中存在有28%的非法数据时,默认会失败报错 “too many filtered rows”
解决
原来是有个字段太长了,但是doris表中建表语句是varchar(128).其实实际数据比128长,导致非法数据太多。改成256后 就能正常写入了。
错误三
日志:
当出现open tablets … timeout的如下错误
counter:33145
I0803 17:07:14.671137 24794 tablets_channel.cpp:60] open tablets channel: (id=5c4a512f9016841d-2acd0e501ce0b799,index_id=11050), tablets num: 13, timeout(s): 600
解决
ADMIN SET FRONTEND CONFIG ("stream_load_default_timeout_second" = "2400");
stream_load_default_timeout_second
:
导入任务的超时时间(以秒为单位),导入任务在设定的 timeout 时间内未完成则会被系统取消,变成 CANCELLED。
默认的 timeout 时间为 600 秒。如果导入的源文件无法在规定时间内完成导入,用户可以在 stream load 请求中设置单独的超时时间。
错误四
日志
"Status": "Fail",
"Message": "errCode = 2,
detailMessage = get tableList write lock timeout,
解决
curl -X POST http://{be_ip}:{be_http_port}/api/update_config?thrift_rpc_timeout_ms=20000&persist=true
thrift_rpc_timeout_ms
描述:thrift默认超时时间
默认值:10000