presto架构和原理简介(转)(代码片段)

allen-rg allen-rg     2022-12-03     743

关键词:

  Presto 是 Facebook 推出的一个基于Java开发的大数据分布式 SQL 查询引擎,可对从数 G 到数 P 的大数据进行交互式的查询,查询的速度达到商业数据仓库的级别,据称该引擎的性能是 Hive 的 10 倍以上。Presto 可以查询包括 Hive、Cassandra 甚至是一些商业的数据存储产品,单个 Presto 查询可合并来自多个数据源的数据进行统一分析。Presto 的目标是在可期望的响应时间内返回查询结果,Facebook 在内部多个数据存储中使用 Presto 交互式查询,包括 300PB 的数据仓库,超过 1000 个 Facebook 员工每天在使用 Presto 运行超过 3 万个查询,每天扫描超过 1PB 的数据。

目录:

  • presto架构
  • presto低延迟原理
  • presto存储插件
  • presto执行过程
  • presto引擎对比

Presto架构


  • 技术图片
  • Presto查询引擎是一个Master-Slave的架构,由下面三部分组成:
    1. 一个Coordinator节点
    2. 一个Discovery Server节点
    3. 多个Worker节点
  • Coordinator: 负责解析SQL语句,生成执行计划,分发执行任务给Worker节点执行
  • Discovery Server: 通常内嵌于Coordinator节点中
  • Worker节点: 负责实际执行查询任务,负责与HDFS交互读取数据
  • Worker节点启动后向Discovery Server服务注册,Coordinator从Discovery Server获得可以正常工作的Worker节点。如果配置了Hive Connector,需要配置一个Hive MetaStore服务为Presto提供Hive元信息
  • 更形象架构图如下:
  • 技术图片

Presto低延迟原理


  • 完全基于内存的并行计算
  • 流水线式计算作业
  • 本地化计算
  • 动态编译执行计划
  • GC控制

Presto存储插件


  • Presto设计了一个简单的数据存储的抽象层, 来满足在不同数据存储系统之上都可以使用SQL进行查询。
  • 存储插件(连接器,connector)只需要提供实现以下操作的接口, 包括对元数据(metadata)的提取,获得数据存储的位置,获取数据本身的操作等。
  • 除了我们主要使用的Hive/HDFS后台系统之外, 我们也开发了一些连接其他系统的Presto 连接器,包括HBase,Scribe和定制开发的系统
  • 插件结构图如下:
  • 技术图片

presto执行过程


  • 执行过程示意图:
  • 技术图片
  • 提交查询:用户使用Presto Cli提交一个查询语句后,Cli使用HTTP协议与Coordinator通信,Coordinator收到查询请求后调用SqlParser解析SQL语句得到Statement对象,并将Statement封装成一个QueryStarter对象放入线程池中等待执行,如下图:示例SQL如下
    • 技术图片
  • select c1.rank, count(*) from dim.city c1 join dim.city c2 on c1.id = c2.id where c1.id > 10 group by c1.rank limit 10;
  • 逻辑执行过程示意图如下:
  • 技术图片
  • 上图逻辑执行计划图中的虚线就是Presto对逻辑执行计划的切分点,逻辑计划Plan生成的SubPlan分为四个部分,每一个SubPlan都会提交到一个或者多个Worker节点上执行
  • SubPlan有几个重要的属性planDistribution、outputPartitioning、partitionBy属性整个执行过程的流程图如下:
    1. PlanDistribution:表示一个查询阶段的分发方式,上图中的4个SubPlan共有3种不同的PlanDistribution方式
      • Source:表示这个SubPlan是数据源,Source类型的任务会按照数据源大小确定分配多少个节点进行执行
      • Fixed:  表示这个SubPlan会分配固定的节点数进行执行(Config配置中的query.initial-hash-partitions参数配置,默认是8)
      • None:  表示这个SubPlan只分配到一个节点进行执行
    2. OutputPartitioning:表示这个SubPlan的输出是否按照partitionBy的key值对数据进行Shuffle(洗牌), 只有两个值HASH和NONE
  • 技术图片
  • 在上图的执行计划中,SubPlan1和SubPlan0 PlanDistribution=Source,这两个SubPlan都是提供数据源的节点,SubPlan1所有节点的读取数据都会发向SubPlan0的每一个节点;SubPlan2分配8个节点执行最终的聚合操作;SubPlan3只负责输出最后计算完成的数据,如下图:
  • 技术图片
  • SubPlan1和SubPlan0  作为Source节点,它们读取HDFS文件数据的方式就是调用的HDFS InputSplit API,然后每个InputSplit分配一个Worker节点去执行,每个Worker节点分配的InputSplit数目上限是参数可配置的,Config中的query.max-pending-splits-per-node参数配置,默认是100
  • SubPlan1的每个节点读取一个Split的数据并过滤后将数据分发给每个SubPlan0节点进行Join操作和Partial Aggr操作
  • SubPlan0的每个节点计算完成后按GroupBy Key的Hash值将数据分发到不同的SubPlan2节点
  • 所有SubPlan2节点计算完成后将数据分发到SubPlan3节点
  • SubPlan3节点计算完成后通知Coordinator结束查询,并将数据发送给Coordinator

presto引擎对比


  • 与hive、SparkSQL对比结果图
  • 技术图片

 

 https://www.cnblogs.com/tgzhu/p/6033373.html

hadoop原理简介基本构建(代码片段)

...、Hadoop简介1.1什么是Hadoop1.2Hadoop优势1.3Hadoop的主要模块1.4架构描述       1.4.1HDFS架构       1.4.2YARN架构        1.4.3MapReduce架构        1.4.4 三者关系 1.5大数据的生态模型二、Hadoop的安装和调试2.1安装2.2Hadoop的运... 查看详情

大数据框架原理简介(代码片段)

针对上篇文章遗留问题联邦学习之一几亿级别的数据量架构如何设计且如何实现要解决这个问题那么咱首先要会大数据处理框架的相关内容这篇文章咱们走进大数据处理的世界首先咱们要理解大数据相关的概念和原理才能很好的... 查看详情

presto部署指南(代码片段)

1.Presto简介说明  Presto是一个开源的分布式SQL查询引擎,适用于交互式分析查询,数据量支持GB到PB字节。  Presto的设计和编写完全是为了解决像Facebook这样规模的商业数据仓库的交互式分析和处理速度的问题。  Presto支持... 查看详情

elasticsearch概念与架构原理(代码片段)

一、概述ElasticSearch简介简介ES是建立在Lucene基础之上的分布式准实时搜索引擎,它所提供的诸多功能中有一大优点,就是实时性好。比如:在业务需求中,新增数据需要1min才能被搜索到,而在ES中数秒或1s内就能搜索到新增的数... 查看详情

ceph介绍及原理架构分享(代码片段)

一.Ceph架构简介及使用场景介绍1.Ceph简介Ceph是一个统一的分布式存储系统,设计初衷是提供较好的性能、可靠性和可扩展性。Ceph项目最早起源于Sage就读博士期间的工作(最早的成果于2004年发表),并随后贡献给... 查看详情

presto架构及原理

     Presto是Facebook推出的一个基于Java开发的大数据分布式SQL查询引擎,可对从数G到数P的大数据进行交互式的查询,查询的速度达到商业数据仓库的级别,据称该引擎的性能是Hive的10倍以上。Presto可以查询包括H... 查看详情

elk架构和filebeat工作原理详解(代码片段)

ELKStack简介ELK不是一款软件,而是Elasticsearch、Logstash和Kibana三种软件产品的首字母缩写。这三者都是开源软件,通常配合使用,而且又先后归于Elastic.co公司名下,所以被简称为ELKStack。根据GoogleTrend的信息显示࿰... 查看详情

presto和hive日期函数对比(代码片段)

时间格式转换日期格式→Unix时间戳转10位Unix时间戳数据:2020-07-2315:01:13Presto:selectto_unixtime(cast(‘2020-07-2315:01:13‘astimestamp))Hive:selectunix_timestamp(cast(‘2020-07-2315:01:13‘astimestamp))转13位Unix时间戳数据:2020-07-2 查看详情

prestoonalluxiobyalluxiosds单节点搭建(代码片段)

...构二、搭建过程三、配置环境变量四、搭建过程五、搭建Presto六、搭建Alluxio七、重配Presto使用AlluxioSDS修改catalog配置重启PrestoServer运行prestocli八、可选项九、总结十、展望十一、参考一、总体架构急性子,想直接实操的,... 查看详情

prestoonalluxiobyalluxiosds单节点搭建(代码片段)

...构二、搭建过程三、配置环境变量四、搭建过程五、搭建Presto六、搭建Alluxio七、重配Presto使用AlluxioSDS修改catalog配置重启PrestoServer运行prestocli八、可选项九、总结十、展望十一、参考一、总体架构急性子,想直接实操的,... 查看详情

flume基础知识01简介+基本架构+核心概念+架构模式+agent内部原理+配置格式(一篇就可入门flume)(代码片段)

1简介ApacheFlume是一个分布式,高可用的数据收集系统。它可以从不同的数据源收集数据,经过聚合后发送到存储系统中,通常用于日志数据的收集。Flume分为NG和OG(1.0之前)两个版本,NG在OG的基础上进行了完全的重... 查看详情

kafka原理和实战(代码片段)

...移动浏览器、推荐广告和大数据、人工智能等相关开发和架构。目前在vivo智能平台中心从事AI中台建设以及广告推荐业务。擅长各种业务形态的业务架构、平台化以及各种业务解决方案 查看详情

动态代码生成技术在presto中使用简介

在《ASM与Presto动态代码生成简介EmbedVersion我们往Presto提交SQL查询以及TaskExecutor启动TaskRunner执行Task的时候都会使用到EmbedVersion类里面的embedVersion方法。embedVersion方法其实就是初始化一个Runnable实例,比如启动TaskRunner的代码片... 查看详情

动态代码生成技术在presto中使用简介

在《ASM与Presto动态代码生成简介EmbedVersion我们往Presto提交SQL查询以及TaskExecutor启动TaskRunner执行Task的时候都会使用到EmbedVersion类里面的embedVersion方法。embedVersion方法其实就是初始化一个Runnable实例,比如启动TaskRunner的代码片... 查看详情

meta公司新探索|利用alluxio数据缓存降低presto延迟(代码片段)

目录概要速览Presto架构Presto+数据缓存架构软亲和调度数据缓存本地缓存的内部构成和配置基本缓存单元缓存位置和层级线程并发缓存恢复监控基准测试开销节省节省的扫描数据量:57%缓存命中率如何使用?其他有用的... 查看详情

docker架构原理及简单使用(代码片段)

  提示:文中有些内容为大神的博客内容,就不统一标注那里引用,只是再最下面标注参考连接谢谢一、简介  1、了解docker的前生LXC     LXC为LinuxContainer的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且... 查看详情

hbase架构详解及读写流程原理剖析(代码片段)

1、HBase简介HBase是BigTable(架构如下图所示)的开源“山寨”版本,建立在hdfs(对应GFS)之上,提供高可靠性、高性能、列存储、可伸缩、实时读写的数据库系统。HBase底层依赖于HDFS的。整体架构图如下:HBa... 查看详情

tomcat学习笔记系统架构和原理(代码片段)

tomcat学习笔记(一)系统架构和原理Tomcat浏览器访问服务器的流程tomcat请求处理大致过程tomcat系统总体架构coyote连接器组件coyote内部组件和工作流程servlet容器Catalinatomcat核心配置文件server.xmlTomcatb/s(浏览器/服务器模... 查看详情