当前课程知识点:大数据平台核心技术 >  第五讲 离线分布式关系型计算 >  其他计算和物理优化 >  其他计算和物理优化(主讲人:王鹏飞)

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

其他计算和物理优化(主讲人:王鹏飞)在线视频

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

下一节:提纲(主讲人:罗李)

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

其他计算和物理优化(主讲人:王鹏飞)课程教案、知识点、字幕

这部分会首先简介一下

相对简单的基于窗口的计算

然后聊一聊工程实践上

一些考虑的点和优化

关系型计算当中对窗口的定义

大多数是固定窗口

我们这次讲解

以固定窗口为主

窗口函数它有几个要素了

第一呢

如何将数据集分成窗口

换句话说

就是我们要在计算的时候

如何去shuffle数据

窗口内的数据

按照什么东西排序

这东西对应一个Sort

然后窗口上如何计算

这就是窗口函数

本身的计算逻辑

下面这条语句是一条典型的

窗口函数的计算

SELECT ROW-NUMBER()
OVER(PARTITION BY
Cagegory ORDER BY Date)
rank FROM Orders

这句话的意思是说

首先这个窗口

是按照Cagegory去划分的

也就是说

每一个Cagegory划成一个窗口

然后窗口当中的数据呢

是按照Date去排序的

然后排序的结果呢

对每一个窗口当中的

每一行数据

依次的为它附一个值

从1开始

然后以1为步进去递归

以1为步进去自增

然后他生成的计划非常简单

一个TableScan

一个(00:50:59)

一个shuffleWrite
一个shuffleRead

和一个

Window(00:51:02)的计算

后面我们会介绍一下

在优化过程当中

我们需要考虑的点

首先呢

这个IO是主要目标

如果能减少shuffle的数据量

我们就减少shuffle

如果能避免不必要的

shuffle-Sort

我们就要避免不必要的

shuffle和Sort

实际上在我们生成

物理柴恩计划的过程当中

每一个Physical Operato

它自己都有shuffle-Sort属性

如果一个Opernto满足了

它对输入的要求

那么就可以不用去

shuffle或者Sort

比如说

shuffle By(a)

和shuffle By(a,b)

实际上前者兼容后者

Sort By(a,b)

和Sort By(a)

实际上前者也兼容后者

但是一般情况下

shuffle的K的数量减少了

那就意味着出现

长尾的可能性变大

因为shuffle By(a)

基本上不会比

Shuffle By(a,b)

能够分布的更均匀

这个时候

如果我们要去掉长尾的话

像前面我们在介绍

聚合时候提到的那样

我们需要在

单条查询的执行速度

和集群吞吐量上去

找到一个平衡

我们需要知道什么时候

我们应该为单条查询的

执行速度

去生成查询计划

什么时候我们要

以集群吞吐量为先

后面我们会简单介绍一下

一些典型的物理优化场景

比如说

A JOIN B ON A.AD=

B.ID GROUP BY A.ID

它大概意思是说

我有一条查询

我需要A跟B先在ID字段

上去做连接

然后呢

后面呢

我会在A的ID字段上

再去做一个聚合

这个时候实际上

因为连接它输出的数据

按照ID已经做过Shuffle了

那么我们在计算聚合的时候

我们不需要再去Shuffle一次

我们直接可以从原始结果

输出最终结果

这是一种场景

我们再来看另外一个例子

JOIN Reorder

A和B连接

在A的ID和B的ID列上

再和C连接

在A的CT和C的CT上

再和D连接

A的ID和B的ID上

如果我们认为

AB的结果和C连接之后的结果

会产生一个非常巨大的结果集

那么再连接D的话

实际上会有额外的开销

我们可能会调整

和 C D 的连接顺序

来避免产生非常大的结果集

在分布式场景当中

因为我们处理的数据量很大

我们需要尽可能的减少

我们扫描的数据量

列存储和列裁减

是另外一项非常重要的优化

在大数据处理领域

IO是最重要的一个优化目标

我们通过计算一条查询当中

用户所引用的必要的列的列表

来去从存储系统当中

只获取

必要的数据

来减少对存储系统的IO

列存储是说对一张表的数据

我们以列的方式存储

我们只获取以列A的数据

我们不需要把整行的数据

全部都拿出来

我们只需要列A的数据即可

Predicate Push-Down

在前面讲到JOIN的时候

我们提过一次

尽量可能早的去做
(00:54:35)

来减少在

(00:54:38)

后面的计算过程当中

计算的数据量

Partition Pruning

Partition

它本身是来自于

一个HAVE的概念

它从逻辑上讲

实际上是说

我们允许用户

对数据子集去打一个标记

查询的时候呢

它可以依据这个标记

来去选择它要查询哪些子集

以此来做到

只扫描部分数据

而不是扫描整张表

详情大家都可以去网上找一找

后面我会讲一讲

工程方案当中

一些常见的这个细节

首先呢是基于开销的优化

如果有数据分布的话

我们就会知道

Shuffle BY(a,b)

被降级成

Shuffle By(a)

会不会造成长尾

一个典型的例子是

Shuffle By(c t)

Users如果降级成

Shuffle By (c t)

这个非常有可能会变成长尾

因为青海的用户数量

一定会远远的小于广东

但是如果是

Shuffle By Users
(00:55:46)

如果降级成

Shuffle By Users

这个尽管有可能会有长尾

但是那个长尾的那个现象

会非常的轻微

比如说

最长的那个尾巴

和最短的那个尾巴

很可能它们只相差

百分之零点一

如果有数据分布的话

实际上我们还可以做

非常非常多的这个事情

数据分布在

传统关系型数据库当中

一般情况下

是用直方图来表示的

但是在海量数据的情况下

我们会遇到一些困难

比如说

在1T的数据上

如何生程直方图

但是不产生

过高的运行时开销

这是需要想一想的

另外呢

直方图本身

是不可能非常巨大

比如说1G大小的直方图

我们在生成查询计划

的过程当中

读直方图

计算直方图本身

它的开销很可能

一二十秒就已经过去了

这是不可接受的

换句话说我们需要知道

说如何让这个直方图

采样够小

但是呢

它足够有效

这都是我们面临的这个

工程方面的问题

另外呢

在工程实现方面

我们也会面临其他的状况

以我们看到的场景

我们现在是海量的作业

再加海量的数据

换句话说

作业数会非常非常的巨大

数据呢

也会非常非常的巨大

但是呢

只有极少数的大型作业

在一个作业当中

处理非常大量的数据

换句话说

这海量的作业当中

绝大部分作业

都是在三十秒以下的小作业

对于我们来说

一件不可思议的事情是

存储是瓶颈

我们的集群

经常会因为存储资源不够

而扩展

但CPU不是

然后有些用户的作业呢

时间比较敏感

比如说广告推荐

它一定要在

一个足够短的时间段之内

完成所有的计算

否认的话就会影响

推荐的质量

在这种时候

集群的吞吐量是退居其次的

我们所面临的工程现实

还会有非常多的这个复杂状况

都需要一个一个的

具体问题具体分析了

后面我们来看一看

我们的一些工程方案

首先呢

我们在执行引擎实现的细节上

在做不断的改进

然后

大家可以仔细去观察观察

SQL的计算逻辑

它大多是什么样子的

就是SQL这东西

它大多是按行计算

但是呢

它在固定的计算当中

它只引用固定的列

比如说

下面这条语句

SELECT col1+col2 FROM

Dual WHERE col3大于10

它计算的时候确确实实是以行

一行一行的去计算的

但是它只引用了

col1 col2 col3 这些列

并且呢

对于SELECT列表中的加法运算

它只引用了col1和col2

这两个列

在(00:58:54)当中

它只引用了col3 这一个列

所以一切优化

我们都围绕着SIMD走

SIMD它的全称是

单位指令多数据

这个大家可以简单的去

百度一下

然后为此呢

我们把内存中的数据

也摆成列式存储

来去充分使用SIMD

它会极大的增加

CPU Cacth的命中率

我们自己作过的内部测试

它比传统的行内存的解决方案

速度大概提升的百分之一百

我们还会有一些其他的优化

比如说

查询计划缓存

我们观察到了

用户每天提交的作业

除了常数参数不同之外

其他都相同

常数参数是什么呢

比如说

用户它总是在

查询前一天的数据

和当天的数据在做比较

今天呢

它查的是昨天和今天的数据

明天呢

它计算的一定是

今天和明天的数据

像这种数据

我们是可以把查询计划

缓存起来

来避免每次用户提交一条查询

我们都去生成查询计划

另外呢

我们还会提取公共的计算

公共计算是说

用户它会提交一系列的查询

来完成一连串的这个需求

我们可以

一次处理一整批的SQL

然后这样的话呢

一个是说

我们可以在非常广泛的

范围之内

去做这个源表合并

源表合并是说

如果一张表

它在查询的过程当中

被读取了多次的话

那么我们可以只从DFS当中

读取一次

来避免跨网络读

然后呢

有一些被反复使用的纬度表

我们可以让它常驻内存

来避免在加载的时候

需要读磁盘

我们通过合并一整批的SQL

我们有可能生成非常巨型的

单次作业

调度系统的开销

它和作业数量是成比例的

通过减少这个作业的数量

我们是可以减少

调度系统的开销的

当然这里也有问题

就是

我们在合并成一个

大的作业的时候

如果这个大的作业执行失败

那么我们需要重跑整个作业

重跑的这个时间开销

基本上和我们合并的作业

的规模是成正比的

所以我们需要在

减少调度系统开销

和作业失败

fanl over之间

去做平衡

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

第一讲 大数据和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编程运行时库

-分布式环境下的新问题

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

-工程实现范例

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

-课程设计相关问题

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

其他计算和物理优化(主讲人:王鹏飞)笔记与讨论

也许你还感兴趣的课程:

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