SparkStreaming算子操作,Output操作
SparkStreaming练习之StreamingTest,UpdateStateByKey,WindowOperator
一、SparkStreaming算子操作
1.1 foreachRDD
output operation算子,必须对抽取出来的RDD执行action类算子,代码才能执行。
1.2 transform
transformation类算子
可以通过transform算子,对Dstream做RDD到RDD的任意操作。
1.3 updateStateByKey
- transformation算子
updateStateByKey作用:
- 为SparkStreaming中每一个Key维护一份state状态,state类型可以是任意类型的,可以是一个自定义的对象,更新函数也可以是自定义的。
- 通过更新函数对该key的状态不断更新,对于每个新的batch而言,SparkStreaming会在使用updateStateByKey的时候为已经存在的key进行state的状态更新。
- 使用到updateStateByKey要开启checkpoint机制和功能。
- 多久会将内存中的数据写入到磁盘一份?
如果batchInterval设置的时间小于10秒,那么10秒写入磁盘一份。如果batchInterval设置的时间大于10秒,那么就会batchInterval时间间隔写入磁盘一份。
1.4 操作窗口

假设每隔5s 1个batch,上图中窗口长度为15s,窗口滑动间隔10s。
- 窗口长度和滑动间隔必须是batchInterval的整数倍。如果不是整数倍会检测报错。
- 优化后的window操作要保存状态所以要设置checkpoint路径,没有优化的window操作可以不设置checkpoint路径。
二、Driver HA(Standalone或者Mesos)
因为SparkStreaming是7*24小时运行,Driver只是一个简单的进程,有可能挂掉,所以实现Driver的HA就有必要(如果使用的Client模式就无法实现Driver HA ,这里针对的是cluster模式)。Yarn平台cluster模式提交任务,AM(AplicationMaster)相当于Driver,如果挂掉会自动启动AM。这里所说的DriverHA针对的是Spark standalone和Mesos资源调度的情况下。实现Driver的高可用有两个步骤:
第一:提交任务层面,在提交任务的时候加上选项 --supervise,当Driver挂掉的时候会自动重启Driver。
第二:代码层面,使用JavaStreamingContext.getOrCreate(checkpoint路径,JavaStreamingContextFactory)
Driver中元数据包括:
- 创建应用程序的配置信息。
- DStream的操作逻辑。
- job中没有完成的批次数据,也就是job的执行进度。
三、Output操作
| Output | Meaning |
|---|---|
| 打印每个batch中的前10个元素,主要用于测试,或者是不需要执行什么output操作时,用于简单触发一下job | |
| saveAsTextFile(prefix,[suffix]) | 将每个batch的数据保存到文件中,每个batch的文件命名格式为:prefix-TIME_IN_MSI[.suffix] |
| saveAsObjectFile | 同上,但是将每个batch的数据以序列化对象的方式,保存到SequenceFile中 |
| saveAsHadoopFile | 同上,将数据保存到Hadoop文件中 |
| foreachRDD | 最常用的output操作,遍历DStream中的每个产生的RDD,进行处理。可以将每个RDD中的数据写入外部存储,比如文件,数据库,缓存等。通常在其中,是针对RDD执行action操作的,比如foreach |
算子操作实例
1 pom.xml
<properties>
<spark.version>2.3.0</spark.version>
<encoding>UTF-8</encoding>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming_2.11</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming-kafka-0-10_2.11</artifactId>
<!--kafka_2.12-2.2.0-->
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming-kafka-0-8_2.11</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.6.4</version>
</dependency>
</dependencies>
2 StreamingTest
import org.apache.spark.rdd.RDD
import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream}
import org.apache.spark.streaming.{Durations, StreamingContext}
import org.apache.spark.{SparkConf, SparkContext}
object StreamingTest {
def main(args: Array[String]): Unit = {
val conf = new SparkConf()
conf.setMaster("local[2]")
conf.setAppName("StreamingTest")
val sc = new SparkContext()
//new Streaming有两种方式,若使用第一种方式,则上方不需要再初始化SparkContext
//在JYM中已经创建了SparkContext
val ssc = new StreamingContext(conf, Durations.seconds(5))
ssc.sparkContext.setLogLevel("Error")
//val ssc = new StreamingContext(sc,Durations.seconds(5))
//可通过ssc.sparkContext获取到SparkContext的值
val lines: ReceiverInputDStream[String] = ssc.socketTextStream("hostname", 9000)
val words: DStream[String] = lines.flatMap(one => { one.split(" ") })
val pairsWords: DStream[(String, Int)] = words.map(one => { (one, 1) })
val result: DStream[(String, Int)] = pairsWords.reduceByKey(_ + _)
//result.print()
result.foreachRDD(pairRDD => {
val newRDD: RDD[(String, Int)] = pairRDD.filter(one => {
println("filter===============")
true
})
val resultRDD: RDD[(String, Int)] = newRDD.map(one => {
println("map**************" + one)
one
})
resultRDD.count()
})
/*result.foreachRDD(wordCount => {
println("******producer in Driver********")
val sortRDD: RDD[(String, Int)] = wordCount.sortByKey(false)
val result: RDD[(String, Int)] = sortRDD.filter(tp => {
println("***********producer in Executor**********)
true
})
result.foreach(println)
})*/
ssc.start()
ssc.awaitTermination()
//ssc.stop(true)会清空SparkContext对象
//ssc.stop(false)则不会清空对象
ssc.stop()
}
}
3 UpdateStateByKey
import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream}
import org.apache.spark.streaming.{Durations, StreamingContext}
import org.apache.spark.{SparkConf, SparkContext}
object UpdateStateByKey {
def main(args: Array[String]): Unit = {
val conf = new SparkConf()
conf.setMaster("local[2]")
conf.setAppName("UpdateStateByKey")
val sc = new SparkContext()
//new Streaming有两种方式,若使用第一种方式,则上方不需要再初始化SparkContext
//在JYM中已经创建了SparkContext
val ssc = new StreamingContext(conf, Durations.seconds(5))
ssc.sparkContext.setLogLevel("Error")
//val ssc = new StreamingContext(sc,Durations.seconds(5))
//可通过ssc.sparkContext获取到SparkContext的值
val lines: ReceiverInputDStream[String] = ssc.socketTextStream("hostname", 9000)
val words: DStream[String] = lines.flatMap(one => {
one.split(" ")
})
val pairsWords: DStream[(String, Int)] = words.map(one => {
(one, 1)
})
/**
* 根据key更状态,需要设置checkpoint来保存状态
* 默认key的状态在内存中有一份,在checkpoint目录中有一份
*
* 多久会将内存中的数据(每一个key多对应的状态)写入到磁盘一份呢?
* 如果batchInterval小于10s,那么10s会将内存中的数据写入到磁盘一份
* 如果batchInterval大于10s,那么就以batchInterval为准
*
* 目的:为了防止频繁的HDFS
* 设置checkpoint两种方式都可以
*/
ssc.checkpoint("D:/spark")
//ssc.sparkContext.setCheckpointDir("D:/spark")
/**
* currentValues:当前批次某个key对应所有的value组成的一个集合
* preValue:以往批次当前Key,对应的总状态值
*/
val result: DStream[(String, Int)] = pairsWords.updateStateByKey((currentValues: Seq[Int], preValue: Option[Int]) => {
var totalValues = 0
if (!preValue.isEmpty) {
totalValues += preValue.get
}
for (value <- currentValues) {
totalValues += value
}
Option(totalValues)
})
ssc.start()
ssc.awaitTermination()
//ssc.stop(true)会清空SparkContext对象
//ssc.stop(false)则不会清空对象
ssc.stop()
}
}
4 WindowOperator
import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream}
import org.apache.spark.streaming.{Durations, StreamingContext}
import org.apache.spark.{SparkConf, SparkContext}
object WindowOperator {
def main(args: Array[String]): Unit = {
val conf = new SparkConf()
conf.setMaster("local[2]")
conf.setAppName("UpdateStateByKey")
val sc = new SparkContext()
//new Streaming有两种方式,若使用第一种方式,则上方不需要再初始化SparkContext
//在JYM中已经创建了SparkContext
val ssc = new StreamingContext(conf, Durations.seconds(5))
ssc.sparkContext.setLogLevel("Error")
//val ssc = new StreamingContext(sc,Durations.seconds(5))
//可通过ssc.sparkContext获取到SparkContext的值
val lines: ReceiverInputDStream[String] = ssc.socketTextStream("hostname", 9000)
val words: DStream[String] = lines.flatMap(one => {
one.split(" ")
})
val pairsWords: DStream[(String, Int)] = words.map(one => {
(one, 1)
})
/**
* 窗口操作普通机制
*
* 滑动间隔和窗口长度必须是batchInterval整数倍
*/
/*val windowResult: DStream[(String, Int)] = pairsWords.reduceByKeyAndWindow((v1: Int, v2: Int) => {
v1 + v2
}, Durations.seconds(15), Durations.seconds(5))*/
val windowResult = pairsWords.reduceByKeyAndWindow((v1: Int, v2: Int) => {
v1 + v2
}, (v1: Int, v2: Int) => {
v1 - v2
}, Durations.seconds(15), Durations.seconds(5))
windowResult.print()
ssc.start()
ssc.awaitTermination()
//ssc.stop(true)会清空SparkContext对象
//ssc.stop(false)则不会清空对象
ssc.stop()
}
}
SparkStreaming算子操作,Output操作的更多相关文章
- 【SparkStreaming学习之二】 SparkStreaming算子操作
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...
- 58、Spark Streaming: DStream的output操作以及foreachRDD详解
一.output操作 1.output操作 DStream中的所有计算,都是由output操作触发的,比如print().如果没有任何output操作,那么,压根儿就不会执行定义的计算逻辑. 此外,即 ...
- 超级管理员登录后如果连续XX分钟没有操作再次操作需要重新登录
首先在设置session页面时 session_start(); session("name",$adminname); //加入session时间 time() session( ...
- swift语言之多线程操作和操作队列(下)———坚持51天吃掉大象(写技术文章)
欢迎有兴趣的朋友,参与我的美女同事发起的活动<51天吃掉大象>,该美女真的很疯狂,希望和大家一起坚持51天做一件事情,我加入这个队伍,希望坚持51天每天写一篇技术文章.关注她的微信公众号: ...
- C#DataTable 的一些操作经常操作
关于C# DataTable 的一些操作 经常操作DATATABLE 对于一些不需要再通过sql 来重复操作的 可以通过操作datatable来达到同样的效果 方法一: 也是广为人知的一种: Y ...
- [置顶] MongoDB 分布式操作——分片操作
MongoDB 分布式操作——分片操作 描述: 像其它分布式数据库一样,MongoDB同样支持分布式操作,且MongoDB将分布式已经集成到数据库中,其分布式体系如下图所示: 所谓的片,其实就是一个单 ...
- 第三章 JQuery: HelloWorld--常见方法--css--选择器--筛选器--属性--效果--事件--数组操作--字符串操作--对象转换
1.jQuery简介 为了简化JavaScript 的开发, 一些JavsScript 库诞生了. JavaScript库封装了很多预定义的对象和实用函数.能帮助使用者建立有高难度交互的页面, 并且兼 ...
- jQuery 选择器 筛选器 样式操作 文本操作 属性操作 文档处理 事件 动画效果 插件 each、data、Ajax
jQuery jQuery介绍 1.jQuery是一个轻量级的.兼容多浏览器的JavaScript库. 2.jQuery使用户能够更方便地处理HTML Document.Events.实现动画效果.方 ...
- python excel操作 练习-#操作单列 #操作A到C列 #操作1到3行 #指定一个范围遍历所有行和列 #获取所有行 #获取所有列
##操作单列#操作A到C列#操作1到3行#指定一个范围遍历所有行和列#获取所有行#获取所有列 #coding=utf-8 from openpyxl import Workbook wb=Workbo ...
随机推荐
- Daphile FAQ -- 官方文档译文 [原创]
Daphile FAQ 英文原文:https://www.daphile.com/download/FAQ.txt 采集日期:2021-01-03 常见问题解答:(FAQ) Q1:没有声音.Daphi ...
- 今天写了一个SSM小项目,运行之后,前端页面的CSS、js样式显示不出来,具体操作如下:
因为SSM中我们设置了拦截器,拦截器会拦截CSS和JS,所有样式渲染不出来,在Web.xml中写上 1 <servlet-mapping> 2 <servlet-name>de ...
- 强化学习 1 --- 马尔科夫决策过程详解(MDP)
强化学习 --- 马尔科夫决策过程(MDP) 1.强化学习介绍 强化学习任务通常使用马尔可夫决策过程(Markov Decision Process,简称MDP)来描述,具体而言:机器处在一个环境 ...
- Vue概述
Vue.js是一套构建用户界面的渐进式框架,采用自底向上增量开发的设计.Vue的核心库关注于视图(html),不仅易上手,还便于与第三方库或项目整合. 渐进式:一步一步,不是将所有的东西都学完才能使用 ...
- vue项目中使用日期获取今日,昨日,上周,下周,上个月,下个月的数据
今日公司项目接口要求获取动态的上周数据,经过不断的寻找,找到此方法. 该方法使用的是Moment.js JavaScript日期处理类库 一:安装依赖 npm install moment --sav ...
- ES6 for of循环, 可迭代接口,实现可迭代接口
在for of循环出现之前,for循环适合遍历普通的数组,for in循环比较适合遍历键值对,遍历数组对象的foreach方法,但是这些遍历 都有一定的局限性,所以在ES6之后引入了统一的遍历方式 f ...
- sparkStreaming实时数据处理的优化方面
1.并行度 在direct方式下,sparkStreaming的task数量是等于kafka的分区数,kakfa单个分区的一般吞吐量为10M/s 常规设计下:kafka的分区数一般为broken节点的 ...
- CentOS 7 网卡注释
TYPE=Ethernet # 网络类型为:EthernetPROXY_METHOD=none # 代理方式:关闭状态BROWSER_ONLY=no # 只是浏览器:否BOOTPROTO=static ...
- FastAPI学习: 个人博客的后端API
前言 学习FastAPI中把官方文档过了一遍,看了些大佬的文章,也借鉴(抄袭)了部分代码,写了一套个人博客的API,目前还比较简陋,统计的API基本没有,而且目前基本都停留在单表查询,所以含量不高,接 ...
- Go语言从入门到放弃(结构体常见的tag)
什么是tag Tag是结构体中某个字段别名, 可以定义多个, 空格分隔 type Student struct { Name string `ak:"av" bk:&quo ...