spark streaming统计kafka数据计数不准的问题

本文介绍了一个Spark应用统计Kafka数据时遇到的问题。最初使用Zookeeper方式时数据统计准确,但在改用直连模式后数据出现偏差。通过调整executor-cores参数解决了这一问题。

我的spark应用需要统计每秒钟kafka发送过来的条数,一开始用的是zk方式,使用reduceByKey来实现,然后把数据丢到redis中保存,最后再统计一个小时内,总共收到的数量。后来改用直连模式实现,即createDirectStream实现,但后来在对数据的时候发现数据不准,即一个小时内收到的总数和kafka一小时内发送的总数对不上,但之前在zk模式下是没有问题的呀!所以我想这应该是集群的问题,后来我想是不是跟executor-cores这个参数有关,因为我一直用的是6,我的节点也是6个,所以一直没改过,然后我将它改为1再试,结果ok了,数据统计正确。

好的,以下是一个简单的示例代码,假设我们要消费名为“test”的Kafka主题,并对其中的单词进行词频统计: ```scala import org.apache.spark.streaming.{Seconds, StreamingContext} import org.apache.spark.streaming.kafka._ import org.apache.kafka.common.serialization.StringDeserializer import org.apache.spark.SparkConf object WordCount { def main(args: Array[String]): Unit = { // 创建 SparkConf 对象 val conf = new SparkConf().setAppName("WordCount").setMaster("local[*]") // 创建 StreamingContext 对象 val ssc = new StreamingContext(conf, Seconds(5)) // 设置 Kafka 相关参数 val kafkaParams = Map[String, Object]( "bootstrap.servers" -> "localhost:9092", "key.deserializer" -> classOf[StringDeserializer], "value.deserializer" -> classOf[StringDeserializer], "group.id" -> "test-group", "auto.offset.reset" -> "latest", "enable.auto.commit" -> (false: java.lang.Boolean) ) // 创建一个 Kafka DStream val kafkaStream = KafkaUtils.createDirectStream[String, String]( ssc, LocationStrategies.PreferConsistent, ConsumerStrategies.Subscribe[String, String](Array("test"), kafkaParams) ) // 从 Kafka DStream 中提取单词 val words = kafkaStream.flatMap(record => record.value().split(" ")) // 对单词进行计数 val wordCounts = words.map(word => (word, 1)).reduceByKey(_ + _) // 输出计数结果 wordCounts.print() // 启动 Spark Streaming ssc.start() ssc.awaitTermination() } } ``` 上述代码中,我们首先创建了一个 `SparkConf` 对象,并设置了应用程序名为“WordCount”,使用本地模式运行。然后创建了一个 `StreamingContext` 对象,每隔 5 秒钟将接收到的数据进行批处理。 接下来,我们设置了 Kafka 相关参数,包括 Broker 地址、键值对反序列化器、消费者组 ID 等。然后使用 `KafkaUtils.createDirectStream` 方法创建了一个 Kafka DStream。在这个 DStream 上,我们使用 `flatMap` 方法将每个消息的值按空格拆分成单词,并使用 `map` 和 `reduceByKey` 方法对单词进行计数最后,我们调用 `print` 方法输出计数结果最后,我们启动 Spark Streaming 并等待计算完成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值