Spark之 Spark Streaming整合kafka(并演示reduceByKeyAndWindow、updateStateByKey算子使用)
Kafka0.8版本基于receiver接受器去接受kafka topic中的数据(并演示reduceByKeyAndWindow的使用)
依赖
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming-kafka-0-8_2.11</artifactId>
<version>2.1.3</version>
</dependency>
代码
package com.zy.kafka2streaming import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream}
import org.apache.spark.streaming.kafka.KafkaUtils
import org.apache.spark.streaming.{Seconds, StreamingContext}
import org.apache.spark.{SparkConf, SparkContext} import scala.collection.immutable /**
* sparkStreaming整合kafka: 基于receiver接受器去接受kafka topic中的数据,使用高级api(消息的偏移量由zk维护)
* kafka0.8版本才有createStream 1.0就没有了
* reduceByKeyAndWindow算子使用(开窗函数)
*
* 前提:需要开启生产者往kafka中写入数据
*/
object SparkStreamingKafkaReceiver {
def main(args: Array[String]): Unit = {
//sparkConf 开启WAL日志,保证数据源的安全性
val sparkConf: SparkConf = new SparkConf().setAppName("SparkStreamingKafkaReceiver").setMaster("local[4]").set("spark.streaming.receiver.writeAheadLog.enable", "true")
//sc
val sc: SparkContext = new SparkContext(sparkConf)
sc.setLogLevel("WARN") //构建ssc
val ssc: StreamingContext = new StreamingContext(sc, Seconds(5))
//设置checkpoint目录
ssc.checkpoint("./spark-receiver") //接收kafka数据
//1 指定zk地址
val zkQuorum = "bigdata-01:2181,bigdata-02:2181,bigdata-03:2181"
//2 消费者groupid
val groupId = "zyTest"
// 指定topic有关信息 key:表示topic的名称,value:表示每一个receiver接收器使用多少个线程去消费topic数据
val topic = Map("sparkDemo" -> 1) //使用多个receiver接收(循环创建 并放到集合中)
val receiverList: immutable.IndexedSeq[ReceiverInputDStream[(String, String)]] = (1 to 3).map(x => {
val stream: ReceiverInputDStream[(String, String)] = KafkaUtils.createStream(ssc, zkQuorum, groupId, topic)
stream
})
//把一个集合中多个Dstream数据汇总成一个Dstream
val unionStream: DStream[(String, String)] = ssc.union(receiverList) //获取topic数据 第二个是value
val data: DStream[String] = unionStream.map(_._2)
//切分
val words: DStream[String] = data.flatMap(_.split(","))
//计数
val wordsAndOne: DStream[(String, Int)] = words.map((_, 1))
//聚合
//val result: DStream[(String, Int)] = wordsAndOne.reduceByKey(_ + _) /**
* 开窗函数 reduceByKeyAndWindow 三个参数
* 第一个:逻辑函数
* 第二个:表示窗口的长度
* 第三个:表示窗口的滑动时间间隔,每隔多久计算一次
*
* 每5秒统计前15秒的结果
*/
val result: DStream[(String, Int)] = wordsAndOne.reduceByKeyAndWindow((x: Int, y: Int) => x + y, Seconds(15), Seconds(5)) //打印
result.print() //开启流计算
ssc.start()
ssc.awaitTermination() }
}
Kafka1.0版本整合Kafka(并演示updateStateByKey的使用)
依赖
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming-kafka-0-10_2.11</artifactId>
<version>2.1.3</version>
</dependency>
代码
package com.zy.kafka2streaming import org.apache.kafka.common.serialization.StringDeserializer
import org.apache.spark.streaming.dstream.DStream
import org.apache.spark.streaming.kafka010.ConsumerStrategies.Subscribe
import org.apache.spark.streaming.kafka010.KafkaUtils
import org.apache.spark.streaming.kafka010.LocationStrategies.PreferConsistent
import org.apache.spark.streaming.{Seconds, StreamingContext}
import org.apache.spark.{SparkConf, SparkContext} /**
* sparkStreaming整合kafka:利用低级api(消息的offset不再由zk去维护,有streaming处理完数据去维护)
* updateStateByKey算子的使用(历史累计)
* 前提:需要开启生产者往kafka中写入数据
*/
object SparkStreamingKafkaDirect {
def main(args: Array[String]): Unit = {
//sparkConf
val sparkConf: SparkConf = new SparkConf().setAppName("SparkStreamingKafkaDirect").setMaster("local[4]")
//sc
val sc: SparkContext = new SparkContext(sparkConf)
sc.setLogLevel("WARN") //sparkStreaming
val ssc: StreamingContext = new StreamingContext(sc, Seconds(5)) //checkpoint
ssc.checkpoint("./spark-direct") //----------------获取kafka中的数据------------------- //kafka0.8版本写法
//注意 这里0.8版本的参数是zk的地址 1.0版本的是kafka的地址
// val kafkaParams = Map("bootstrap.servers" -> "bigdata-01:9092,bigdata-02:9092,bigdata-03:9092", "groupId" -> "sparkDirect")
//topic 可以设置多个topic
// val topics = Set("sparkDemo") // KafkaUtils.createDirectStream 0.8版本的写法
// val dstream: InputDStream[(String, String)] = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](ssc, kafkaParams, topics) /**
* 官网kafka1.0版本 Creating a Direct Stream 示例
* import org.apache.kafka.clients.consumer.ConsumerRecord
* import org.apache.kafka.common.serialization.StringDeserializer
* import org.apache.spark.streaming.kafka010._
* import org.apache.spark.streaming.kafka010.LocationStrategies.PreferConsistent
* import org.apache.spark.streaming.kafka010.ConsumerStrategies.Subscribe
* *
* val kafkaParams = Map[String, Object](
* "bootstrap.servers" -> "localhost:9092,anotherhost:9092",
* "key.deserializer" -> classOf[StringDeserializer],
* "value.deserializer" -> classOf[StringDeserializer],
* "group.id" -> "use_a_separate_group_id_for_each_stream",
* "auto.offset.reset" -> "latest",
* "enable.auto.commit" -> (false: java.lang.Boolean)
* )
* *
* val topics = Array("topicA", "topicB")
* val stream = KafkaUtils.createDirectStream[String, String](
* streamingContext,
* PreferConsistent,
* Subscribe[String, String](topics, kafkaParams)
* )
* *
*stream.map(record => (record.key, record.value))
*/ //1.0版本的写法
val kafkaParams = Map[String, Object](
"bootstrap.servers" -> "bigdata-01:9092,bigdata-02:9092,bigdata-03:9092",
"key.deserializer" -> classOf[StringDeserializer],
"value.deserializer" -> classOf[StringDeserializer],
"group.id" -> "zy_test_direct",
"auto.offset.reset" -> "latest",
"enable.auto.commit" -> (false: java.lang.Boolean)
)
val topics = Set("sparkDemo")
val dstream = KafkaUtils.createDirectStream[String, String](ssc, PreferConsistent, Subscribe[String, String](topics, kafkaParams)) //--------------------------获取topic数据---------------------------- //0.8版本可以这么写 1.0版本不能这么写了
//val data: DStream[String] = dstream.map(_._2) //1.0版本 DStream.map
val data: DStream[String] = dstream.map(_.value())
//切分
val words: DStream[String] = data.flatMap(_.split(","))
//计数
val wordsAndOne: DStream[(String, Int)] = words.map((_, 1))
//聚合
//val result: DStream[(String, Int)] = wordsAndOne.reduceByKey(_ + _) /**
* 使用updateStateByKey 累计统计单词出现的次数
* 需要传一个函数进去
*/
val result: DStream[(String, Int)] = wordsAndOne.updateStateByKey(updateFunction) //打印
result.print() //开启流计算
ssc.start()
ssc.awaitTermination()
} /**
*
* @param newValues 表示当前批次汇总成的(word,1)中相同单词的所有的1
* @param historyCount 历史的所有相同key的value总和
* @return
*/
def updateFunction(newValues: Seq[Int], historyCount: Option[Int]): Option[Int] = {
//新的计数等于原来的计数加上这次数据的sum
val newCount: Int = historyCount.getOrElse(0) + newValues.sum
//将累加后的结果放到Option的子集Some中返回
Some(newCount)
}
}
Spark之 Spark Streaming整合kafka(并演示reduceByKeyAndWindow、updateStateByKey算子使用)的更多相关文章
- Spark学习之路(十六)—— Spark Streaming 整合 Kafka
一.版本说明 Spark针对Kafka的不同版本,提供了两套整合方案:spark-streaming-kafka-0-8和spark-streaming-kafka-0-10,其主要区别如下: s ...
- Spark 系列(十六)—— Spark Streaming 整合 Kafka
一.版本说明 Spark 针对 Kafka 的不同版本,提供了两套整合方案:spark-streaming-kafka-0-8 和 spark-streaming-kafka-0-10,其主要区别如下 ...
- spark streaming 整合 kafka(一)
转载:https://www.iteblog.com/archives/1322.html Apache Kafka是一个分布式的消息发布-订阅系统.可以说,任何实时大数据处理工具缺少与Kafka整合 ...
- spark streaming 整合kafka(二)
转载:https://www.iteblog.com/archives/1326.html 和基于Receiver接收数据不一样,这种方式定期地从Kafka的topic+partition中查询最新的 ...
- Spark之 Spark Streaming整合kafka(Java实现版本)
pom依赖 <properties> <scala.version>2.11.8</scala.version> <hadoop.version>2.7 ...
- spark streaming整合kafka
版本说明:spark:2.2.0: kafka:0.10.0.0 object StreamingDemo { def main(args: Array[String]): Unit = { Logg ...
- Spark Streaming 整合 Kafka
一:通过设置检查点,实现单词计数的累加功能 object StatefulKafkaWCnt { /** * 第一个参数:聚合的key,就是单词 * 第二个参数:当前批次产生批次该单词在每一个分区出现 ...
- Spark Streaming和Kafka整合保证数据零丢失
当我们正确地部署好Spark Streaming,我们就可以使用Spark Streaming提供的零数据丢失机制.为了体验这个关键的特性,你需要满足以下几个先决条件: 1.输入的数据来自可靠的数据源 ...
- Spark Streaming和Kafka整合是如何保证数据零丢失
转载:https://www.iteblog.com/archives/1591.html 当我们正确地部署好Spark Streaming,我们就可以使用Spark Streaming提供的零数据丢 ...
随机推荐
- 关于MySQL 通用查询日志和慢查询日志分析
MySQL中的日志包括:错误日志.二进制日志.通用查询日志.慢查询日志等等.这里主要介绍下比较常用的两个功能:通用查询日志和慢查询日志. 1)通用查询日志:记录建立的客户端连接和执行的语句. 2)慢查 ...
- Unite 2018 | 《崩坏3》:在Unity中实现高品质的卡通渲染(下)
http://forum.china.unity3d.com/thread-32273-1-1.html 今天我们继续分享米哈游技术总监贺甲在Unite Beijing 2018大会上的演讲<在 ...
- Linux 解压 压缩 tar
tar 格式:tar [选项] 目录或文件 // 将 test 文件夹打包成 test.tar $ tar cvf test.tar test // 将 home 目录下的 test 文件夹打 ...
- 64位windows系统安装javaee6.0不成功解决方案
64位windows系统安装javaee6.0不成功解决方案 (2013-01-19 14:59:51) 转载▼ 标签: 杂谈 could not find the required versio ...
- java代码-----indexOf()方法--从字符串的某个字符的第一次出现的位子开始
总结:方法是indedOf()方法.this is my sister //indexOf()方法是indexOf('m')==7 .那么就是字符m第一次出现的位置是顺数第7个,就会正常显示‘t ...
- python调试方法
之前调试python程序都是用print参数,感觉有点弱爆啊,最近发现python也有类似C语言gdb的工具pdb,记录下pdb的使用方法和心得. 先找了段简单的测试程序: 复制代码 !/usr/bi ...
- POJ1159解题心得
题目:http://poj.org/problem?id=1159 刚开始,从样例的特征去思考.总让我从回文数的角度去思考,想出几个方案,可都用了数据去检验,发现不行.如:ABCDDCB,BACDCA ...
- Angular2快速入门-5.使用http(新闻数据来自http请求)
Angular2官网通过http请求模拟API 来请求hero 数据,感觉有点繁琐,很让人理解不了,我们不采用它的办法,直接展示怎么使用http请求来获取我们的数据 ,直截了当. 第一.准备工作,创建 ...
- java实现时钟
package com.js.ai.modules.pointwall.testxfz; import java.awt.Color; import java.awt.Dimension; impor ...
- DBA_2PC_PENDING (转)
DBA_2PC_PENDINGOracle会自动处理分布事务,保证分布事务的一致性,所有站点全部提交或全部回滚.一般情况下,处理过程在很短的时间内完成,根本无法察觉到.但是,如果在commit或rol ...