kafka版本不一致导致的一个小问题(二)

背景介绍:

我们公司的实时流项目现在用的spark streaming比较多,这里再说下版本:

spark streaming2.1.0

kafka 0.9.0.0

spark streaming如果想要集成kafka使用时,必须得使用spark官网提供的依赖包,目前有两种大的kafka分支依赖集成包,他们的一些信息如下:

从上面的表格可以看出 spark-streaming-kafka-0-8目前是支持版本大于或等于0.8.2.1时需要用到的,因为我们生产环境的kafka的版本是0.9.0.0所以只能选择spark-streaming-kafka-0-8_2.11这个依赖,然后spark streaming流程序跑起来,通过一定间隔不断从kafka消费数据,实时处理,整个流程是没有问题的,后来因为需要统一收集流程序的log中转到kafka中,最后通过logstash再发送到ElasticSearch中方便查看和检索日志,所以给项目集成了 kafka-log4j-appender-0.9.0.0,其功能是把log4j打印的日志给发送到kafka,配置完成之后再次启动项目,发现log也能收集到kafka中了,但通过后台发现时不时的会出现几条下面的log:

但并不影响正常功能使用,从log里面能够看出来是生产者的问题,也就是说发送消息到kafka的server时出现连接中断了,导致抛出EOF异常。

那么为什么会中断连接呢?经查资料发现,这是由于kafka的版本不一致导致的,也就是说用0.8.2.1的kafka client向kafka0.9.0.0的server端发送数据,如果在经过了一定时间内,连接还没断开,那么服务端会主动断开这个连接,如果都是0.9.0.0的版本,服务端主动断开连接,客户端是不会抛出异常的,但由于版本不一样,在服务端主动中断的时候,就出现了上面的异常。

如何模拟重现?

(1)搭建一套0.9.0.0的kafka集群,为了方便重现,将server.properties里面的加上这个空闲连接关闭参数connections.max.idle.ms为30秒,默认不设置是10分钟,然后启动集群。

(2)在java项目里面使用0.8.2.1的client作为生产者,并使用生产者发送一条数据后,程序主动sleep40秒。

(3)然后观察等到30秒的时候就会抛出这个异常,但是主程序还是会等到40秒后结束,因为kafka发送消息是起的单独的线程所以抛出这个log时候主线程是不会受到影响的。

如何解决:

(1)最简单的办法就是升级client和server版本一致

(2)网上有朋友建议调大connections.max.idle.ms这个参数,减少抛出异常的次数,算是治标不治本吧,不建议这么干。

最后可能有朋友疑问,如果客户端一直不关闭空闲连接,必须得10分钟后由服务端强制关闭,那么会不会出现这个时间内kafka的连接资源被耗尽的情况呢?答案是几乎不可能,因为kafka允许每台主机默认的连接数为Int.MaxValue差不多21亿多吧。只要10分钟内每台主机的连接数达不到这个量级,程序就不会有问题。而实际情况生产者也不能出现这么多连接,所以我们的一些生产者程序一旦启动起来基本上不会调用close方法,除非在手动停止程序时,可以通过钩子函数来触发资源关闭,其他情况的空闲连接,可以由服务端进行管理通过超时关闭。注意如果是一直被占用的连接,服务端是不会主动关闭的,另外经过测试发现消费者就算版本不一致也不存在这个问题,目前来看只会版本不一致 而且是在生产者的程序中才会出现这个问题。

原文发布于微信公众号 - 我是攻城师(woshigcs)

原文发表时间:2017-12-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏达摩兵的技术空间

linux之文件基本操作学习笔记

通过本教程你将熟悉linux文件的基本操作以及其具体使用。本文目录结构摘抄自《鸟哥的LINUX私房菜》基础学习篇(第三版)。

941
来自专栏编程坑太多

「小程序JAVA实战」微信小程序工程结构了解(五)

PS:这就是对微信小程序工程结构的大致了解,了解了结构才方便按照规范开发,不容易入坑。

1061
来自专栏vue

将java项目打包成jar文件并在cmd运行

2423
来自专栏HaHack

化繁为简的企业级 Git 管理实践(一):多分支子模块依赖管理

1622
来自专栏python3

python之读写文件

在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后...

1061
来自专栏算法修养

Flask 学习笔记

Flask 是一个Web应用框架,我也就是一边看书,一边写博文做记录 这本书: ? 首先安装Flask ,和配置环境,参考这边博客: 然后就开始学习Flask ...

3027
来自专栏月牙寂

swarm源码分析(3)---manage cluster

第一时间获取文章,可以关注本人公众号 月牙寂道长 yueyajidaozhang

2745
来自专栏云计算教程系列

如何使用RVM在FreeBSD 10.1上安装Ruby on Rails

Ruby on Rails,简称RoR,是一个用Ruby编写的非常流行的全栈Web应用程序开发框架。它允许您快速开发符合MVC(模型 - 视图 - 控制器)模式...

1151
来自专栏自动化测试实战

flask第十四篇——重定向

2936
来自专栏决胜机器学习

Redis专题(一)——Redis基本概述与安装配置

Redis专题(一) ——Redis基本概述与安装配置 (原创内容,转载请注明来源,谢谢) 一、特性 1、存储方式 Redis采用Key-Va...

3264

扫码关注云+社区

领取腾讯云代金券