记一次Spark海量数据导入Doris问题(failed to init delta writer. version count: 503, exceed limit: 500)

5 篇文章 2 订阅

错误一

项目场景:

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

  1. 这个错误通常发生在数据导入操作中。新版错误码为 -235,老版本错误码可能是 -215。
  2. 这个错误的含义是,对应tablet的数据版本超过了最大限制(默认500,由 BE 参数 max_tablet_version_num 控制),后续写入将被拒绝。比如问题中这个错误,即表示 27417 这个tablet的数据版本超过了限制。
  3. 这个错误通常是因为导入的频率过高,大于后台数据的compaction速度,导致版本堆积并最终超过了限制。
  4. 此时,我们可以先通过show tablet 27417 语句,然后执行结果中的 show proc 语句,查看tablet各个副本的情况。
  5. 结果中的 versionCount即表示版本数量。如果发现某个副本的版本数量过多,则需要降低导入频率或停止导入,并观察版本数是否有下降。
  6. 如果停止导入后,版本数依然没有下降,则需要去对应的BE节点查看be.INFO日志,搜索tablet id以及 compaction关键词,检查compaction是否正常运行。
  7. 关于compaction调优相关,可以参阅 ApacheDoris 公众号文章:Doris 最佳实践-Compaction调优(3)

解决方案:

  1. 调大数据版本

max_tablet_version_num
类型:int
描述:限制单个 tablet 最大 version 的数量。用于防止导入过于频繁,或 compaction 不及时导致的大量 version 堆积问题。当超过限制后,导入任务将被拒绝。
默认值:500

  1. 缩减插入频率

如果你用的也是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
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值