文档首页/ MapReduce服务 MRS/ 故障排除/ 使用Kafka/ Producer发送数据失败,报错“NullPointerException”
更新时间:2023-12-22 GMT+08:00

Producer发送数据失败,报错“NullPointerException”

问题现象

使用MRS安装集群,主要安装ZooKeeper、Kafka。

在使用Producer向Kafka发送数据功能时,发现客户端抛出NullPointerException。

可能原因

  1. Kafka服务异常。
  2. 客户端Producer侧jaas文件和keytab文件错误。

原因分析

Producer发送数据到Kafka失败,可能原因客户端Producer侧问题或者Kafka侧问题。

  1. 通过Manager页面查看Kafka服务状态及监控指标。
    • MRS Manager界面操作:登录MRS Manager,依次选择“服务管理 > Kafka”,查看当前Kafka状态,发现状态为良好,且监控指标内容显示正确。
    • FusionInsight Manager界面操作:登录FusionInsight Manager,选择“集群 > 服务 > Kafka”,查看当前Kafka状态,发现状态为良好,且监控指标内容显示正确。
  2. 查看Producer客户端日志,发现打印NullPointerException异常信息,如图1所示。
    图1 Producer客户端日志

    或者日志中只有异常信息没有堆栈信息(只有NullPointerException无堆栈信息,出现这个问题是jdk的自我保护,相同堆栈打印太多,就会触发这个保护开关,后续不再打印堆栈),如图2所示。

    图2 异常信息
  1. 查看Producer客户端日志,发现打印Failed to configure SaslClientAuthenticator异常信息,如图3所示。
    图3 异常日志信息
  1. 认证失败导致创建KafkaChannel失败,导致通过channel(key)方法获取的KafkaChannel为空,以至于疯狂打印NullPointerException,上述日志可以发现,认证失败的原因是用户密码不正确,密码不正确的原因可能是用户名不匹配导致。
  2. 检查Jaas文件和Keytab文件,发现Jaas文件中配置使用的pricipal为stream。
    图4 检查Jaas文件

    查看user.keytab文件,发现principal为zmk_kafka。

    图5 查看user.keytab文件

    发现jaas文件和user.keytab文件中principal不对应。

    该情况是由于应用程序自动定时更新Jaas文件,但是有两个不同的进程在进行更新,一个进程写入正确的Principal而另一个却写入了错误的Principal,以至于程序时而正常,时而异常。

解决办法

  1. 修改Jaas文件,确保使用的Principal在Keytab文件中存在。