一、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. Future.get(并发之从任务中产生返回值)

    import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; import java ...

  2. 如何在Spring Boot项目中集成微信支付V3

    Payment Spring Boot 是微信支付V3的Java实现,仅仅依赖Spring内置的一些类库.配置简单方便,可以让开发者快速为Spring Boot应用接入微信支付. 演示例子: paym ...

  3. Adnc如何本地调试 - 一个轻量级的.Net Core微服务开发框架

    前言     Adnc是一个轻量级的.Net Core微服务开发框架,同样适用于单体架构系统的开发.     如果只是想本地调试,只需要安装必备软件,必备软件除开发工具外,其它软件建议大家都使用`do ...

  4. 最全Java面试题(一)

    一.基础篇 1.1 java基础 面向对象的特征:继承.封装和多态 final, finally, finalize 的区别 final用于声明属性.方法和类,分别表示属性不可变.方法不可覆盖.类不可 ...

  5. 执行py文件需要可执行权限吗?

    案例解析 这个问题描述起来有点违反直觉,要执行一个文件难道不应该需要可执行权限吗?让我们先来看一个例子: # module1.py def test(): print ('hello world!') ...

  6. java8 stream api流式编程

    java8自带常用的函数式接口 Predicate boolean test(T t) 传入一个参数返回boolean值 Consumer void accept(T t) 传入一个参数,无返回值 F ...

  7. 【Linux】rsync模板配置问题

    ------------------------------------------------------------------------------------------------- | ...

  8. 用其他主机docker login登录Harbor仓库报错

    做微服务的时候,我准备把编译好的jar包,部署到我的Harbor仓库上,却登录不上去,出现以下报错: [root@k8s-master ~]# docker login 192.168.30.24Us ...

  9. Chrome Performance性能分析面板使用

    最近做的项目都是内嵌egret游戏,想在移动端监测下它的性能,于是就开始了对Performance的探索: 一.使用 打开控制台,一顿操作: 网络选择Fast 3G,模拟手机普通3G环境,虽然现在大家 ...

  10. druid discard long time none received connection问题解析

    最新项目中用的druid连接数据库遇到一个困扰很久的问题 1 开始用的druid版本是1.1.22版本,由于业务需求,单个连接需要执行很久,理论上不需要用到自动回收,但为了安全,还是加了自动回收,时间 ...