这是我参与「第四届青训营 」笔记创作活动的第8天。
本节课程主要分为四个方面:
介绍大数据与 OLAP 的演进之路,并简单介绍 Presto 的设计理念
介绍 Presto 的基础概念与原理,加深对Presto基础概念的理解
对 Presto 的特色和重要机制进行讲解和剖析
基于实际工作中遇到的case,介绍 Presto 常用的优化工具,以及 Presto 在字节内部的相关优化
大数据与OLAP的演进
Hadoop:基于廉价机器的存算分离的大规模分布式处理系统
Hadoop发展历史
-
1.谷歌在2003,2004年发布Google File System论文,MapReduce论文(map:数据转换;reduce:数据清洗)
-
- 2008年,Hadoop成伪apache顶级项目
OLAP(Online Analystcla Processing)对业务数据执行多维分析,并提供复杂计算,去试分析和复杂数据建模的能力。
OLAP vs MapReduce
-
MapReduce代表了抽象的物理执行模型,使用门槛比较高,(他的描述语言比较复杂)
-
OLAP引擎使用SQL形式,为数据分析,数据开发统一的逻辑描述语言
OLAP核心概念:
-
维度
-
度量
Presto设计理念
Presto最初是由facebook研发的构建于Hadoop/HDFS系统之上的PB级交互式分析引擎,其具有如下的特点:
-
多租户任务的管理与调度
-
多数据源联邦查询
-
支持内存化计算
-
pipeline式数据处理
Presto基础概念
服务相关:
Coordinator :解析SQL语句,生成执行计划,分发执行计划给Worker节点
Worker:执行Task处理数据,与其他Worker交互传输数据
数据源相关:
多数据源的引擎
Connector:一个Connector代表一种数据源,可以认为Connector是由Presto提供的适配多数据源的统一接口。
Catalog:管理元信息与实际数据的映射关系
基础概念介绍-Query相关
query:基于sql parser 后获得的执行计划
Stage:根据是否需要shuffle将Query拆分成不同的subplan,每个subplan便是一个stage
Frgment:基本等价于Stage,恕不不同阶段的称呼
Task:单个Worker节点上的最小资源管理单位:在一个节点上,一个Stage只有一个Task,一个Query可能有多个Task
Pipline:Stage按照LocalExchange切分为若干Operator集合,每个Operator集合定义一个Pipline
Dirver: Pipline的可执行实体,Pipline和Dirve的关系可以类比程序和进程,时做小的执行单元,通过火山迭代模型执行每个Operator
Spilt:输入数据描述(数据实体是Page),数量上和Dirver一一对应,不仅代表实际数据源split,也代表了不同stage健传输的数据
Operator:最小的物理算子
基础概念介绍-数据传输相关
Exchange: 表示不同Stage间的数据传输,大多数一一下等价于Shuffle
LocalExcahnge:Stage内的rehash操作,常用于提高并行处理数据的能力(Task在Presto中只是最小的容器,而不是最小的执行单元)
LocalExchange的默认值是16
如何衡量摸个任务某个Stage的真实并行度呢?
由Query生成的Task下,Task基本等同于Stage,首先会按照算子类型分成不同的pipline,每个pipline代表一组Operator集合,并行度就可以理解为,不同的pipline下Driver的数目之和。work节点数16pipline=并行度
核心组件架构介绍 - 服务发现
浅绿色部分桥接了Connector与worker之间服务发现的能力。
核心组件架构介绍 - 通信机制
节点状态:
- ACTIVE
- INACTIVE
- SHUTDOWM
小结:
- 从服务,数据源,Query,数据传输四个角度,介绍了Presto相关的基础概念
- 通过服务发现,通信机制,节点状态三个方面介绍了Coordinator与Worker是如何协调工作的
presto重要机制
- 多租户资源管理
- 多租户下任务调度
- 内存计算
- 多数据源联邦查询
presto默认是纯内存计算的
- 多租户资源管理
-
- 类似Yarn多级队列的资源管理方式
-
- 基于cpu,memory, sql值数进行资源使用量限制
- 多租户下任务调度-物理计划生成
对表扫描-》然后局部聚和-》数据交换-》再聚合-》取前n个数据交换-》取前n个-》输出
- 多租户下任务调度-Stage调度
- AllAtOnceExecutionPolicy 同时调度
- PhasedExecutionPolicy 分阶段调度
默认是同时调度
上游在处理数据时把已经处理的数据可以直接给下游处理
并不是有的计划都可以做流式处理,所以需要分阶段调度
- 多租户下任务调度-Task调度
- Task数量如何确定
- 选择什么样的节点(调度方式有哪些)
- 多租户下任务调度-Split调度
内存计算
- Pipline化的数据处理
- Back Pressure Mechanism 为了解决流式计算时纯内存计算造成内存压力过大的问题
Pipline化的数据处理
根据LocalExchange在state内部进行并行拆分算子
Back Pressure Mechanism
-
控制split生成流程
- 针对每个Task定时检查, 如果 OutputBuffers 使用率低于 0.5 (下游消费较快, 需要提高生产速度), Split 并发度+1
-
控制Operator执行速度
-
"sink.max-buffer-size" 写入buffer的大小控制
-
"exchange.max-buffer-size" 读取buffer的大小控制
-
Buffer 达到最大值时Operator会进入阻塞状态
-
控制源头的速度,
控制消费的速度,通过判断buffer的容量是否过高,来控制消费速度
多数据源联邦查询
将各个数据源进行统一的抽象,最有由Presto server进行统一的物理执行
- 缺点:针对不同数据源,还存在许多问题需要解决
-
- 谓词下推
- 每个数据源都需要单独的一套catalog管理
- 如何针对数据源进行分片操作
性能优化实战
常用性能分析工具
Grafana;Presto UI
java的相关指令:jstack,JMX,JMAP&GC日志等
线上问题排查工具: Arthas,Flame Figure
具体案例分析
总结:
- 学习大数据与 OLAP 的演进之路,Presto 的设计理念
- 学习了presto的基本原理以及核心组件架构
- 学习了presto性能分析
标题:Presto 架构原理与优化介绍| 青训营笔记
网址:juejin.cn/