【问题标题】:Missing required configuration "bootstrap.servers" error in Spark Streaming standard exampleSpark Streaming 标准示例中缺少必需的配置“bootstrap.servers”错误
【发布时间】:2019-03-02 11:50:03
【问题描述】:

我对 Scala 和 Spark 有点陌生,所以请随意评价我,但不要太难。

我正在尝试启动标准 DirectKafkaWordCount 示例(随 Spark2 安装提供)以测试 Spark Streaming 如何与 Kafka 配合使用。

这是示例的代码(也可以找到here):

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

// scalastyle:off println
package org.apache.spark.examples.streaming

import org.apache.spark.SparkConf
import org.apache.spark.streaming._
import org.apache.spark.streaming.kafka010._

/**
 * Consumes messages from one or more topics in Kafka and does wordcount.
 * Usage: DirectKafkaWordCount <brokers> <topics>
 *   <brokers> is a list of one or more Kafka brokers
 *   <topics> is a list of one or more kafka topics to consume from
 *
 * Example:
 *    $ bin/run-example streaming.DirectKafkaWordCount broker1-host:port,broker2-host:port \
 *    topic1,topic2
 */
object DirectKafkaWordCount {
  def main(args: Array[String]) {
    if (args.length < 2) {
      System.err.println(s"""
        |Usage: DirectKafkaWordCount <brokers> <topics>
        |  <brokers> is a list of one or more Kafka brokers
        |  <topics> is a list of one or more kafka topics to consume from
        |
        """.stripMargin)
      System.exit(1)
    }

    StreamingExamples.setStreamingLogLevels()

    val Array(brokers, topics) = args

    // Create context with 2 second batch interval
    val sparkConf = new SparkConf().setAppName("DirectKafkaWordCount")
    val ssc = new StreamingContext(sparkConf, Seconds(2))

    // Create direct kafka stream with brokers and topics
    val topicsSet = topics.split(",").toSet
    val kafkaParams = Map[String, String]("metadata.broker.list" -> brokers)
    val messages = KafkaUtils.createDirectStream[String, String](
      ssc,
      LocationStrategies.PreferConsistent,
      ConsumerStrategies.Subscribe[String, String](topicsSet, kafkaParams))

    // Get the lines, split them into words, count the words and print
    val lines = messages.map(_.value)
    val words = lines.flatMap(_.split(" "))
    val wordCounts = words.map(x => (x, 1L)).reduceByKey(_ + _)
    wordCounts.print()

    // Start the computation
    ssc.start()
    ssc.awaitTermination()
  }
}
// scalastyle:on println

在尝试启动它时,我不得不将 spark-streaming-kafka-0-10_2.11-2.3.1.jar 和 kafka-clients-0.10.0.1.jar 放到 /usr/hdp/3.0.0.0- 1634/spark2/jars/ 目录(这让我有些吃惊,因为我认为安装提供的所有标准示例都必须开箱即用,但 WordCount 示例声称这些包)。添加这些罐子后,我尝试从主题 test 中读取记录并通过命令进行字数统计

/usr/hdp/3.0.0.0-1634/spark2/bin/run-example streaming.DirectKafkaWordCount localhost:9092 测试

但是,应用程序失败了,我得到的错误如下所示:

Exception in thread "main" org.apache.kafka.common.config.ConfigException: Missing required configuration "bootstrap.servers" which has no default value.
        at org.apache.kafka.common.config.ConfigDef.parse(ConfigDef.java:421)
        at org.apache.kafka.common.config.AbstractConfig.<init>(AbstractConfig.java:55)
        at org.apache.kafka.common.config.AbstractConfig.<init>(AbstractConfig.java:62)
        at org.apache.kafka.clients.consumer.ConsumerConfig.<init>(ConsumerConfig.java:376)
        at org.apache.kafka.clients.consumer.KafkaConsumer.<init>(KafkaConsumer.java:557)
        at org.apache.kafka.clients.consumer.KafkaConsumer.<init>(KafkaConsumer.java:540)
        at org.apache.spark.streaming.kafka010.Subscribe.onStart(ConsumerStrategy.scala:84)
        at org.apache.spark.streaming.kafka010.DirectKafkaInputDStream.consumer(DirectKafkaInputDStream.scala:70)
        at org.apache.spark.streaming.kafka010.DirectKafkaInputDStream.start(DirectKafkaInputDStream.scala:240)
        at org.apache.spark.streaming.DStreamGraph$$anonfun$start$7.apply(DStreamGraph.scala:54)
        at org.apache.spark.streaming.DStreamGraph$$anonfun$start$7.apply(DStreamGraph.scala:54)
        at scala.collection.parallel.mutable.ParArray$ParArrayIterator.foreach_quick(ParArray.scala:143)
        at scala.collection.parallel.mutable.ParArray$ParArrayIterator.foreach(ParArray.scala:136)
        at scala.collection.parallel.ParIterableLike$Foreach.leaf(ParIterableLike.scala:972)
        at scala.collection.parallel.Task$$anonfun$tryLeaf$1.apply$mcV$sp(Tasks.scala:49)
        at scala.collection.parallel.Task$$anonfun$tryLeaf$1.apply(Tasks.scala:48)
        at scala.collection.parallel.Task$$anonfun$tryLeaf$1.apply(Tasks.scala:48)
        at scala.collection.parallel.Task$class.tryLeaf(Tasks.scala:51)
        at scala.collection.parallel.ParIterableLike$Foreach.tryLeaf(ParIterableLike.scala:969)
        at scala.collection.parallel.AdaptiveWorkStealingTasks$WrappedTask$class.compute(Tasks.scala:152)
        at scala.collection.parallel.AdaptiveWorkStealingForkJoinTasks$WrappedTask.compute(Tasks.scala:443)
        at scala.concurrent.forkjoin.RecursiveAction.exec(RecursiveAction.java:160)
        at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
        at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
        at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
        at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
        at ... run in separate thread using org.apache.spark.util.ThreadUtils ... ()
        at org.apache.spark.streaming.StreamingContext.liftedTree1$1(StreamingContext.scala:578)
        at org.apache.spark.streaming.StreamingContext.start(StreamingContext.scala:572)
        at org.apache.spark.examples.streaming.DirectKafkaWordCount$.main(DirectKafkaWordCount.scala:70)
        at org.apache.spark.examples.streaming.DirectKafkaWordCount.main(DirectKafkaWordCount.scala)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.spark.deploy.JavaMainApplication.start(SparkApplication.scala:52)
        at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:904)
        at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:198)
        at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:228)
        at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:137)
        at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

这让我很困惑,因为我在启动命令中提供了引导服务器 (localhost:9092)。有什么想法可以从这里挖掘吗?

我的配置:

火花 - 2.3.1

卡夫卡 - 2.11-1.0.1

【问题讨论】:

  • 顺便说一句,您不应该在任何不受信任的环境中使用 localhost。并非所有运行 Spark 执行器的 YARN 服务器都是 Kafka 代理

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


【解决方案1】:

如果您正在使用 kafka 进行 spring boot 并且遇到此错误

org.apache.kafka.common.config.ConfigException:缺少所需的配置“bootstrap.servers”,没有默认值。

确保您准备好这些东西:

  1. spring.kafka.bootstrap-servers 在 poperrty 或 yml 文件中设置此属性。
  2. Zookeeper 和 kafka 服务器正在运行。
  3. Consumer 正在通过此命令“kafka-console-consumer.bat/sh”运行(根据操作系统)。
  4. spring.kafka.consumer.group-id 需要设置。
  5. spring.kafka.consumer.auto-offset-reset=earliest

这将对某人有所帮助。

谢谢,

阿图尔

【讨论】:

    【解决方案2】:

    该示例已一年多未更新,但您似乎需要将 metadata.broker.list 重命名为 bootstrap.servers,这是所有其他 Kafka 客户端使用的属性名称。

    我不确定run-example 脚本是否正确传递了参数,但您需要提供 Kafka 代理的外部 IP 或主机名,而不是 localhost。

    此外,Spark2+ 中推荐使用结构化流和 Dataframe API,而不是 DStream 和 RDD

    【讨论】:

    • 我尝试了 IP 和主机名 - 结果是一样的。至于把 metadata.broker.list 改成 bootstrap.servers,我试试,谢谢。
    【解决方案3】:

    您需要在 kafka 参数中添加bootstrap.servers,因为消费者需要引导服务器来使用来自任何主题的消息 w.r.t。 spark-streaming-kafka-0-10_2.11-2.3.1.jar.

    val kafkaParams = Map[String, Object]("bootstrap.servers" -> "alpha-kafka-1.com:9092,alpha-kafka-2.com:9092,alpha-kafka-3.com:9092")
    

    资源: https://spark.apache.org/docs/latest/streaming-kafka-0-10-integration.html#creating-a-direct-stream

    【讨论】:

    • 在 Kafka 参数中使用 bootstrap.servers
    • 你能解释一下为什么它说在Kafka参数中,你必须指定要么metadata.broker.listbootstrap.servers,那么? spark.apache.org/docs/2.2.0/…
    • 您正在使用 spark-streaming-kafka-0-10_2.11-2.3.1.jar 并且您正在检查 Kafka 0.8 的文档。请查看答案中给出的资源中的示例。
    • “我”没有使用任何东西。我没有创建这篇文章
    • 我的意思是 OP 正在使用 Spark Github 上的示例代码,并希望它能正常工作。
    猜你喜欢
    • 2017-11-06
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    • 2019-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多