当前课程知识点:大数据平台核心技术 >  第五讲 离线分布式关系型计算 >  关系型计算基本原理_2 >  关系型计算基本原理_2(主讲人:王鹏飞)

返回《大数据平台核心技术》慕课在线视频课程列表

关系型计算基本原理_2(主讲人:王鹏飞)在线视频

关系型计算基本原理_2(主讲人:王鹏飞)

下一节:分布式环境中的连接计算和聚合计算(主讲人:王鹏飞)

返回《大数据平台核心技术》慕课在线视频列表

关系型计算基本原理_2(主讲人:王鹏飞)课程教案、知识点、字幕

前面我们分别介绍了

关系型计算最常用的几种操作

实际上这些操作总是

被组织在一起

来完成比较复杂的逻辑

被组织起来的操作

构成了操作序列

可以被简单的理解成

逻辑查询计划

比如老板说

给我各个不同年龄段

不同性别的用户

在各个类目的消费总额的统计

然后他不需要消费总额

少于一万块的

然后我们在处理

这件事情过程当中

我们可以倒着来

首先我们假设我们已经把

项统计出来了

但是我们要横向切出来

大于一万块的项目

然后我们再看怎么去

统计出消费总额来

统计消费总额这是需要聚合的

因为老板提到说

要按照不同年龄段

不同性别的用户

在类目下的这个统计

所以我们很自然想到说

要按照年龄段性别类目

聚合出消费总额

但是我们想聚合出

消费总额需要统计Orders表

当中的信息

我们想按照年龄段和性别

来统计我们需要Users表

当中的信息

所以我们需要把Users表

和Orders表连接起来

连接的条件Users表的ID

等于Orders表的UserID

但是对于Users表和Orders表

我们并不需要它们所有的列

所以我们可以纵向的切

从Users表中切出

ID Age Gender

纵向切Orders表

切出来UserID

Cost和Category

这样就形成了这么一张

逻辑的查询计划

我们在推倒这张

逻辑查询计划的过程当中

我们是从后向前推

然后这个看大家习惯于

如何去想这件事情

在上一页大家看到

我们如何去生成了这么一张

逻辑的查询计划

实际上逻辑查询计划

它有特定的这个表达方式

最典型的是用SQL

SQL从几十年前

一直发展到现在

它是一种非常成熟的描述方法

它提供了各样的

语法糖和语义糖

比如同样对于

上页的这个需求

那么我们写成SQL

是这个样子的

而如果我们直译上页提到的

查询计划那么它是

这么一条语句

大家可以看一下

但是因为SQL

它提供了语法糖

我们可以把这条语义写的

更简单一些

对于一条SQL它实际上

有特定的这个计算顺序

如果不了解这些计算顺序的话

我们写出来的SQL

很可能是错误的

SQL的计算顺序

大家可以看一下

PPT上列出来的网址

对于下图所示的SQL

它的计算顺序是这样的

首先计算form子句

对于本例来说它是连接

Users u inner join

Orders o on u.ID=o.UserID

计算完form子句之后

它会去计算where子句

当然这里并没有where子句

所以这步省略

where子句对应的是横向切

然后它去计算聚合

聚合的计算步骤是这样

首先按照group by子句

指定的方式对数据集进行分组

在本例中group by子句是

getage group u.age

u.Gender和o.cangup(音09:20)

分别是从用户的年龄

计算出年龄段

从用户的性别和

Orders表的类目

然后为每一组数据

计算出一个聚合结果

这个聚合结果从本例当中

是sum cost

聚合的输出是group by子句

当中的每一项和

聚合函数的计算结果

然后它会处理HAVIN子句

HAVIN SUM cost>10000

然后会生成select list

select list当中是根据

用户的年龄去计算

用户的年龄段

用户的性别 类目

和总的开销

大家可以看到这些数据

都是固定的

如果HAVIN子句当中

使用了SQL列表

当中的TotalCost是错误的

原因是在处理

HAVIN子句的时候

select列表还没有生成

逻辑查询计划

描述的还只是要完成

什么样的计算

并不是如何完成这些计算

描述如何完成这些计算的

查询计划我们称之为

物理查询计划

物理查询计划的生成

有非常多的外部条件

会影响它

比如数据分布

执行引擎的特性 状态

逻辑查询计划的计算逻辑等等

下面是一些例子

大家可以听一听

比如算法选择

对于连接来说我们有三种

不同的算法

Hashjoin Mergejoin

和Nestedloop

这三种不同的算法

它们分别应用在

不同的数据场景下

比如说完全无序的

两个数据集

但是一个非常大一个很小

这个时候可能

Hashjoin是合适的

如果两个数据集都很大

但是数据已经有序

那么我们用Mergejoin

是更有效的

如果是一个比较大

而另外一个比较小的

这个数据集做连接

但是大表已经排序

那么我们用Nestedloop

会更有效一些

然后我们还会去选择

不同的计算顺序

比如

A B C D四张表去做连接

因为它全部都是inner join

我们可以自由的改变

它们的顺序

那么它们中间的

结果集的大小

严重的影响计算的效率

如果A和C生成的结果集

要远远小于A和B

生成的结果集的话

那么先去做A和C的连接

往往会好一些

所以我们有时候会把

A B C D的连接

改成A C B D这样的顺序

在传统的关系型数据库上

Users表和Orders表上

有没有索引

有什么样的索引

就意味着说

我们在获取数据的时候

我们有可能获取到

什么样的有序数据

按照什么去分块

这都会影响

这个计算逻辑的选择

在分布式系统当中

Users表和Orders表的

存储特点是什么

数据量分别有多大

比如Users表很

可能只有几兆大

Orders表很可能有几T

然后这个时候

我们在选择连接算法的时候

会天然的去选择Hashjoin

如果Orders表它已经

按照UserID去存储了

那么它们在连接的时候

我们可以采用更高效的

Hashjoin的这个算法

而不是把Users表

完全的拷贝一遍

在分布式系统当中

因为他需要把一个

复杂的多机问题

变成单机问题去

分而治之的去处理

所以我们一般情况下

会需要在整个集群上

把要计算的数据

重新分布一遍

这个分布的过程

我们称之为Shuffle

那么需要Shuffle吗

然后我们来Shuffle谁

然后如何Shuffle

这都是很有讲究的

这个后面我们会详细的提到

有时候我们还会关心

系统的负载状况

如果当前系统它的CPU

使用率只有10%

内存的使用率只有50%

那么我们应该优化吞吐量

还是应该优化执行时间

这个毫无疑问

在这种情况下

我们会优化执行时间

因为系统的空闲资源比较多

但是在系统CPU使用

占到80%以上的时候

这个时候我们会

倾向于优化吞吐量

这个时候一条SQL

它的单独的执行时间都会拉长

但是我们会减少额外的开销

如果执行引擎

它是基于文件系统的

那么它处理非常大型的查询

是很有效的

比如说一张三个T的纬度表

和一张十个T的日制表

去做连接

因为基于内存的

计算引擎是没办法

处理这么大的数据

我们没有其他的选择

如果他面临的数据规模比较少

比如说只有几个G的数据

在做连接

那么我们一般情况下

使用内存和网络的方式就OK了

这会极大的提升

单条查询的执行速度

然后我们还需要看一看

作业调度系统有哪些特性

比如说它会不会为了feaover(音14:43)

去做一些bake after instnes(音)

像这样的特性都会影响

物理查询计划的生成

这是我们前面提到的例子

蓝色的是逻辑执行计划

棕色的是物理执行计划

大家可以看到

物理执行计划比逻辑执行计划

多了非常多的内容

我们从前往后来说

对Users表和Orders

分别有一个按TableScan

然后在做连接之前

因为连接

我们的算法选择的是Mergejoin

所以我们需要

把数据按照ID和UserID

分别去做shuffle和sort

具体的连接算法

我们会在下次课程当中介绍

这次大家先看一个样子

在集群上重新分布数据

我们一般情况下会通过

一个叫做shuffleWrite和

shuffleRead的

opert(音15:41)对

然后聚合

我们实际上

在集群上也会分成两步

第一步会做本地聚合

我们用的是har7哈希(音)算法

大家在物理查询计划当中

可以看到一个叫做

HashAggregate的算子

然后在第二步

我们会通过排序算法

大家可以看到

图上有一个叫做

StreamedAggregate的算子

最后横向切

留下消费总额

大于一千块的行

这是通过一个

简单的failover

去完成的

关系型计算实际上

我们运气很好

它本身的计算都不需要迭代

然后它的计算总是可以

拆分到独立的

互相隔离的计算节点上

去并行执行

这个后面我会在讲解

连接和聚合的时候给大家提到

现在大家脑子里面

只要有这么一个概念就可以

根据算法不同的要求

数据可能会需要在集群当中

重新Shuffle和重新sort

实际上用到很多计算机

构成的集群的计算

Shuffle和Sort是计算核心

数据在什么地方

以什么方式存在

集群当中每台

计算机的负载状况

对于计算的开销的预期

包括CPU 内存 IO等等

计算结果的输出方式

这些东西都会影响

集群作业调度系统

如何去调度这些作业

实际上除了这些方面之外

还会有一些其它的

比如说集群当中的网络top

但是这些超出了

本次讲解的范围

大家可以去网络上

找一找相关的这些论文

为了简单起见

我们本次讲解

只考虑数据量一个维度

换句话说我们只考虑IO

并且假设计算是在

独显没有冲突的离线

计算引擎上去执行的

然后计算机内存是有限的

我们使用的服务器一般情况下

它的内存在96G

或者128G

它不会无穷大

但是磁盘

我们可以认为是无穷大的

大数据平台核心技术课程列表:

第一讲 大数据和ODPS

-主讲人:武永卫

--大数据处理平台概述(主讲人:武永卫)

-主讲人:程永

--大数据平台ODPS(主讲人:程永)

-QUIZ--作业

第二讲 分布式存储

-大纲

--大纲(主讲人:姚文辉)

-初步认识大数据对分布式存储系统的需求

--初步认识大数据对分布式存储系统的需求

-理解大数据对分布式存储系统的需求

--理解大数据对分布式存储系统的需求(主讲人:姚文辉)

-具体说明大数据对分布式存储系统的需求

--具体说明大数据对分布式存储系统的需求(主讲人:姚文辉)

-大规模分布式存储的挑战

--大规模分布式存储的挑战(主讲人:姚文辉)

-小概率事件-Raid卡故障

--小概率事件-Raid卡故障(主讲人:姚文辉)

-分布式存储系统举例

--分布式存储系统举例(主讲人:姚文辉)

-分布式存储系统重要功能设计要点剖析

--分布式存储系统重要功能设计要点剖析(主讲人:姚文辉)

-链式写正常流程

--链式写正常流程(主讲人:姚文辉)

-写流程的另一种常见方式:主从模式

--写流程的另一种常见方式:主从模式(主讲人:姚文辉)

-链式写异常流程

--链式写异常流程(主讲人:姚文辉)

-写异常处理的另一种方法-Seal and New

--写异常处理的另一种方法-Seal and New(主讲人:姚文辉)

-读正常流程

--读正常流程(主讲人:姚文辉)

-读流程优化-BackupRead

--读流程优化-BackupRead(主讲人:姚文辉)

-IO QoS

--IO QoS(主讲人:姚文辉)

-数据正确性:checksum

--数据正确性:checksum(主讲人:姚文辉)

-数据可靠性-Replication

--数据可靠性-Replication(主讲人:姚文辉)

-数据均衡-Rebalance

--数据均衡-Rebalance(主讲人:姚文辉)

-垃圾回收-Garbage collection

--垃圾回收-Garbage collection(主讲人:姚文辉)

-Erasure coding

--Erasure coding(主讲人:姚文辉)

-Erasure coding(3,2)写入和读取过程

--Erasure coding(3,2)写入和读取过程(主讲人:姚文辉)

-元数据管理的高可用性和可扩展性

--元数据管理的高可用性和可扩展性(主讲人:姚文辉)

-元数据管理的高可用性

--元数据管理的高可用性(主讲人:姚文辉)

-Paxos概要

--Paxos概要(主讲人:姚文辉)

-Raft

--Raft(主讲人:姚文辉)

-元数据管理的可扩展性

--元数据管理的可扩展性(主讲人:姚文辉)

-不同存储介质的特性

--不同存储介质的特性(主讲人:姚文辉)

-盘古混合存储

--盘古混合存储(主讲人:姚文辉)

-QUIZ--作业

第三讲 资源管理与任务调度

-阿里云飞天分布式调度

--阿里云飞天分布式调度(主讲人:陶阳宇)

-任务调度

--任务调度(主讲人:陶阳宇)

-资源调度

--资源调度(主讲人:陶阳宇)

-容错机制

--容错机制(主讲人:陶阳宇)

-规模挑战

--规模挑战 (主讲人:陶阳宇)

-安全域性能隔离

--安全域性能隔离(主讲人:陶阳宇)

-分布式调度的发展方向

--分布式调度的发展方向(主讲人:陶阳宇)

-QUIZ--作业

第四讲 分布式编程模型的设计与演化

-数据格式和抽象

--数据格式和抽象(主讲人:吴威)

-分布式编程模型

--分布式编程模型(主讲人:吴威)

-MapReuduce编程模型

--MapReuduce编程模型(主讲人:吴威)

-关系型数据编程模型

--关系型数据编程模型(主讲人:吴威)

-分布式图计算模型

--分布式图计算模型(主讲人:吴威)

-分布式编程未来展望

--分布式编程未来展望(主讲人:吴威)

-QUIZ--作业

实践1:通过两阶段提交协议完成数据上传

-分布式事务

--分布式事务 (主讲人:冯骁)

-分布式一致性算法

--分布式一致性算法(主讲人:冯骁)

-两阶段提交与三阶段提交

--两阶段提交与三阶段提交(主讲人:冯骁)

-实践--介绍

--实践--介绍(主讲人:冯骁)

第五讲 离线分布式关系型计算

-关系型计算基本原理_1

--离线分布式关系型计算_1(主讲人:王鹏飞)

-关系型计算基本原理_2

--关系型计算基本原理_2(主讲人:王鹏飞)

-分布式环境中的连接计算和聚合计算

--分布式环境中的连接计算和聚合计算(主讲人:王鹏飞)

-其他计算和物理优化

--其他计算和物理优化(主讲人:王鹏飞)

-QUIZ--作业

第六讲 全局数据管理与调度

-提纲

--提纲(主讲人:罗李)

-课程背景介绍

--课程背景介绍(主讲人:罗李)

-前序知识

--前序知识(主讲人:罗李)

-分布式节点距离计算法则

--分布式节点距离计算法则(主讲人:罗李)

-数据分布策略

--数据分布策略(主讲人:罗李)

-分布式计算调度

--分布式计算调度(主讲人:罗李)

-数据就近原则计算如何容错

--数据就近原则计算如何容错(主讲人:罗李)

-ODPS跨集群数据依赖

--ODPS跨集群数据依赖(主讲人:罗李)

-QUIZ--作业

实践2:编写MR完成Group By+Join操作

-主讲人:谢德军

--实践2:编写MR完成Group By+Join操作(主讲人:谢德军)

第七讲 流式计算的系统设计与实现

-增量计算和流式计算

--流式计算的系统设计与实现(主讲人:强琦)

-与批量计算的区别

--与批量计算的区别(主讲人:强琦)

-业界典型系统技术概要分析

--业界典型系统技术概要分析(主讲人:强琦)

-核心技术

--核心技术(主讲人:强琦)

-消息机制

--消息机制(主讲人:强琦)

-有状态计算、并行DAG、抢占式调度和资源隔离、Failover机制

--有状态计算、并行DAG、抢占式调度和资源隔离、Failover机制(主讲人:强琦)

-StreamSQL

--StreamSQL(主讲人:强琦)

-QUIZ--作业

第八讲 内存计算

-软硬件趋势、分布式计算简史与内存计算

--软硬件趋势、分布式计算简史与内存计算(主讲人:强琦)

-分布式计算

--分布式计算(主讲人:强琦)

-内存计算

--内存计算(主讲人:强琦)

-统一的计算框架

--统一的计算框架(主讲人:强琦)

-业界经典系统技术分析-spark&flink

--业界经典系统技术分析-spark&flink(主讲人:强琦)

-QUIZ--作业

第九讲 大规模数据的分布式机器学习平台

-主讲人:褚葳

--大规模数据的分布式机器学习平台(主讲人:褚葳)

-QUIZ--作业

实践3:实现MapReduce编程运行时库

-分布式环境下的新问题

--分布式环境下的新问题(主讲人:徐冬)

-工程实现范例

--工程实现范例(主讲人:徐冬)

-课程设计相关问题

--课程设计相关问题(主讲人:徐冬)

关系型计算基本原理_2(主讲人:王鹏飞)笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。