干货 | Streaming SQL 的基础

本文来自于 QCon London 2018,分享者来自 Google 的软件开发工程师 Tyler Akidau,其是 Streaming 101 和 Streaming 102 两篇文章的作者。Apache Beam PMC。


在 SQL中执行流式查询意味着什么?流式查询与经典关系查询有什么关系?流和表是相同的东西吗?所有这些与我们都熟悉的程序框架有什么关系?


本文 PPT 下载地址:http://cdn.iteblog.com/ppt/Foundations_of_streaming_SQL_[QCon_London_2018].pptx

https://www.iteblog.com/ppt/Foundations_of_streaming_SQL_[QCon_London_2018].pptx

https://docs.google.com/presentation/d/1wehFa-cDNYjAtkzZLVMu0exo_NUMAYymFf7ipfiVIoc/present?slide=id.g1e086be6ff_0_661(需要梯子)

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

借助于流表二象性来理解流与表的相对性:

  • streams -> tables:一个关于变更的数据流随着时间聚集产生了一个数据表;

  • tables->streams:对一个表的变更的观察,伴随着时间的变化产生了一个数据流(observation这一过程,体现了离散的概念);

640?wx_fmt=png

非相对论的流&表定义:

  • 表是静态的数据

  • 流是动态的数据

640?wx_fmt=png

640?wx_fmt=png

Beam的模型:抽象出数据处理的四个核心问题(要素);

  • what: 计算得到什么结果?选择算子和思考算子计算逻辑的过程;

  • where: 对于事件时间而言,在哪里进行计算?窗口

  • when: 什么时候触发结果输出?触发计算,输出结果

  • how: 如何细化结果相关性?提前累加/计算

640?wx_fmt=png

在Beam模型中,使得流和表如何变得更协调:

  • 批处理如何适配所有的这些语义/概念;

  • 流跟有界的和无界的数据集是什么关系;

  • 上页的四个问题如何映射到流/表的体系中?

640?wx_fmt=png

从MapReduce入手,抽象来看,是一个从输入->Map运算->Reduce运算->输出的过程;

640?wx_fmt=png

Map/Reduce两个算子,细分一下每一个都会经历:读->计算->写的过程,图中的箭头,其实也不是一个具体的东西,它只是代表了数据的流向或者数据交换。下一页我们将会看到~

640?wx_fmt=png

数据的流动、交换也是一种抽象,接下来将会经历一个具体化的过程。

640?wx_fmt=png

先确定计算模型整体的输入和输出,按照之前对流/表的定义,其可以被先被确定为表(表是静态的数据)

640?wx_fmt=png

接下来,把Map/Reduce阶段拆开来看,先看Map阶段。

640?wx_fmt=png

以下是一个map算子提供的接口,UDF需要实现它,它可以被拆分为两个部分。

640?wx_fmt=png

下图中高亮为黄色的两个参数,体现了MapRead输出数据的方式,它是一条条离散的记录,因此视为流(见下图)。

640?wx_fmt=png

640?wx_fmt=png

而经过了Map运算之后,将会输出一个新的键值对:K2,V2,它输出给MapWrite的方式仍然是独立的数据记录,因此仍然可视为流(见下图)

640?wx_fmt=png

由于ReduceReduce的输入来自于MapWrite的输出,因此这里也存在着数据交换

640?wx_fmt=png

从两者的API可以看到,map的输出是流,而reduce的输入,其值对应的是一个集合,那么这里便存在着一个聚集(汇聚)的过程,因此Map阶段的整体输出可视为一个表(见下图)。

640?wx_fmt=png

640?wx_fmt=png

整个MapReduce计算模型中,Map阶段都已确定,下面来确定一下Reduce阶段。

640?wx_fmt=png

ReduceRead读取的是一个具体的键,及其对应的值集合,然后传递给Reduce算子进行运算,最终输出一个单值的结果,这中间伴随着数据的流动,可视为流。

640?wx_fmt=png

640?wx_fmt=png

到此,整个MapReduce计算各个部分的数据交换形式如下图:

640?wx_fmt=png

接下来,我们来回答在Beam模型中,流/表如何融合的问题,第一个问题是批处理如何适配这些概念:

  • 表中的数据被读取,形成数据的流动,也就形成了数据流;

  • 流被处理(各种算子)形成新的流,直到发生了一个分组运算(分组运算的属性就是聚集)

  • 分组会将离散的数据汇聚起来,从而使其变成了静态数据,变成了表

  • 接着就是1-3步的重复,直到计算完成

640?wx_fmt=png

回答第二个问题:关于流跟有界数据集和无界数据集的关系:

流是数据的一种动态的形式,对有界和无界数据集都是如此。

这里注意跟以前的一些既有观念进行区分:之前的很多观念人为,流处理的是无界数据集,而批处理主要应用于有界数据集;

640?wx_fmt=png

如何映射这四个问题?

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

想得到怎样的计算结果来选择算子,并填充算子的计算逻辑

640?wx_fmt=png

这个图其实是个动画,建议去web页面上看一下,更能理解这一点。

640?wx_fmt=png

640?wx_fmt=png

对于事件时间而言,在哪里进行计算以得到结果,这了如果是进行聚合计算,则通常需要引入窗口。

640?wx_fmt=png

定义了一个2分钟的翻滚窗口,这就是where

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

在处理时间中,什么时候进行(触发)计算,因为计算依赖于计算框架,所以其触发的时间参考是处理时间。什么时候,涉及到触发器控制结果的输出,对于事件时间还关联到Watermark

640?wx_fmt=png

在框架中指定when语义

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

如何细化结果相关?注意这里为了演示,对when的API调用进行了调整,这里的how产生的结果就是提早聚集触发~

640?wx_fmt=png

640?wx_fmt=png

这四个问题,其实体现了计算模型的演讲过程。

640?wx_fmt=png

640?wx_fmt=png

关于流/表相关性的通用原理:

管道:表+流+运算

表:静态的数据

流:动态的数据

运算:(流|表)->(流|表)的转换

  • 流->流:非分组的(元素级别)的运算;

  • 流->表:分组运算,使得流动的数据变成静态的,从而产生一个表,窗口是一种时间维度上的分组;

  • 表->流:去分组(触发计算)式的运算,将表数据转化为移动的数据,从而产生一个数据流;

  • 表->表:不可能发生,因为从静态数据到静态数据的转变不可能没有数据的动态移动;

640?wx_fmt=png

Streaming SQL

640?wx_fmt=png

关系代数

640?wx_fmt=png

关系随着时间的演进

640?wx_fmt=png

传统的SQL和Streaming 

640?wx_fmt=png

640?wx_fmt=png

注意这里两者的区别,传统的观点是一个时间点的查询,而流式SQL中是一个时间区间的演进;

640?wx_fmt=png

关系代数的封闭性保留了完整的基于时间演进的关系。

640?wx_fmt=png

640?wx_fmt=png

带添加name筛选条件,在之前的每个时间区间中,名为"Frank"的记录都被移除了。

640?wx_fmt=png

分组聚合操作,在每个时间段中,结果集的变化

640?wx_fmt=png

接下来将展示基于时间演进的SQL跟流与表的关系;

640?wx_fmt=png

普通的查询并没有什么特别的

640?wx_fmt=png

但是下图中,当指定了`AS OF SYSTEM TIME‘’`时,则可以查询之前时间段的内容,这体现了时间演进的过程(它得到的是一个点的结果,但是能查询之前某个时间点的结果,体现了时间演进时每个点结果得以保存的过程),而不是传统SQL中只保留当前时间点截止所演进的结果。

640?wx_fmt=png

这依然是一个动画的展示,展示了12:00发起的一个流式SQL(SELECT后面跟了STREAM关键字),查询结果演进的过程;

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

表:捕获的是关系随着时间演进过程中某个时间点的快照(结果)

流:捕获的是关系随着时间演进过程中的进化(过程)

640?wx_fmt=png

640?wx_fmt=png

什么时候你需要SQL基于流式的扩展呢?

作为一个表:SQL的扩展几乎不需要,因为它代表着静态的数据;

作为一个流:SQL扩展有时需要

640?wx_fmt=png

什么时候需要?

  • 显式的表/流查询;

  • 默认的表/流查询(任何输入时流,那么输出也是一个流,此时会需要)

  • 时间戳和窗口(事件时间相关的列)

  • 一些触发器的SQL形式的表达

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png


猜你喜欢

欢迎关注本公众号:iteblog_hadoop:

0、回复 电子书 获取 本站所有可下载的电子书

1、Apache Spark 统一内存管理模型详解

2、HDFS 副本存放磁盘选择策略详解

3、盘点2017年晋升为Apache TLP的大数据相关项目

4、干货 | 深入理解 Spark Structured Streaming

5、Apache Spark 黑名单(Blacklist)机制介绍

6、Kafka分区分配策略(Partition Assignment Strategy)

7、Spark SQL 你需要知道的十件事

8、干货 | Apache Spark 2.0 作业优化技巧

9、[干货]大规模数据处理的演变(2003-2017)

10、干货 | 如何使用功能强大的 Apache Flink SQL

11、更多大数据文章欢迎访问https://www.iteblog.com及本公众号(iteblog_hadoop) 12、Flink中文文档:http://flink.iteblog.com 13、Carbondata 中文文档http://carbondata.iteblog.com

640?wx_fmt=png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值