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提供的零数据丢 ...
随机推荐
- Python学习系列(八)( 面向对象基础)
Python学习系列(八)( 面向对象基础) Python学习系列(七)( 数据库编程) 一,面向对象 1,域:属于一个对象或类的变量.有两种类型,即实例变量—属于每个实例/类的对象:类变量—属于类 ...
- ecmall2.3.0 前后台样式等无效,导致前台页面显示不正常问题解决
问题一:按照安装手册安装及数据初始化后,前后台中文均出现乱码 解决方法:在upload/index.php 和 upload/admin/index.php 头上加上header("Cont ...
- hadoop深入学习之SequenceFile
的1个byte 3.Key和Value的类名 4.压缩相关的信息 5.其他用户定义的元数据 6.同步标记,sync marker Metadata 在文件创建时就写好了,所以也是不能更改的.条记录存储 ...
- 自增自减 a++,++a,a--,--a
1.自增(++)自减(--)运算符是一种特殊的算术运算符,在算术运算符中需要两个操作数来进行运算,而自增自减运算符是一个操作数. 实例: public class selfAddMinus{ publ ...
- Maven构建项目速度太慢的解决办法 Maven 调试
Apache Maven是当今非常流行的项目构建和管理工具,它把开发人员从繁杂的项目依赖关系处理事务中解放出来,完全自动化管理依赖问题.在Web应用开发过程中,通常我们会用到maven的archety ...
- Memcached: temple
ylbtech-Memcached: temple 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 7.返回顶部 8.返回顶部 ...
- 为什么 JSON 接口的数据都要加双引号!!!不能用单引号
原因是:Javascript 在很多时候会把 JSON 对象里面没有双引号包围的值,当做数值处理.比如: {"a":987654321} 这个 JSON 里头的变量 a,会被当做一 ...
- grep 小技巧
转自:http://www.cnblogs.com/itech/archive/2012/10/18/2729944.html 1) grep命令加- E参数,这一扩展允许使用扩展模式匹配.例如,要抽 ...
- 第十一章 Helm-kubernetes的包管理器(下)
11.5.5 开发自己的chart k8s提供了大连官方的chart, 不过要部署微服务,还是需要开发自己的chart: 1 创建chart Helm会帮助创建目录mychart,并生成各类c ...
- Android笔记——对系统通话记录的删除操作
手机通话记录是保存在数据库中的,位置: /data/data/com.android.providers.contacts/databases/calllog.db ,表名:calls 这张表中有个 ...