繁体   English   中英

在Kafka Spark流中读取和处理并行性

[英]Reading and processing parallelism in Kafka Spark streaming

我正在尝试并行读取Kafka消息,从而并行处理它们。 我的Kafka主题有10个分区。 我正在尝试创建5个DStream,并应用Union方法对单个DStream进行操作。 这是我到目前为止尝试过的代码:

  def main(args: scala.Array[String]): Unit = {

    val properties = readProperties()

    val streamConf = new SparkConf().setMaster("local[2]").setAppName("KafkaStream")
    val ssc = new StreamingContext(streamConf, Seconds(1))
    //  println("defaultParallelism: "+ssc.sparkContext.defaultParallelism)
    ssc.sparkContext.setLogLevel("WARN")
    val numPartitionsOfInputTopic = 5
    val group_id = Random.alphanumeric.take(4).mkString("consumer_group")
    val kafkaStream = {
      val kafkaParams = Map("zookeeper.connect" -> properties.getProperty("zookeeper_connection_str"),
                            "group.id" -> group_id,
                            "zookeeper.connection.timeout.ms" -> "3000")                      

      val streams = (1 to numPartitionsOfInputTopic).map { _ =>
                          KafkaUtils.createStream[scala.Array[Byte], String, DefaultDecoder, StringDecoder](
                          ssc, kafkaParams, Map("kafka_topic" -> 1), StorageLevel.MEMORY_ONLY_SER).map(_._2)
      }
    val unifiedStream = ssc.union(streams)
    val sparkProcessingParallelism = 5 
    unifiedStream.repartition(sparkProcessingParallelism)
    }

  kafkaStream.foreachRDD { x => 
  x.foreach {       
      msg => println("Message: "+msg)
      processMessage(msg)
   }      
  }

  ssc.start()
  ssc.awaitTermination()
}  

执行后,它甚至没有收到任何一条消息,更不用说对其进行进一步处理了。 我在这里想念什么吗? 如果需要,请提出更改建议。 谢谢。

我强烈建议切换到直接流。 为什么?

默认情况下,Direct Stream将并行性设置为您在Kafka中拥有的分区数。 无需做其他任何事情-只需创建Direct Stream并完成您的工作即可:)

如果创建5个DStream,默认情况下将读取5个线程,一个非Direct-DStream =一个线程

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM