为什么我启动Spark Stream时会冻结kafka使用者代码?

时间:2019-10-17 15:21:06

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

我是Kafka的新手,正在尝试在spark2中实现Kafka消费者逻辑,当我在Shell中运行所有代码并开始流式传输时,它什么也没显示。

我查看了StackOverflow中的许多帖子,但没有任何帮助。我什至从maven下载了所有依赖项jar并尝试运行,但仍然没有显示任何内容。

火花版本:2.2.0 Scala版本2.11.8 我下载的jar是kafka-clients-2.2.0.jar和spark-streaming-kafka-0-10_2.11-2.2.0.jar

但是我仍然面临着同样的问题。

请找到以下代码段

import org.apache.kafka.clients.consumer.ConsumerConfig
import org.apache.kafka.common.serialization.StringDeserializer
import org.apache.spark.streaming.{StreamingContext, Seconds}
import org.apache.spark.streaming.kafka010.{KafkaUtils, ConsumerStrategies, LocationStrategies}

val brokers = "host1:port, host2:port"
val groupid = "default"
val topics = "kafka_sample"
val topicset = topics.split(",").toSet

val ssc = new StreamingContext(sc, Seconds(2))

val kafkaParams = Map[String, Object](
  ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG -> brokers,
  ConsumerConfig.GROUP_ID_CONFIG -> groupid,
  ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG -> classOf[StringDeserializer],
  ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG -> classOf[StringDeserializer]
)

val msg = KafkaUtils.createDirectStream[String, String](
ssc, LocationStrategies.PreferConsistent, ConsumerStrategies.Subscribe[String, String](topicset, kafkaParams)
)

msg.foreachRDD{
rdd => rdd.collect().foreach(println)
}
ssc.start()

我期望SparkStreaming能够启动,但是它什么也没做。我在这里犯了什么错误?还是这是一个已知问题?

2 个答案:

答案 0 :(得分:1)

除非最后您致电ssc.awaitTermination(),否则驾驶员将处于闲置状态。如果您使用的是spark-shell,则它不是流作业的好工具。 请使用Zeppelin或Spark笔记本之类的交互式工具与流进行交互,或者尝试将您的应用程序构建为jar文件,然后进行部署。

此外,如果您正在尝试火花流,则结构化流会更好,因为它很容易使用。

http://spark.apache.org/docs/latest/structured-streaming-programming-guide.html

答案 1 :(得分:0)

  1. ssc.start()之后,在代码中使用ssc.awaitTermination()
  2. 要进行测试,请在 Main Object 中编写代码,然后在任何Intellij之类的IDE中运行
  3. 您可以使用命令外壳并从Kafka生产者发布消息。

我已经在一个博客示例中的一个简单示例中编写了所有这些步骤,并在GitHub中使用了工作代码。请参阅:http://softwaredevelopercentral.blogspot.com/2018/10/spark-streaming-and-kafka-integration.html