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 ...
随机推荐
- Java基础经典案例
案例列表 01减肥计划switch版本 02减肥计划if版本 03逢七跳过 04不死神兔 05百钱白鸡 06数组元素求和 07判断两个数组是否相同 08查找元素在数组中的索引 09数组元素反转 10评 ...
- 「每日一题」有人上次在dy面试,面试官问我:vue数据绑定的实现原理。你说我该如何回答?
关注「松宝写代码」,精选好文,每日一题 时间永远是自己的 每分每秒也都是为自己的将来铺垫和增值 作者:saucxs | songEagle 来源:原创 一.前言 文章首发在「松宝写代码」 2020. ...
- 中移动ipv6-老毛子固件获取ipv6设置
对于有ipv6的服务商原理上可以参照下图
- CODING x 腾讯兔小巢,打破研发团队与用户反馈的最后一道壁垒
任何产品的更新迭代都离不开用户的使用反馈.产品经理日常需要奔走到一线部门了解用户的使用反馈:一线运营或业务团队日常需要向产品经理转述用户的问题场景及催促需求的进度.中间需要消耗大量的精力来进行信息转达 ...
- python模块详解 | psutil
目录 psutil 简介 psutil的功能函数 cpu memory_内存 disk_磁盘 net_网络 pid_进程管理 sensors_传感器 其他(用户,启动时间) psutil简介 psut ...
- .NET 5网络操作的改进
随着.net 5在11月的发布,现在是谈论网络栈中许多改进的好时机.这包括对HTTP.套接字.与网络相关的安全性和其他网络通信的改进.在这篇文章中,我将重点介绍一些版本中更有影响力和更有趣的变化. H ...
- (十六)re模块
正则表达式并不是Python的一部分,本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言.正则表达式是用于处理字符串的强大工具,很多编程语言都支持正则表达式的语法. 字符匹配分为普通字 ...
- 【Web】HTML入门小结
文章目录 HTML? HTML 初识元素/标签 HTML语义化标签 标题 段落 font HTMl链接 HTML图像 HTML列表 HTML div HTML 块级元素与行内元素 HTML常用带格式作 ...
- 【Linux】make编译的小技巧
------------------------------------------------------------------------------------------------- | ...
- 【Oracle】想查询相关的v$视图,但是提示表或视图不存在解决办法
原因是使用的用户没有相关的查询权限导致 解决办法: grant select any dictionary to 用户; --这个权限比较大 这个权限是最低的要求,但是可以访问到v$相关视图 ...