我正在尝试通过Spark结构化流从Kafka读取数据。但是,在Spark 2.4.0中,您无法设置流的组ID(请参见How to set group.id for consumer group in kafka data source in Structured Streaming?)。
但是,由于未设置此参数,因此spark只会生成组ID,而我会陷入GroupAuthorizationException:
19/12/10 15:15:00 ERROR streaming.MicroBatchExecution: Query [id = 747090ff-120f-4a6d-b20e-634eb77ac7b8, runId = 63aa4cce-ad72-47f2-80f6-e87947b69685] terminated with error
org.apache.kafka.common.errors.GroupAuthorizationException: Not authorized to access group: spark-kafka-source-d2420426-13d5-4bda-ad21-7d8e43ebf518-1874352823-driver-2
任何想法如何绕过这个?有趣的是,我能够通过kafka-console-consumer.sh读取此数据,在那里我可以在.properties文件中传递组ID。
引发异常的代码:
val df = spark
.readStream
.format("kafka")
.option("subscribe", "topic")
.option("startingOffsets", "earliest")
.option("kafka.group.id", "idThatShouldBeUsed")
.option("kafka.bootstrap.servers", "server")
.option("kafka.security.protocol", "SASL_SSL")
.option("kafka.sasl.mechanism", "PLAIN")
.option("kafka.ssl.truststore.location", "/location)
.option("kafka.ssl.truststore.password", "pass")
.option("kafka.sasl.jaas.config", """jaasToUse""")
.load()
.writeStream
.outputMode("append")
.format("console")
.option("startingOffsets", "earliest")
.start().awaitTermination()
答案 0 :(得分:0)
从消费者的角度看来这是无法解决的。我们最终不得不使用bin / kafka-acls.sh和通配符来允许结构化流生成的所有组ID。
kafka acl示例:
bin/kafka-acls --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=zk:2181 --add --allow-principal User:'Bon' --operation READ --topic topicName --group='spark-kafka-source-' --resource-pattern-type prefixed