【Spark】Day04-Spark Streaming:概述架构、入门、创建(队列、数据源)、转换(有状态、无状态)、DStream输出、进阶(累加和广播、SQL、持久化)、实战
一、概述
1、离线和实时计算
2、批量和流式处理
3、Spark Streaming介绍
处理一批流式数据,设置批处理间隔,实现汇总到一定量后再操作
批处理间隔决定提交频率和延迟,影响数据吞吐量和性能
使用了离散化流(discretized stream)称为DStreams,收到的由RDD组成的数据序列
4、Spark Streaming的特点
易用、容错、易整合到Spark体系
缺陷:微量批处理、延迟高
5、Spark Streaming架构
spark.streaming.receiver.maxRate可以限制接收速率,但会导致资源利用率下降
背压机制(即Spark Streaming Backpressure)可以根据作业执行信息动态调整数据Receiver接收率
spark.streaming.backpressure.enabled配置背压机制是否开启
二、DStream入门
1、WordCount案例实操
netcat工具向9999端口不断的发送数据nc -lk 9999
//对获取的一行数据进行扁平化操作
val flatMapDS: DStream[String] = socketDS.flatMap(_.split(" "))
2、解析
持续性的数据流和经过各种Spark算子操作后的结果数据流
一个SparkContext可以重用去创建多个StreamingContext, 前提是以前的StreamingContext已经停掉,并且SparkContext没有被停掉
三、DStream创建
1、RDD队列
使用ssc.queueStream(queueOfRDDs)来创建DStream
每一个RDD都被作为一个DStream
2、自定义数据源
继承Receiver,并实现onStart、onStop方法
实现监控某个端口号,获取该端口号内容
3、Kafka数据源
KafkaUtils对象可以在StreamingContext和JavaStreamingContext中以你的Kafka消息创建出 DStream。
四、DStream转换
操作分为分为Transformations(转换)和Output Operations(输出)
1、无状态转化操作
RDD转化操作应用到每个批次
转化DStream中的每一个RDD
Transform:RDD-RDD
2、有状态转化操作
UpdateStateByKey:将历史结果应用到当前批次,更新并保留状态,结果会是一个新的DStream
Window Operations(窗口操作):将计算应用到一个指定的窗口内的所有 RDD,需要两个参数,分别为窗口时长以及滑动步长。
五、DStream输出
1、常用输出操作
1)print()、2)saveAsTextFiles(prefix, [suffix])、3)saveAsObjectFiles(prefix, [suffix])、4)saveAsHadoopFiles(prefix, [suffix])、5)foreachRDD(func)
六、编程进阶
1、累加器和广播变量
同RDD
2、DataFrame and SQL Operations
须使用SparkContext来创建StreamingContext要用的SQLContext
3、Caching / Persistence:将RDD保存到内存中
七、Spark Streaming项目实战
1、准备
用户对广告点击的行为数据
模拟生成数据并从kafka中读取数据
2、每天每地区热门广告Top3
原始数据结构转化,并进行批次累加
3、最近1小时广告点击量实时统计
定义窗口,并将窗口内数据进行聚合