【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小时广告点击量实时统计

定义窗口,并将窗口内数据进行聚合