我正在尝试从安全的Kafka主题中消费(使用SASL_PLAINTEXT,ScramLogin方法)。
Spark版本2.3.1 斯卡拉2.11 卡夫卡最新
我正在使用Spark结构化流构造该流。为此,我导入了库:spark-sql-kafka-0-10_2.11-2.3.1
这将导入kafka-clients.jar的旧版本(0.10.0.1)。
下面是我的client.jaas:
KafkaClient {
org.apache.kafka.common.security.scram.ScramLoginModule required
mechanism=SCRAM-SHA-512
security.protocol=SASL_PLAINTEXT
client.id="*****"
username="****"
password="*****";
};
我正在使用ScramLoginModule和上面指定的kafka-clients jar,甚至没有这个jar。因此,我添加了更高版本的kafka Clients jar文件kafka-clients-1.1.1-cp1.jar
在我的笔记本中,我有以下代码:
import org.apache.spark.sql.functions._
import org.apache.spark.sql.SparkSession
import spark.implicits._
val kafkaSource = spark.readStream
.format("kafka")
.option("kafka.bootstrap.servers", "host:port")
.option("subscribe", "topic")
.option("startingOffsets", "earliest")
.option("maxOffsetsPerTrigger", 1)
.option("kafka.sasl.mechanism","SCRAM-SHA-512")
.option("kafka.security.protocol","SASL_PLAINTEXT")
.load()
val kafkaStream = kafkaSource.
select(
$"key" cast "string", // deserialize keys
$"value" cast "string", // deserialize values
$"topic",
$"partition",
$"offset",
$"timestamp",
$"timestampType")
import org.apache.spark.sql.ForeachWriter
kafkaStream.writeStream.foreach(new ForeachWriter[Row] {
override def process(row: Row): Unit = {
println("Processing : " + row.mkString(","))
}
override def close(errorOrNull: Throwable): Unit = {}
override def open(partitionId: Long, version: Long): Boolean = {
true
}
}).start().awaitTermination()
从驱动程序日志中,我可以正常连接。
18/09/05 13:09:46 INFO AbstractLogin: Successfully logged in.
18/09/05 13:09:46 INFO ConsumerConfig: ConsumerConfig values:
但是在此之后,什么也没发生!打印以下行后,它只会卡住:
18/09/05 13:09:47 INFO AppInfoParser: Kafka version : 0.10.0.1
18/09/05 13:09:47 INFO AppInfoParser: Kafka commitId : a7a17cdec9eaa6c5
上面的Kafka版本也非常令人困惑,因为我在任何地方都没有使用此版本(尽管这是我添加spark-sql-kafka-0-10_2.11-2.3时会自动导入的kafka客户端的版本.1库。但是我选择导入时不包括kafka-clients jar。正如我所说,我正在使用的kafka客户端具有更高的版本,我连接的kafka集群也是如此。
要复制此代码,我在自己的笔记本电脑上运行的Spark集群上运行了相同的代码,并且一切正常,在这里我可以使用和打印kafka消息。
遇到类似问题的任何人,请告知!