关于sparkStreaming整合kafka遇到的问题

 (一定要先看到最后,在对症下药)   

 首先概述一下,我的代码主要就是将kafka中消费的数据转到sparkStreaming中,并进行一系列的操作。这个代码在网上有很多相同的,在此不做太多论述。代码大概是这样的:

关于sparkStreaming整合kafka遇到的问题_第1张图片

第一个问题:权限问题,我的kafka集群是需要sasl安全认证登录,而在我的代码中并没有可以让我配置消费者的地方,因为是初学者总是哪里都想试试。首先尝试了通过JavaStreamContext设置KafkaConsumer发现行不通。 然后又通过System.setProperty进行设置,设置了用户登录的认证文件位置。设置之后没有才出现如下异常。

kafka.common.BrokerEndPointNotAvailableException: End point PLAINTEXT not found for broker 0

但是,在很久以后我才我先其实文件的方式并没有成功使用sasl方式,登录,而是使用非安全认证的方式,后来这个问题我有试着解决过,将spark装在kafka所在集群的机器上就可以安全登录了。

javax.security.auth.login.LoginException: No JAAS configuration section named 'Client' was found in specified JAAS configuration file: '../conf/login.config'. Will continue connection to Zookeeper server without SASL authentication

第二个问题:Zookeeper的ACL无效。

org.apache.zookeeper.KeeperException$InvalidACLException: KeeperErrorCode = InvalidACL for /consumer/**

    首先,解决的是zookeeper中不存在对应节点的问题。手动在代码中使用zkClient对象创建节点。一开始尝试过使用永久节点,但再次使用时还是有权限的认证配置,so,设置为临时节点,用完就删,需要在建。有了临时节点之后,在将acl进行授权(通常为读写权限),最后在SetAcl给新配置的节点。

第三个问题:也是困扰我最久的问题rebalance 负载均衡的问题

kafka.common.ConsumerRebalanceFailedException :log-push-record-consumer-group_mobile-machine1.xxx.com-0873423444321-993c4g63 can't rebalance after 4 retries

at kafka.consumer.ZookeeperConsumerConnector$ZKRebalancerListener.syncedRebalance(Unknown Source)
at kafka.consumer.ZookeeperConsumerConnector.kafka$consumer$ZookeeperConsumerConnector$$reinitializeConsumer(Unknown Source)
at kafka.consumer.ZookeeperConsumerConnector.consume(Unknown Source)
at kafka.javaapi.consumer.ZookeeperConsumerConnector.createMessageStreams(Unknown Source)
at com.xxx.mafka.client.consumer.DefaultConsumerProcessor.getKafkaStreams(DefaultConsumerProcessor.java:149)
at com.xxx.mafka.client.consumer.DefaultConsumerProcessor.recvMessage(DefaultConsumerProcessor.java:63)
at com.xxx.service.mobile.push.kafka.MafkaPushRecordConsumer.main(MafkaPushRecordConsumer.java:22)

at com.xxx.service.mobile.push.Bootstrap.main(Bootstrap.java:34)


这个问题我尝试了多种解决方案:比如在客户端及服务器端进行配置,将kafka的配置文件拷贝到spark,连线程锁都试过了,就是没有任何用。经过了两天艰苦卓绝(及其苦逼)的多次调试,最终终于让我找到了问题的所在,我发现不管我是否通过此种方式进行连接,最终都会产生相同的问题,然后我发现是我的kafka集群版本过高。 当时,我在安装spark集群时,当时的JDK版本为1.7就安装的历史低版本。没想到所连接的kafka集群版本过高也会产生不适配的问题。然后,我又装了一个单机版的低版本kafka代码可以成功跑通。并且也不需要手动对于ACL进行配置了。

    通常情况下不会出现Rebalance的报错(kafka会自行根据分区进行负载均衡,kafka没有如此低能)若出现此报错,通常情况下会是配置冲突问题或kafkaServer 本身的问题所致(其中就包括版本不匹配


你可能感兴趣的:(kafka,spark)