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
Protocol message was too large,看着像是记录过大. pb默认的序列化大小为64 << 20; // 64MB 一个建议,调小canal的批量参数
原回答者GitHub用户agapple
这个异常信息是由于otter管道在处理同步数据时,在将数据反序列化为对象时,因为数据大小超过了默认的大小限制(64MB),导致反序列化失败而抛出异常。
一般情况下,这个异常的发生是数据量较大或者字节码中数据类型大于64MB时,需要将默认的大小限制值调大。
解决方案:
#反序列化数据包大小,配置较大的值也不会对内存造成太多的影响
otter.processor.buffer.size=104857600
2.重启 Otter。
以上操作会将反序列化数据包的大小限制扩大到100MB,可以根据实际情况进行调整。
需要注意的是,调大数据包大小后,Otter节点的内存使用量可能会增加,可能需要相应地增加Jvm堆大小来保证其正常运行。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。