文章目录
错误一项目场景:问题描述错误原因:解决方案:
错误二fe 日志原因解决
错误三日志:解决
错误四日志解决
错误一
项目场景:
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”
官网链接: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
精彩链接
发表评论