从databricks spark cluster消费Secure Kafka

时间:2018-09-05 14:03:28

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

我正在尝试从安全的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消息。

遇到类似问题的任何人,请告知!

0 个答案:

没有答案