这是我参与「第四届青训营 」笔记创作活动的的第5天
-
Hadoop:基于廉价机器与存算分离的大规模分布式处理系统
- 谷歌在2003、2004年发布Google File System论文、MapReduce论文 - 2008年,Hadoop成为apache顶级项目 -
OLAP(OnLine Analytical Processing)对业务数据执行多维分析,提供复杂计算,趋势分析和复杂数据建模的能力。是许多商务智能(BI)应用程序背后的技术。
-
OLAP VS MapReduce
-
- MapReduce代表了抽象的物理执行模型
-
- 与Mapreduce Job相比,OLAP引擎常通过SQL的形式,为数据分析,数据开发人员提供统一的逻辑描述语言,实际的物理执行由具体的引擎进行转换和优化
-
OLAP核心概念:维度、度量
- 常见的OLAP引擎
| 预计算引擎 | 批式处理引擎 | 流式处理引擎 | 交互式处理引擎 |
|---|---|---|---|
| Kylin | Hive | Flink | Presto |
| Druid | Spark | Clickhouse | |
| Doris |
Presto设计思想
最初是由Facebook研发的构建于Hadoop/HDFS系统上的
Presto基础原理与概念
基础概念
-
整体架构
-
Coordinator
- 解析SQL语句
- 生产执行计划
-
Worker
-
Connector
- 一个Connector代表一种数据源。可以认为Connector是由Presto执行的适配多数据源的统一接口
-
Catalog
- 管理元数据与真实数据的映射关系
-
-
Query相关
- Query:基于SQL parser 后获得的执行计划
- Stage:根据是否需要shuffle将Query
- Fragment:基本等价于Stage,属y于在不同阶段的称呼,本门课程可以认为两者等价
- Task:单个Worker节点上的最小资源管理单元:在一个节点上,一个Stage只有一个Task,一个Query可能有多个Task
- Pipelineor:最小的物理算子
- Exchange & LocalExchange
核心组件架构
Presto重要机制
1·多租户资源管理
Resource Group资源组 类似Yarn多级队列管理方式
优点:1、轻量的Query级别的多级队列资源管理模式 2、存在一定滞后性,只会对Group中正在运行SQL进行判断
- 物理计划生产
2.多租户下的任务调度
Stage调度
- AllAtOnceExecutionPolicy
- PhasedExecutionPolicy
Task调度(How many? How?)
确定节点数量
- Source:根据数据meta决定分配多少节点
- Fixed:hash partition count确定,如集群节点数量
- Sink:汇聚结果,一台机器
- Scaled:无分区限制,可拓展,如write数据
- Coordinator_Only:只需coordinator参与
Fragment0 Fragment1 Fragment2分别对应 Sink Fixed Source
选择什么样的节点
-
HARD_AFFINITY: 计算、存储 Local 模式,保障计算与存储在同一个节点,减少数据传输
-
SOFT_AFFINITY: 基于某些特定算法,如一致性HASH函数,常用于缓存场景,保证相似的 Task 调度到同一个 Worker
-
NO_PREFERENCE: 随机选取,常用于普通的纯计算 Task (90%以上选择)
-
Split调度
3. 内存计算
Pipeline化的数据处理
流式 -- 生产段 交互式 --- 消费端
Pipeline的引入更好的实现算子间的并行 语义上保证每个Task内的数据流失处理
Back Pressure Mechanism反压机制
- 控制split生成流程
- targetConcurrency auto-scala-out
- 针对每个Task定时检查, 如果 OutputBuffers 使用率低于 0.5 (下游消费较快, 需要提高生产速度), Split 并发度+1
- 控制operator执行
- sink.max-buffer-size" 写入buffer的大小控制
- "exchange.max-buffer-size" 读取buffer的大小控制 - Buffer 达到最大值时Operator会进入阻塞状态
4.多联邦源联邦查询
性能优化实战
常用的性能分析工具
- Grafana、 Arthas、
- 线上问题排查工具:Flame Figure火焰图
- java指令:jstack等指令
火焰图用于分析热点代码占用大量cpu,从而导致服务性能下降的情况。如下图,自底向上为调用关系。上层宽度越宽表示当前函数cpu耗时越久,我们关注最宽的函数调用。