本文共 1018 字,大约阅读时间需要 3 分钟。
一般来说,这种错误是source往channel写入数据时错误才有的异常,因此只需根据实际情况去处理就行。但有另一种错误,我们配置zabbix监控flume端口时,会每隔固定时间往source端口建立一个tcp连接。查看NettyServer这样的配置后发现应用的数据是正常接收的,但flume.log日志会不停的打印ClosedChannelException,但实际并不影响其他数据的接收。
通过查看报错的堆栈信息,可以看到该报错出现在Netty 自带的ZlibEncoder编码器,在Handler处理 downstream流处理时间时,触发异常。这个异常,是配置错误导致的。遇到有两种情况会有该异常,一种是组件之间关系写错,如名为s1的sink用的是c1的channel,但被错误的写成不存在的c2,就会有该错。第二种是source接收的是字符串类型的数据,而配置成接收序列化后的数据avro,则会报这种异常,因此只需将source type改成 netcat即可。
错误很明显,对于netcat字符串型的数据,若是按avro的方式去反序列化,则得出的listSize远大于avro序列化的数据。该异常原因是检查点文件太大了,因此备份检查点甚至删除检查点文件即可。
在flume运行期间,某时刻经常抛出ChannelException异常,说明channel的容量达到上限,说明chnanel的分配低于数据写入的速度或者Sink组件消耗Channel中数据的速度不够快。虽然抛出异常导致程序重复执行并不会丢失数据,也因重新考虑flume能力,增加Sink,Channel。
转载地址:http://nfkai.baihongyu.com/