我们刚刚从CDH 5.3.6升级到5.10.0,并在尝试写入Kafka主题时开始遇到错误。我们在所有内容上都有默认设置,没有SSL或Kerberos身份验证。当使用控制台生产商写入我的主题之一时,我会得到这个错误:
/usr/bin/kafka-console-producer -broker-list = myHost1.dev.com:9092,myhost2.dev.com:9092-主题测试
17/03/06 21:00:57 INFO utils.AppInfoParser: Kafka version : 0.10.0-kafka-2.1.0
17/03/06 21:00:57 INFO utils.AppInfoParser: Kafka commitId : unknown
x
17/03/06 21:00:59 WARN clients.NetworkClient: Error while fetching metadata with correlation id 0 : {test=TOPIC_AUTHORIZATION_FAILED}
查看/var/log/kafka/,我看到其中一堆例外:
2017-03-06 21:00:26,964 WARN org.apache.sentry.provider.common.HadoopGroupMappingService: Unable to obtain groups for ANONYMOUS
java.io.IOException: No groups found for user ANONYMOUS
at org.apache.hadoop.security.Groups.noGroupsForUser(Groups.java:190)
at org.apache.hadoop.security.Groups.getGroups(Groups.java:210)
at org.apache.sentry.provider.common.HadoopGroupMappingService.getGroups(HadoopGroupMappingService.java:60)
at org.apache.sentry.provider.common.ResourceAuthorizationProvider.getGroups(ResourceAuthorizationProvider.java:167)
at org.apache.sentry.provider.common.ResourceAuthorizationProvider.doHasAccess(ResourceAuthorizationProvider.java:97)
at org.apache.sentry.provider.common.ResourceAuthorizationProvider.hasAccess(ResourceAuthorizationProvider.java:91)
at org.apache.sentry.kafka.binding.KafkaAuthBinding.authorize(KafkaAuthBinding.java:212)
at org.apache.sentry.kafka.authorizer.SentryKafkaAuthorizer.authorize(SentryKafkaAuthorizer.java:63)
at kafka.server.KafkaApis$$anonfun$kafka$server$KafkaApis$$authorize$2.apply(KafkaApis.scala:321)
at kafka.server.KafkaApis$$anonfun$kafka$server$KafkaApis$$authorize$2.apply(KafkaApis.scala:321)
at scala.Option.map(Option.scala:146)
at kafka.server.KafkaApis.kafka$server$KafkaApis$$authorize(KafkaApis.scala:321)
at kafka.server.KafkaApis$$anonfun$30.apply(KafkaApis.scala:702)
at kafka.server.KafkaApis$$anonfun$30.apply(KafkaApis.scala:702)
at scala.collection.TraversableLike$$anonfun$partition$1.apply(TraversableLike.scala:314)
at scala.collection.TraversableLike$$anonfun$partition$1.apply(TraversableLike.scala:314)
at scala.collection.immutable.Set$Set1.foreach(Set.scala:94)
at scala.collection.TraversableLike$class.partition(TraversableLike.scala:314)
at scala.collection.AbstractTraversable.partition(Traversable.scala:104)
at kafka.server.KafkaApis.handleTopicMetadataRequest(KafkaApis.scala:702)
at kafka.server.KafkaApis.handle(KafkaApis.scala:79)
at kafka.server.KafkaRequestHandler.run(KafkaRequestHandler.scala:60)
at java.lang.Thread.run(Thread.java:745)
我一直在寻找解决方案,但是到目前为止已经空了。我需要将匿名用户分配给某些组的某个地方吗?我能够在CDH 5.3.6中写给我的主题的消息,但是升级中似乎出现了问题。
只是试图让Helloworld/QuickStart示例升级到CDH 5.10.0。
------------------------------------------------------------------------------------------
在Cloudera Manager 5.10中,Kafka配置中有一个super.users属性。在该列表中添加匿名,使我可以从主题中生产和消费。
我已经尝试在/opt/cloudera/parcels/kafka-2.1.0-1.2.1.2.1.0.p0.115/etc/kafka/kafka/conf.dist/server.properties中执行此操作。因此,Cloudera必须在其他地方管理这些值。
kafka严格区分身份验证和授权 - 即使您通过Curb或SSL进行身份验证,仍然可以通过以下参数打开授权:
authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
这将使每次访问的KAFKA检查ACLS - 但是,由于您的情况下已验证身份验证,因此每个用户都将被评估为匿名,并且如果没有为此用户设置的ACL,则将拒绝。
您可以从配置中删除该设置,这应该使Kafka返回其旧的,信任的自我。我不确定您在Cloudera Manager中在哪里做这件事,因此另一种选择是将匿名添加到CM中可用的超级用户列表中。或当然只定义ACL以允许访问匿名。
供以后生产使用,您可能应该设置SSL或Kerberos并定义适当的ACL,如果有可能从外部访问集群。