【问题标题】:How do I connect to a Kerberos-secured Kafka cluster with Spark Structured Streaming?如何使用 Spark 结构化流连接到受 Kerberos 保护的 Kafka 集群?
【发布时间】:2019-07-05 12:11:08
【问题描述】:

我正在尝试使用结构化流式处理 API 连接到受 Kerberos 保护的 Kafka 集群。下面是我的代码和 Spark 的输出。我没有看到任何异常,只是警告客户端断开连接的消息。解决此问题的下一步是什么?

import org.apache.spark.sql.SparkSession
import org.apache.log4j.{Logger, Level}

object Main {
  def main(args: Array[String]) {
    Logger.getLogger("org").setLevel(Level.WARN)
    Logger.getLogger("akka").setLevel(Level.WARN)

    val spark = SparkSession.builder()
      .master("local[*]")
      .appName("myapp")
      .config("spark.executor.extraJavaOptions", "java.security.auth.login.config=jaas.conf")
      .getOrCreate()

    import spark.implicits._

    val lines = spark.readStream.format("kafka")
      .option("kafka.bootstrap.servers", "broker1:9100,broker2:9100")
      .option("security.protocol", "SASL_PLAINTEXT")
      .option("sasl.kerberos.service.name", "mysvcname")
        .option("subscribe", "mytopic")
        .load()

    val query = lines.select("value").writeStream.format("console").start()
    query.awaitTermination()
}

这是输出:

Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
19/02/11 17:15:06 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
19/02/11 17:15:10 WARN NetworkClient: [Consumer clientId=consumer-1, groupId=spark-kafka-source-cef02569-ab16-4ca2-a9e8-18bcea992c0d--1359730493-driver-0] Bootstrap broker broker2:9100 (id: -2 rack: null) disconnected
19/02/11 17:15:11 WARN NetworkClient: [Consumer clientId=consumer-1, groupId=spark-kafka-source-cef02569-ab16-4ca2-a9e8-18bcea992c0d--1359730493-driver-0] Bootstrap broker broker1:9100 (id: -1 rack: null) disconnected
19/02/11 17:15:11 WARN NetworkClient: [Consumer clientId=consumer-1, groupId=spark-kafka-source-cef02569-ab16-4ca2-a9e8-18bcea992c0d--1359730493-driver-0] Bootstrap broker broker2:9100 (id: -2 rack: null) disconnected
19/02/11 17:15:11 WARN NetworkClient: [Consumer clientId=consumer-1, groupId=spark-kafka-source-cef02569-ab16-4ca2-a9e8-18bcea992c0d--1359730493-driver-0] Bootstrap broker broker1:9100 (id: -1 rack: null) disconnected
19/02/11 17:15:11 WARN NetworkClient: [Consumer clientId=consumer-1, groupId=spark-kafka-source-cef02569-ab16-4ca2-a9e8-18bcea992c0d--1359730493-driver-0] Bootstrap broker broker1:9100 (id: -1 rack: null) disconnected
19/02/11 17:15:11 WARN NetworkClient: [Consumer clientId=consumer-1, groupId=spark-kafka-source-cef02569-ab16-4ca2-a9e8-18bcea992c0d--1359730493-driver-0] Bootstrap broker broker2:9100 (id: -2 rack: null) disconnected
...

【问题讨论】:

  • 您如何将jaas.conf 提供给执行者?
  • 最终目标是通过 spark-submit 的 --files 选项向 executoros 提供 jaas.conf 和 keytab 文件,但现在我只是想让上面的代码在其中工作我的IDE。我没有得到任何异常来表明问题可能是什么,这让我很困惑。
  • 无法建立连接。以我的经验,这通常是因为没有正确提供 JAAS。因此我的问题......在IDE中运行只是驱动程序,而不是执行程序

标签: scala apache-spark apache-kafka kerberos


【解决方案1】:

我发现了我的问题。指定安全协议选项时,选项名称必须以“kafka.”为前缀。这很令人困惑,因为对于一个普通的 Kafka 消费者来说,这个选项只是 security.protocol,但是为了配置 Spark,bootstrap.serverssecurity.protocol em>(可能还有您可能需要的任何其他选项/属性)必须以 kafka. 为前缀。我原来的代码是:

.option("security.protocol", "SASL_PLAINTEXT")

正确的选项是:

.option("kafka.security.protocol", "SASL_PLAINTEXT")

下面是完整的代码:

import org.apache.spark.sql.SparkSession
import org.apache.log4j.{Level, Logger}

object Main {
  def main(args: Array[String]) {
    Logger.getLogger("org").setLevel(Level.INFO)
    Logger.getLogger("akka").setLevel(Level.INFO)

    val spark = SparkSession.builder()
      .master("local[*]")
      .appName("myapp")
      .config("spark.executor.extraJavaOptions", "java.security.auth.login.config=c:/krb/jaas.conf")
      .getOrCreate()

    import spark.implicits._

    val lines = spark.readStream.format("kafka")
      .option("kafka.bootstrap.servers", "broker1:9100,broker2:9100")
      .option("kafka.security.protocol", "SASL_PLAINTEXT")
      .option("subscribe", "mytopic")
      .load()

    val query = lines.select("value").writeStream.format("console").start()
    query.awaitTermination()
  }
}

作为参考,这里是 jaas.conf 文件的内容:

KafkaClient {
  com.sun.security.auth.module.Krb5LoginModule required
  useKeyTab=true
  keyTab="c:/krb/mykeytab.keytab"
  principal="myaccount@mydomain.int"
  storeKey=true
  useTicketCache=false
  serviceName="myservicename";
};

【讨论】:

猜你喜欢
  • 2020-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-14
  • 2017-03-28
  • 2020-01-31
相关资源
最近更新 更多