无法使用Kafka-Spark Integration找到Set([topic,0])的领导者

时间:2017-05-24 22:30:41

标签: apache-spark ssl apache-kafka spark-streaming

我正在尝试将 SSL 用于Kafka-Spark集成。我已经在启用SSL的情况下测试了 Kafka ,它对样本消费者和制作人来说完全正常。

此外,我尝试了 Spark - Kafka 的集成,在spark-job中完成不带 SSL时也可以正常运行

现在,当我在 spark-job 中启用 SSL 时,我收到异常并且集成不起作用。

我在 spark-job 中启用 SSL 所做的更改在我的作业中包含以下代码行:

    sparkConf.set("security.protocol", "SSL");
    sparkConf.set("ssl.truststore.location", "PATH/truststore.jks");
    sparkConf.set("ssl.truststore.password", "passwrd");
    sparkConf.set("ssl.keystore.location", "PATH/keystore.jks");
    sparkConf.set("ssl.keystore.password", "kstore");
    sparkConf.set("ssl.key.password", "keypass");

创建流式上下文时会传递 sparkConf

JavaStreamingContext jssc = new JavaStreamingContext(sparkConf, new Duration(10000));

当我运行作业时,我得到的错误如下:

17/05/24 18:16:39 WARN ConsumerFetcherManager$LeaderFinderThread: [test-consumer-group_bmj-cluster-1495664195784-5f49cbd0-leader-finder-thread], Failed to find leader for Set([bell,0])
java.lang.NullPointerException
    at org.apache.kafka.common.utils.Utils.formatAddress(Utils.java:312)
    at kafka.cluster.Broker.connectionString(Broker.scala:62)
    at kafka.client.ClientUtils$$anonfun$fetchTopicMetadata$5.apply(ClientUtils.scala:89)
    at kafka.client.ClientUtils$$anonfun$fetchTopicMetadata$5.apply(ClientUtils.scala:89)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
    at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)
    at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48)
    at scala.collection.TraversableLike$class.map(TraversableLike.scala:234)
    at scala.collection.AbstractTraversable.map(Traversable.scala:104)
    at kafka.client.ClientUtils$.fetchTopicMetadata(ClientUtils.scala:89)
    at kafka.consumer.ConsumerFetcherManager$LeaderFinderThread.doWork(ConsumerFetcherManager.scala:66)
    at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:60)

Kafka版本 - 2.11-0.10.2.0
Spark版本 - 2.1.0
Scala版本 - 2.11.8

流媒体库

  <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-streaming_2.10 -->
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-streaming_2.11</artifactId>
        <version>2.1.0</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-streaming-kafka_2.10 -->
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-streaming-kafka-0-8_2.11</artifactId>
        <version>2.1.0</version>
    </dependency>

有关克服此问题的任何帮助吗?

1 个答案:

答案 0 :(得分:0)

通过一些挖掘,我能够弄清楚我遇到的问题。

首先,为了启用SSL相关的SSL, kafka-params 需要传递到 KafkaUtils.createDirectStream() 方法和 NOT JavaStreamingContext sparkConf

然后,给定的 SSL参数

"security.protocol", "SSL"
"ssl.truststore.location", "PATH/truststore.jks"
"ssl.truststore.password", "passwrd"
"ssl.keystore.location", "PATH/keystore.jks"
"ssl.keystore.password", "kstore"
"ssl.key.password", "keypass"
spark-kafka-streaming 版本&#34; 0- 8 _2.11&#34;不支持

,我正在使用,因此我有将其更改为版本&#34; 0- 10 _2.11&#34;。

作为回报,该方法有一个完整的API更改: KafkaUtils.createDirectStream(),用于连接Kafka。

文档中说明了如何使用它here

所以我连接到Kafka的最终代码片段如下所示:

final JavaInputDStream<ConsumerRecord<String, String>> stream =
            KafkaUtils.createDirectStream(
                    javaStreamingContext,
                    LocationStrategies.PreferConsistent(),
                    ConsumerStrategies.<String, String>Subscribe(topicsCollection, kafkaParams)
            );

kafka-params 是一个包含所有SSL参数的地图。

感谢
沙比尔