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)
}
}

kafka2streaming的java实现版本

Spark之 Spark Streaming整合kafka(并演示reduceByKeyAndWindow、updateStateByKey算子使用)的更多相关文章

  1. Spark学习之路(十六)—— Spark Streaming 整合 Kafka

    一.版本说明 Spark针对Kafka的不同版本,提供了两套整合方案:spark-streaming-kafka-0-8和spark-streaming-kafka-0-10,其主要区别如下:   s ...

  2. Spark 系列(十六)—— Spark Streaming 整合 Kafka

    一.版本说明 Spark 针对 Kafka 的不同版本,提供了两套整合方案:spark-streaming-kafka-0-8 和 spark-streaming-kafka-0-10,其主要区别如下 ...

  3. spark streaming 整合 kafka(一)

    转载:https://www.iteblog.com/archives/1322.html Apache Kafka是一个分布式的消息发布-订阅系统.可以说,任何实时大数据处理工具缺少与Kafka整合 ...

  4. spark streaming 整合kafka(二)

    转载:https://www.iteblog.com/archives/1326.html 和基于Receiver接收数据不一样,这种方式定期地从Kafka的topic+partition中查询最新的 ...

  5. Spark之 Spark Streaming整合kafka(Java实现版本)

    pom依赖 <properties> <scala.version>2.11.8</scala.version> <hadoop.version>2.7 ...

  6. spark streaming整合kafka

    版本说明:spark:2.2.0: kafka:0.10.0.0 object StreamingDemo { def main(args: Array[String]): Unit = { Logg ...

  7. Spark Streaming 整合 Kafka

    一:通过设置检查点,实现单词计数的累加功能 object StatefulKafkaWCnt { /** * 第一个参数:聚合的key,就是单词 * 第二个参数:当前批次产生批次该单词在每一个分区出现 ...

  8. Spark Streaming和Kafka整合保证数据零丢失

    当我们正确地部署好Spark Streaming,我们就可以使用Spark Streaming提供的零数据丢失机制.为了体验这个关键的特性,你需要满足以下几个先决条件: 1.输入的数据来自可靠的数据源 ...

  9. Spark Streaming和Kafka整合是如何保证数据零丢失

    转载:https://www.iteblog.com/archives/1591.html 当我们正确地部署好Spark Streaming,我们就可以使用Spark Streaming提供的零数据丢 ...

随机推荐

  1. asp.net如何判断服务器上的目录或文件是否存在

    asp.net判断服务器上的目录或文件是否存在!(实例) // ======================================================= [判断文件是否存在] u ...

  2. AppScan9.0.3.5漏洞扫描记录

    1.跨站点脚本编制 这个安全漏洞拿cookie做文章,而且是将前端的一些弹窗方法,要么通过脚本注入,要么通过url.encode之后注入,看几个变异的版本: 版本一: cookie  从以下位置进行控 ...

  3. Spring AOP表达式报错:Pointcut is not well-formed: expecting 'name pattern' at character position

    问题现象: java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test ...

  4. Android JNI中的数据传递

    1.JNI 基本类型 当 Java 代码与本地代码 C/C++ 代码相互调用时,肯定会有参数的传递.两者属于不同的语言,数据类型有差别,此时,JNI 要保证两种语言之间的数据类型和数据空间大小的匹配. ...

  5. Vmvare + Ubuntu 16.04环境搭建 + 相关软件安装配置笔记【深度学习】

    前言 由于学习与工作的需要,加上之前配置好的vmmachines都损坏了,我就重新弄一个ubuntu虚拟机,配置一下环境,给自己留个记录 1.文件 2.配置过程 1.在Vmware中新建虚拟机,自定义 ...

  6. 紫金桥OPC接口使用技巧

    OPC接口使用技巧 OPC接口是由OPC基金会制定的,基于DCOM技术的,用于控制系统软件之间进行数据通讯的接口规范.由于其开放性和高效性,现在已被广泛应用于自动化控制领域及生产信息管理中.紫金桥软件 ...

  7. [模拟赛]异或最大值 maxinum

    此题在考试时用暴力,暴了30分. 献上30分代码: #include<stdio.h> ]; int main() { int n,t,c,i,max,j,d; freopen(" ...

  8. 【转】使用 JMeter 完成常用的压力测试

    本文介绍了 JMeter 相关的基本概念.并以 JMeter 为例,介绍了使用它来完成最常用的三种类型服务器,即 Web 服务器.数据库服务器和消息中间件,压力测试的方法.步骤以及注意事项.      ...

  9. java web 程序---刷新页面次数

    <%! int count=0; %> <% count++; session.setAttribute("count",count); out.print(&q ...

  10. EasyUI treegrid 删除一条或多条记录

    function del_dg() { $.messager.defaults = { ok: "是", cancel: "否" }; var node = $ ...