Spark Streaming——DStream Transformation操作
来源:互联网 发布:天谕萝莉捏脸数据小茗 编辑:程序博客网 时间:2024/06/13 23:06
Spark Streaming——DStream Transformation操作
Spark的各个子框架都是基于spark core的,Spark Streaming在内部的处理机制是,接收实时流的数据,并根据一定的时间间隔拆分成一批数据,然后通过Spark Engine处理这些批数据,最终得到处理后的一批结果数据。
对应的批数据,在spark内核对应一个RDD实例,因此,对应流数据的DStream可以看成是一组RDD,即RDD的一个序列。通俗点理解,在流数据分成一批批后,通过一个先入先出的队列,然后Spark Engine从该队列中依次取出一个个批数据,然后把批数据封装成一个RDD,然后进行处理,这是一个典型的生产消费者模型。
1 术语定义
- 离散流(discretized stream或DStream) : 这是Spark STreaming对内部持续的实时数据流的抽象描述,即我们处理的一个实时数据流,在spark Streaming中对应一个DStream实例
- 批数据(batch data) : 这是化整为零的第一步,将实时流数据以时间片为单位进行分批,将流处理转换为时间片数据的批处理。随着持续时间的推移,这些处理结果就形成了对应的结果数据流。
- 时间片或批处理时间间隔(batch interval) : 这是程序员对六数据进行定量的标准,以时间片作为我们拆分流数据的依据。一个时间片的数据对应一个RDD实例。
- 窗口长度(window length) : 一个窗口覆盖的六数据的时间长度。必须是批处理时间间隔的倍数。
- 滑动时间间隔 : 前一个窗口到后一个窗口所经过的时间长度。必须是批处理时间间隔的背书。
- Input DStream : 一个Dstream是一个特殊的DStream,将spark Streaming连接到一个外部数据源来读取数据
2 Dstream Transformation操作
2.1 函数说明
2.2 实例
//读取本地文件~/streaming文件夹val lines = ssc.textFileStream(args(0))val words = lines.flatMap(_.split(" "))val wordMap = words.map(x => (x, 1))val wordCounts=wordMap.reduceByKey(_ + _)val filteredWordCounts=wordCounts.filter(_._2>1)val numOfCount=filteredWordCounts.count()val countByValue=words.countByValue()val union=words.union(word1)val transform=words.transform(x=>x.map(x=>(x,1)))//显式原文件lines.print()//打印flatMap结果words.print()//打印map结果wordMap.print()//打印reduceByKey结果wordCounts.print()//打印filter结果filteredWordCounts.print()//打印count结果numOfCount.print()//打印countByValue结果countByValue.print()//打印union结果union.print()//打印transform结果transform.print()
执行结果如下:
-------------------------------------------lines.print()-------------------------------------------A B C DA B-------------------------------------------flatMap结果-------------------------------------------ABCDAB-------------------------------------------map结果-------------------------------------------(A,1)(B,1)(C,1)(D,1)(A,1)(B,1)-------------------------------------------reduceByKey结果-------------------------------------------(B,2)(D,1)(A,2)(C,1)-------------------------------------------filter结果-------------------------------------------(B,2)(A,2)-------------------------------------------count结果-------------------------------------------2-------------------------------------------countByValue结果-------------------------------------------(B,2)(D,1)(A,2)(C,1)-------------------------------------------union结果-------------------------------------------ABCDABABCD...-------------------------------------------transform结果-------------------------------------------(A,1)(B,1)(C,1)(D,1)(A,1)(B,1)
3 窗口转换操作
Spark streaming提供窗口操作(window option),如下图所示:
上图中,红色实线表示窗口当前的滑动位置,虚线表示前一次窗口位置,窗口每滑动一次,落在该窗口中的RDD被一起同时处理,生成一个窗口DStream(windowed DStream),窗口操作需要设置两个参数:
- 窗口长度(window length),即窗口的持续时间,上图中的窗口长度为3
- 滑动间隔(sliding interval),窗口操作执行的时间间隔,上图中的滑动间隔为2
这两个参数必须是原始DStream 批处理间隔(batch interval)的整数倍(上图中的原始DStream的batch interval为1)
3.1 函数说明
对于窗口操作,批处理间隔、窗口间隔和滑动间隔是非常重要的三个时间概念,是理解窗口操作的关键所在。
3.2 代码示例
// WindowWordCount——reduceByKeyAndWindow方法使用import org.apache.spark.{SparkContext, SparkConf}import org.apache.spark.storage.StorageLevelimport org.apache.spark.streaming._import org.apache.spark.streaming.StreamingContext._object WindowWordCount { def main(args: Array[String]) { //传入的参数为localhost 9999 30 10 if (args.length != 4) { System.err.println("Usage: WindowWorldCount <hostname> <port> <windowDuration> <slideDuration>") System.exit(1) } StreamingExamples.setStreamingLogLevels() val conf = new SparkConf().setAppName("WindowWordCount").setMaster("local[4]") val sc = new SparkContext(conf) // 创建StreamingContext,batch interval为5秒 val ssc = new StreamingContext(sc, Seconds(5)) //Socket为数据源 val lines = ssc.socketTextStream(args(0), args(1).toInt, StorageLevel.MEMORY_ONLY_SER) val words = lines.flatMap(_.split(" ")) // windows操作,对窗口中的单词进行计数 val wordCounts = words.map(x => (x , 1)).reduceByKeyAndWindow((a:Int,b:Int) => (a + b), Seconds(args(2).toInt), Seconds(args(3).toInt)) wordCounts.print() ssc.start() ssc.awaitTermination() }}
通过下列代码启动netcat server
root@sparkmaster:~# nc -lk 9999Spark is a fast and general cluster computing system for Big Data. It provides
执行结果如下:
-------------------------------------------Time: 1448778805000 ms(10秒,第一个滑动窗口时间)-------------------------------------------(provides,1)(is,1)(general,1)(Big,1)(fast,1)(cluster,1)(Data.,1)(computing,1)(Spark,1)(a,1)...-------------------------------------------Time: 1448778815000 ms(10秒后,第二个滑动窗口时间)-------------------------------------------(provides,1)(is,1)(general,1)(Big,1)(fast,1)(cluster,1)(Data.,1)(computing,1)(Spark,1)(a,1)...-------------------------------------------Time: 1448778825000 ms(10秒后,第三个滑动窗口时间)-------------------------------------------(provides,1)(is,1)(general,1)(Big,1)(fast,1)(cluster,1)(Data.,1)(computing,1)(Spark,1)(a,1)...-------------------------------------------Time: 1448778835000 ms(再经10秒后,超出window length窗口长度,不在计数范围内)--------------------------------------------------------------------------------------Time: 1448778845000 ms-------------------------------------------
4 输出操作
Spark Streaming允许DStream的数据被输出到外部系统,如数据库或文件系统。由于输出操作实际上使transformation操作后的数据可以通过外部系统被使用,同时输出操作触发所有DStream的transformation操作的实际执行(类似于RDD操作)。以下表列出了目前主要的输出操作:
参考博文
http://www.cnblogs.com/shishanyuan/p/4747735.html
https://yq.aliyun.com/articles/60316?spm=5176.8251999.569296.76.20f9f017kExcvc#
https://yq.aliyun.com/articles/60315?spm=5176.8251999.569296.77.20f9f017XgNbIM
- Spark Streaming——DStream Transformation操作
- Spark修炼之道(进阶篇)——Spark入门到精通:第十一节 Spark Streaming—— DStream Transformation操作
- Spark Streaming介绍,DStream,DStream相关操作(来自学习资料)
- Spark Streaming 实战案例(二) Transformation操作
- Spark修炼之道(进阶篇)——Spark入门到精通:第十二节 Spark Streaming—— DStream Window操作
- spark streaming 中对DStream 的两个操作
- Spark Streaming 实战案例(三) DStream Window操作
- 10.DStream的transformation操作概览
- Spark Streaming之二:DStream解析
- [spark streaming] DStream 和 DStreamGraph 解析
- 【Spark】RDD操作详解2——值型Transformation算子
- Spark总结(二)——RDD的Transformation操作
- 【Spark】RDD操作详解2——值型Transformation算子
- Spark Transformation —— coalesce
- Spark Transformation —— randomSplit
- Spark Transformation —— glom
- Spark Transformation —— union
- Spark Transformation —— intersection
- 传输数据库升级Oracle11.2.0.3到Oracle12.2
- HDU6208The Dominator of Strings 【AC自动机】
- 系统数据字典
- shell学习十四--编写监控mysql脚本
- 用户访问一个网站的过程描述
- Spark Streaming——DStream Transformation操作
- zuul 1.3.0 学习笔记
- Java--变量
- Java快捷键和命名规范
- 谈我的算法工程师校招经历
- 设计模式--工厂模式
- SpringBoot比较好的GitHub资源
- HDU
- android-java Error:(29, 37) 错误: 程序包org.apache.http.client.entity不存在