当使用spark streaming将消息写入kafka主题时,它只是写入一个分区

时间:2017-04-26 00:04:23

标签: apache-spark apache-kafka spark-streaming kafka-producer-api

如何将spark写入消息写入kafka中的所有分区,以便我可以使用直接流并提高流的性能。

这是我的代码: -

object kafka {
def main(args: Array[String]) {
  val sparkConf = new SparkConf().setAppName("FlightawareSparkApp")
    sparkConf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
    val ssc = new StreamingContext(sparkConf, Seconds(3))
    val lines = ssc.socketTextStream("localhost", 18436)
                        val topic = "test"
                        val props = new java.util.Properties()
                        props.put("metadata.broker.list", "list")
                        props.put("bootstrap.servers", "list")
                        //  props.put("bootstrap.servers", "localhost:9092")
                        // props.put("bootstrap.servers", "localhost:9092")
                        props.put("client.id", "KafkaProducer")
                        props.put("producer.type", "async")
                        props.put("key.serializer", "org.apache.kafka.common.serialization.IntegerSerializer")
                        props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer")
            lines.foreachRDD(rdd => {
                rdd.foreachPartition(part => {
                    val producer = new KafkaProducer[Integer, String](props)
                    part.foreach(msg =>{
                        val record = new ProducerRecord[Integer, String](topic, msg)
                        producer.send(record)
                    })
                    producer.close()
                })
            })
            ssc.start()
            ssc.awaitTermination()
}

}

此代码将消息推送到kafka主题,但是当我使用

查看计数时
 /usr/hdp/current/kafka-broker/bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list $KAFKABROKERS --topic test --time -1 

我正在获取输出,我只能在一个分区中看到消息。

test:8:0
test:2:0
test:5:0
test:4:0
test:7:0
test:1:0
test:9:0
test:3:0
test:6:237629
test:0:0

有关如何将数据拆分为所有分区的任何建议。

如何在程序中默认实现分区键,以便跨分区分发消息。

谢谢,

Ankush Reddy。

1 个答案:

答案 0 :(得分:2)

这是因为你没有设置密钥。您可以在Kafka FAQ [1]中找到以下详细信息。

  

为什么在未指定分区键时数据在分区之间不均匀分布?

     

在Kafka生产者中,可以指定分区键以指示消息的目标分区。默认情况下,使用基于散列的分区程序来确定给定密钥的分区ID,人们也可以使用自定义分区程序。

     

要减少打开套接字的数量,在0.8.0(https://issues.apache.org/jira/browse/KAFKA-1017)中,当未指定分区键或为null时,生产者将选择一个随机分区并坚持一段时间(默认值为10)分钟之前切换到另一个。因此,如果生成器少于分区,则在给定时间点,某些分区可能不会接收任何数据。为了缓解此问题,可以减少元数据刷新间隔或指定消息密钥和自定义随机分区程序。有关更多详细信息,请参阅此主题http://mail-archives.apache.org/mod_mbox/kafka-dev/201310.mbox/%3CCAFbh0Q0aVh%2Bvqxfy7H-%2BMnRFBt6BnyoZk1LWBoMspwSmTqUKMg%40mail.gmail.com%3E

[1] https://cwiki.apache.org/confluence/display/KAFKA/FAQ