一、SparkStreaming算子操作

1.1 foreachRDD

output operation算子,必须对抽取出来的RDD执行action类算子,代码才能执行。

1.2 transform

transformation类算子

可以通过transform算子,对Dstream做RDD到RDD的任意操作。

1.3 updateStateByKey

  1. transformation算子

updateStateByKey作用:

  • 为SparkStreaming中每一个Key维护一份state状态,state类型可以是任意类型的,可以是一个自定义的对象,更新函数也可以是自定义的。
  • 通过更新函数对该key的状态不断更新,对于每个新的batch而言,SparkStreaming会在使用updateStateByKey的时候为已经存在的key进行state的状态更新。
  1. 使用到updateStateByKey要开启checkpoint机制和功能。
  2. 多久会将内存中的数据写入到磁盘一份?

如果batchInterval设置的时间小于10秒,那么10秒写入磁盘一份。如果batchInterval设置的时间大于10秒,那么就会batchInterval时间间隔写入磁盘一份。

1.4 操作窗口



假设每隔5s 1个batch,上图中窗口长度为15s,窗口滑动间隔10s。

  1. 窗口长度和滑动间隔必须是batchInterval的整数倍。如果不是整数倍会检测报错。
  2. 优化后的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中元数据包括:

  1. 创建应用程序的配置信息。
  2. DStream的操作逻辑。
  3. job中没有完成的批次数据,也就是job的执行进度。

三、Output操作

Output Meaning
print 打印每个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操作的更多相关文章

  1. 【SparkStreaming学习之二】 SparkStreaming算子操作

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...

  2. 58、Spark Streaming: DStream的output操作以及foreachRDD详解

    一.output操作 1.output操作 DStream中的所有计算,都是由output操作触发的,比如print().如果没有任何output操作,那么,压根儿就不会执行定义的计算逻辑. 此外,即 ...

  3. 超级管理员登录后如果连续XX分钟没有操作再次操作需要重新登录

    首先在设置session页面时 session_start(); session("name",$adminname); //加入session时间 time() session( ...

  4. swift语言之多线程操作和操作队列(下)———坚持51天吃掉大象(写技术文章)

    欢迎有兴趣的朋友,参与我的美女同事发起的活动<51天吃掉大象>,该美女真的很疯狂,希望和大家一起坚持51天做一件事情,我加入这个队伍,希望坚持51天每天写一篇技术文章.关注她的微信公众号: ...

  5. C#DataTable 的一些操作经常操作

    关于C# DataTable 的一些操作 经常操作DATATABLE  对于一些不需要再通过sql 来重复操作的   可以通过操作datatable来达到同样的效果 方法一: 也是广为人知的一种: Y ...

  6. [置顶] MongoDB 分布式操作——分片操作

    MongoDB 分布式操作——分片操作 描述: 像其它分布式数据库一样,MongoDB同样支持分布式操作,且MongoDB将分布式已经集成到数据库中,其分布式体系如下图所示: 所谓的片,其实就是一个单 ...

  7. 第三章 JQuery: HelloWorld--常见方法--css--选择器--筛选器--属性--效果--事件--数组操作--字符串操作--对象转换

    1.jQuery简介 为了简化JavaScript 的开发, 一些JavsScript 库诞生了. JavaScript库封装了很多预定义的对象和实用函数.能帮助使用者建立有高难度交互的页面, 并且兼 ...

  8. jQuery 选择器 筛选器 样式操作 文本操作 属性操作 文档处理 事件 动画效果 插件 each、data、Ajax

    jQuery jQuery介绍 1.jQuery是一个轻量级的.兼容多浏览器的JavaScript库. 2.jQuery使用户能够更方便地处理HTML Document.Events.实现动画效果.方 ...

  9. python excel操作 练习-#操作单列 #操作A到C列 #操作1到3行 #指定一个范围遍历所有行和列 #获取所有行 #获取所有列

    ##操作单列#操作A到C列#操作1到3行#指定一个范围遍历所有行和列#获取所有行#获取所有列 #coding=utf-8 from openpyxl import Workbook wb=Workbo ...

随机推荐

  1. Daphile FAQ -- 官方文档译文 [原创]

    Daphile FAQ 英文原文:https://www.daphile.com/download/FAQ.txt 采集日期:2021-01-03 常见问题解答:(FAQ) Q1:没有声音.Daphi ...

  2. 今天写了一个SSM小项目,运行之后,前端页面的CSS、js样式显示不出来,具体操作如下:

    因为SSM中我们设置了拦截器,拦截器会拦截CSS和JS,所有样式渲染不出来,在Web.xml中写上 1 <servlet-mapping> 2 <servlet-name>de ...

  3. 强化学习 1 --- 马尔科夫决策过程详解(MDP)

    强化学习 --- 马尔科夫决策过程(MDP) 1.强化学习介绍 ​ 强化学习任务通常使用马尔可夫决策过程(Markov Decision Process,简称MDP)来描述,具体而言:机器处在一个环境 ...

  4. Vue概述

    Vue.js是一套构建用户界面的渐进式框架,采用自底向上增量开发的设计.Vue的核心库关注于视图(html),不仅易上手,还便于与第三方库或项目整合. 渐进式:一步一步,不是将所有的东西都学完才能使用 ...

  5. vue项目中使用日期获取今日,昨日,上周,下周,上个月,下个月的数据

    今日公司项目接口要求获取动态的上周数据,经过不断的寻找,找到此方法. 该方法使用的是Moment.js JavaScript日期处理类库 一:安装依赖 npm install moment --sav ...

  6. ES6 for of循环, 可迭代接口,实现可迭代接口

    在for of循环出现之前,for循环适合遍历普通的数组,for in循环比较适合遍历键值对,遍历数组对象的foreach方法,但是这些遍历 都有一定的局限性,所以在ES6之后引入了统一的遍历方式 f ...

  7. sparkStreaming实时数据处理的优化方面

    1.并行度 在direct方式下,sparkStreaming的task数量是等于kafka的分区数,kakfa单个分区的一般吞吐量为10M/s 常规设计下:kafka的分区数一般为broken节点的 ...

  8. CentOS 7 网卡注释

    TYPE=Ethernet # 网络类型为:EthernetPROXY_METHOD=none # 代理方式:关闭状态BROWSER_ONLY=no # 只是浏览器:否BOOTPROTO=static ...

  9. FastAPI学习: 个人博客的后端API

    前言 学习FastAPI中把官方文档过了一遍,看了些大佬的文章,也借鉴(抄袭)了部分代码,写了一套个人博客的API,目前还比较简陋,统计的API基本没有,而且目前基本都停留在单表查询,所以含量不高,接 ...

  10. Go语言从入门到放弃(结构体常见的tag)

    什么是tag Tag是结构体中某个字段别名, 可以定义多个, 空格分隔 type Student struct {     Name string `ak:"av" bk:&quo ...