Spark结构化流未经授权访问组

时间:2019-12-10 15:26:21

标签: scala apache-spark apache-kafka spark-streaming spark-structured-streaming

我正在尝试通过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()

1 个答案:

答案 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