Presto 架构原理与优化介绍| 青训营笔记

161 阅读5分钟

这是我参与「第四届青训营 」笔记创作活动的第8天。

本节课程主要分为四个方面:

介绍大数据与 OLAP 的演进之路,并简单介绍 Presto 的设计理念

介绍 Presto 的基础概念与原理,加深对Presto基础概念的理解

对 Presto 的特色和重要机制进行讲解和剖析

基于实际工作中遇到的case,介绍 Presto 常用的优化工具,以及 Presto 在字节内部的相关优化

大数据与OLAP的演进

Hadoop:基于廉价机器的存算分离的大规模分布式处理系统

Hadoop发展历史

  • 1.谷歌在2003,2004年发布Google File System论文,MapReduce论文(map:数据转换;reduce:数据清洗)

    1. 2008年,Hadoop成伪apache顶级项目

OLAP(Online Analystcla Processing)对业务数据执行多维分析,并提供复杂计算,去试分析和复杂数据建模的能力。

OLAP vs MapReduce

  • MapReduce代表了抽象的物理执行模型,使用门槛比较高,(他的描述语言比较复杂)

  • OLAP引擎使用SQL形式,为数据分析,数据开发统一的逻辑描述语言

OLAP核心概念:

  • 维度

  • 度量

Presto设计理念

Presto最初是由facebook研发的构建于Hadoop/HDFS系统之上的PB级交互式分析引擎,其具有如下的特点:

  • 多租户任务的管理与调度

  • 多数据源联邦查询

  • 支持内存化计算

  • pipeline式数据处理

Presto基础概念

服务相关:

image.png

Coordinator :解析SQL语句,生成执行计划,分发执行计划给Worker节点

Worker:执行Task处理数据,与其他Worker交互传输数据

数据源相关:

多数据源的引擎

image.png

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

image.png

如何衡量摸个任务某个Stage的真实并行度呢?

image.png

由Query生成的Task下,Task基本等同于Stage,首先会按照算子类型分成不同的pipline,每个pipline代表一组Operator集合,并行度就可以理解为,不同的pipline下Driver的数目之和。work节点数16pipline=并行度

image.png

核心组件架构介绍 - 服务发现

image.png

浅绿色部分桥接了Connector与worker之间服务发现的能力。

核心组件架构介绍 - 通信机制

image.png

节点状态:

  • ACTIVE
  • INACTIVE
  • SHUTDOWM

小结:

  • 从服务,数据源,Query,数据传输四个角度,介绍了Presto相关的基础概念
  • 通过服务发现,通信机制,节点状态三个方面介绍了Coordinator与Worker是如何协调工作的

presto重要机制

  • 多租户资源管理
  • 多租户下任务调度
  • 内存计算
  • 多数据源联邦查询

presto默认是纯内存计算的

  • 多租户资源管理
    • 类似Yarn多级队列的资源管理方式
    • 基于cpu,memory, sql值数进行资源使用量限制

image.png

image.png

  • 多租户下任务调度-物理计划生成

image.png

对表扫描-》然后局部聚和-》数据交换-》再聚合-》取前n个数据交换-》取前n个-》输出

  • 多租户下任务调度-Stage调度
  1. AllAtOnceExecutionPolicy 同时调度
  2. PhasedExecutionPolicy 分阶段调度

默认是同时调度

上游在处理数据时把已经处理的数据可以直接给下游处理

并不是有的计划都可以做流式处理,所以需要分阶段调度

image.png

image.png

  • 多租户下任务调度-Task调度
  • Task数量如何确定
  • 选择什么样的节点(调度方式有哪些)

image.png

image.png

  • 多租户下任务调度-Split调度

image.png

image.png

内存计算

  • 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

具体案例分析

image.png

image.png

image.png

image.png

image.png

image.png

总结:

  • 学习大数据与 OLAP 的演进之路,Presto 的设计理念
  • 学习了presto的基本原理以及核心组件架构
  • 学习了presto性能分析

标题:Presto 架构原理与优化介绍| 青训营笔记

网址:juejin.cn/