Producer发送数据失败,报错“NullPointerException”
问题现象
使用MRS安装集群,主要安装ZooKeeper、Kafka。
在使用Producer向Kafka发送数据功能时,发现客户端抛出NullPointerException。
可能原因
- Kafka服务异常。
- 客户端Producer侧jaas文件和keytab文件错误。
原因分析
Producer发送数据到Kafka失败,可能原因客户端Producer侧问题或者Kafka侧问题。
- 通过Manager页面查看Kafka服务状态及监控指标。
- MRS Manager界面操作:登录MRS Manager,依次选择“服务管理 > Kafka”,查看当前Kafka状态,发现状态为良好,且监控指标内容显示正确。
- FusionInsight Manager界面操作:登录FusionInsight Manager,选择“集群 > 服务 > Kafka”,查看当前Kafka状态,发现状态为良好,且监控指标内容显示正确。
- 查看Producer客户端日志,发现打印NullPointerException异常信息,如图1所示。
或者日志中只有异常信息没有堆栈信息(只有NullPointerException无堆栈信息,出现这个问题是jdk的自我保护,相同堆栈打印太多,就会触发这个保护开关,后续不再打印堆栈),如图2所示。
- 查看Producer客户端日志,发现打印Failed to configure SaslClientAuthenticator异常信息,如图3所示。
- 认证失败导致创建KafkaChannel失败,导致通过channel(key)方法获取的KafkaChannel为空,以至于疯狂打印NullPointerException,上述日志可以发现,认证失败的原因是用户密码不正确,密码不正确的原因可能是用户名不匹配导致。
- 检查Jaas文件和Keytab文件,发现Jaas文件中配置使用的pricipal为stream。
图4 检查Jaas文件
查看user.keytab文件,发现principal为zmk_kafka。
图5 查看user.keytab文件
发现jaas文件和user.keytab文件中principal不对应。
该情况是由于应用程序自动定时更新Jaas文件,但是有两个不同的进程在进行更新,一个进程写入正确的Principal而另一个却写入了错误的Principal,以至于程序时而正常,时而异常。
解决办法
- 修改Jaas文件,确保使用的Principal在Keytab文件中存在。