如何将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。
答案 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