开发者社区> 问答> 正文

管道异常:deserial_error

pid:39 nid:18 exception:setl:com.alibaba.otter.node.etl.common.pipe.exception.PipeException: deserial_error Caused by: com.google.protobuf.InvalidProtocolBufferException: Protocol message was too large. May be malicious. Use CodedInputStream.setSizeLimit() to increase the size limit. at com.google.protobuf.InvalidProtocolBufferException.sizeLimitExceeded(InvalidProtocolBufferException.java:89) at com.google.protobuf.CodedInputStream.refillBuffer(CodedInputStream.java:720) at com.google.protobuf.CodedInputStream.isAtEnd(CodedInputStream.java:666) at com.google.protobuf.CodedInputStream.readTag(CodedInputStream.java:99) at com.alibaba.otter.node.etl.model.protobuf.BatchProto$RowData$Builder.mergeFrom(BatchProto.java:2959) at com.alibaba.otter.node.etl.model.protobuf.BatchProto$RowData$Builder.mergeFrom(BatchProto.java:2605) at com.google.protobuf.CodedInputStream.readMessage(CodedInputStream.java:275) at com.alibaba.otter.node.etl.model.protobuf.BatchProto$RowBatch$Builder.mergeFrom(BatchProto.java:863) at com.alibaba.otter.node.etl.model.protobuf.BatchProto$RowBatch$Builder.mergeFrom(BatchProto.java:675) at com.google.protobuf.AbstractMessage$Builder.mergeFrom(AbstractMessage.java:300) at com.google.protobuf.AbstractMessage$Builder.mergeFrom(AbstractMessage.java:238) at com.google.protobuf.AbstractMessageLite$Builder.mergeFrom(AbstractMessageLite.java:202) at com.google.protobuf.AbstractMessage$Builder.mergeFrom(AbstractMessage.java:738) at com.alibaba.otter.node.etl.model.protobuf.BatchProto$RowBatch.parseFrom(BatchProto.java:620) at com.alibaba.otter.node.etl.common.pipe.impl.http.RowDataHttpPipe.getDbBatch(RowDataHttpPipe.java:221) at com.alibaba.otter.node.etl.common.pipe.impl.http.RowDataHttpPipe.get(RowDataHttpPipe.java:71) at com.alibaba.otter.node.etl.common.pipe.impl.RowDataPipeDelegate.get(RowDataPipeDelegate.java:128) at com.alibaba.otter.node.etl.transform.TransformTask$1.run(TransformTask.java:76) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) at java.util.concurrent.FutureTask.run(FutureTask.java:262) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745)

原提问者GitHub用户 ghqaz3633

展开
收起
大圣东游 2023-06-21 17:06:15 47 0
2 条回答
写回答
取消 提交回答
  • Protocol message was too large,看着像是记录过大. pb默认的序列化大小为64 << 20; // 64MB 一个建议,调小canal的批量参数

    原回答者GitHub用户agapple

    2023-06-21 18:07:46
    赞同 展开评论 打赏
  • 这个异常信息是由于otter管道在处理同步数据时,在将数据反序列化为对象时,因为数据大小超过了默认的大小限制(64MB),导致反序列化失败而抛出异常。

    一般情况下,这个异常的发生是数据量较大或者字节码中数据类型大于64MB时,需要将默认的大小限制值调大。

    解决方案:

    1. 在 otter.properties 文件中添加以下配置(以100MB为例):
    #反序列化数据包大小,配置较大的值也不会对内存造成太多的影响
    otter.processor.buffer.size=104857600
    

    2.重启 Otter。

    以上操作会将反序列化数据包的大小限制扩大到100MB,可以根据实际情况进行调整。

    需要注意的是,调大数据包大小后,Otter节点的内存使用量可能会增加,可能需要相应地增加Jvm堆大小来保证其正常运行。

    2023-06-21 17:31:21
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载