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提供的零数据丢 ...
随机推荐
- matlab 中的function定义. 用最简单的例子说明.
function y=myfunction(a,b)其中a,b是输入函数的参数,y是函数返回的值.当需要返回多个值时,可以将y看作一个数组,或者直接将函数的开头写成如function [x,y]=my ...
- 基于Video4Linux的视频采集模块开发(转)
Linux系统中,摄像头驱动程序安装好后,为了进行视频采集必须加入Video4Linux模块,从而可以通过Video4Linux模块提供的编程接口(API)从摄像头设备中获取图像帧.下面具体研究基于V ...
- Web 漏洞分析与防御之 XSS(一)
原文地址:Web 漏洞分析与防御之 XSS(一) 博客地址:http://www.extlight.com 一.全称 跨站脚本攻击(Cross Site Scripting) 二.原理 通过在网站中的 ...
- Python中文报错问题
异常信息:SyntaxError: Non-ASCII character '\xe6' in file D:/pythonlearning/HelloPython.py on line 8, but ...
- 类的声明与实例化及构造方法析构方法(PHP学习)
<?php class human{ public static $leg=2; public $name = 'leo'; public $age = '25'; public functio ...
- golang里面检测对象是否实现了接口的方法
写法有点怪异,记一下吧 _, implemented := this.delegate.(IGenTcpServerDelegate) if implemented { this.delegate.G ...
- Vue.js实现数据的双向数据流
众所周知,Vue.js一直使用的是单向数据流的,和angularJs的双向数据流相比,单向数据流更加容易控制.Vue.js允许父组件通过props属性传递数据到子组件.但是有些情况下我们需要在子组件里 ...
- windows7下怎样安装whl文件(python)
本文转载自:http://blog.csdn.net/fhl812432059/article/details/51745226 windows7 python2.7 1.用管理员方式打开cmd 2. ...
- 网络异常时抓包操作说明tcpdump+Wireshark
转债至 https://help.aliyun.com/knowledge_detail/40564.html?spm=5176.11065259.1996646101.searchclickresu ...
- Collection集合学习(一)———Set接口与具体实现
接口Collection: Collection是Java的一个集合框架, 也是一个根接口.JDK中没有提供此接口的任何实现,但是提供了更具体的子接口Set和List接口的实现,所有的Collecti ...