上一篇 

Spark Structured Streaming系列-输入源详解

概述

 

        Structured Streaming组件滑动窗口功能由三个参数决定其功能:窗口时间、滑动步长和触发时间.

  • 窗口时间:是指确定数据操作的长度;

  • 滑动步长:是指窗口每次向前移动的时间长度;

  • 触发时间:是指Structured Streaming将数据写入外部DataStreamWriter的时间间隔。

     

Spark Structured Streaming系列-窗口管理详解_shuju

API

  用户管理Structured Streaming的窗口功能,可以分为两步完成:

1) 定义窗口和滑动步长

  API是通过一个全局的window方法来设置,如下所示是其Spark实现细节:

  •  
def window(timeColumn:Column, windowDuratiion:String, slideDuration:String):Column ={window(timeColumn, windowDuration, slideDuration, "0" second)}
  • timecolumn:具有时间戳的列;

  • windowDuration:为窗口的时间长度;

  • slideDuration:为滑动的步长;

  • return:返回的数据类型是Column

设置

Structured Streaming在通过readStream对象的load方法加载数据后,会返回一个DataFrame/DataSet对象(Dataset[T]类型)。所以用户将上述定义的Column对象传递给DataFrame对象,从而就实现了窗口功能的设置。

由于window方法返回的数据类型是Column,所以只要DataFrame对象方法中具有columnl类型的参数就可以进行设置。如Dataset的select和groupBy方法。如下是Spark源码中select和groupBy方法的实现细节:

  •  
def select (cols:Column*):DataFrame = withPlan{Project(cols.map(_.named),logicalPlan)}def groupBy(cols:Column*):RelationGroupedDataset={RelationGroupedDataset(toDF(), cols.map(_.expr), RelationGroupedDataset.GroupByType)}

窗口操作返回DataSet返回窗口开始、结束时间方式:

  •  
select collect_list(k),window(timestamp,"20 seconds").start as start,window(timestamp,"20 seconds").end as endfrom table21 group by window(timestamp,"20 seconds")as table22;

类型

  如上述介绍的Structured Streaming API,根据Dataset提供的方法,我们可以将其分为两类:

  1. 聚合操作:是指具有对数据进行组合操作的方法,如groupBy方法;

  2. 非聚合操作:是指普通的数据操作方法,如select方法

PS:

    两类操作都有明确的输出形式(outputMode),不能混用。

聚合操作

操作方法

  聚合操作是指接收到的数据DataFrame先进行groupBy等操作,器操作的特征是返回RelationGroupedDataset类型的数据。若Structured Streaming存在的聚合操作,那么输出形式必须为"complete",否则程序会出现异常。

如下所示的聚合操作示例:

  •  
import spark.implicits._val words = ... // streaming DataFrame of schema { timestamp: Timestamp, word: String }// Group the data by window and word and compute the count of each groupval windowedCounts = words.groupBy(  window($"timestamp", "10 minutes", "5 minutes"),  $"word").count()

该段代码用于用于统计每10分钟内,接受到的不同词的个数,其中window($”timestamp”, “10 minutes”, “5 minutes”)的含义为:假设初始时间 t=12:00,定义时间窗口为10分钟,每5分钟窗口滑动一次,也就是每5分钟对大小为10分钟的时间窗口进行一次聚合操作,并且聚合操作完成后,窗口向前滑动5分钟,产生新的窗口,如上图的一些列窗口 12:00-12:10,12:05-12:15,12:10-12:20。

非聚合操作

操作方法

非聚合操作是指接收到的数据DataFrame进行select等操作,其操作的特征是返回Dataset类型的数据。若Structured Streaming进行非聚合操作,那么输出形式必须为"append",否则程序会出现异常。若spark 2.1.1 版本则输出形式开可以是"update"。

Watermarking

Watermarking表示多长时间以前的数据将不再更新,也就是说每次窗口滑动之前会进行Watermarking的计算,首先统计这次聚合操作返回的最大事件时间,然后减去所然忍受的延迟时间就是Watermarking,当一组数据或新接收的数据事件时间小于Watermarking时,则该数据不会更新,在内存中就不会维护该组数据的状态