比Hive还快10倍的大数据计算引擎

news2024/12/25 12:29:23

最近几年,Presto这个大数据组件越来越多地出现在程序员的岗位需求中,很多应届同学一番自我检查后发现,在学校都没怎么接触过,更不用说了解了。

某游戏公司岗位需求

Presto到底是个啥? 有什么用? 适合哪些业务场景?本文带你了解入门。

01

Presto的出现

在2012年以前,Facebook依赖Hive做数据分析,而Hive底层依赖MapReduce,随着数据量越来越大,使用Hive进行数据分析的时间可能需要到分钟甚至小时级别,不能满足交互式查询的数据分析场景。

1.jpg
Facebook迎来用户增长后迫切需要解决数据量大带来的问题

于是Facebook研发了这款专为Hadoop打造的工具,适用于交互式分析查询,可支持众多的数据源,包括HDFS,RDBMS,KAFKA等,而且提供了非常友好的接口开发数据源连接器。针对GB-PB量级数据查询返回结果的速度可以达到秒级。

一句话:Presto是由 Facebook开源的大数据分布式SQL查询引擎,专为大规模商业数据仓库的交互式分析和秒级查询所设计。

我们需要注意的是:虽然Presto可以解析SQL,但它不是一个标准的数据库,不是MySQL、Oracle的代替品。

02

Presto的特点

多数据源
Presto可以支持MySQL、PostgreSQL、cassandra、Hive、Kafka等多种数据源查询。

支持SQL
Presto支持部分标准SQL对数据进行查询,并提供SQL shell进行SQL查询。但是Presto不支持存储过程,不适合大表Join操作,因为Presto是基于内存的,多张大表关联可能给内存带来压力。

扩展性
Presto有很好的扩展向,可以自定义开发特定数据源的Connector,使用SQL分析指定Connector中的数据。

混合计算
在Presto中可以根据业务需要使用特定类型的Connector来读取不同数据源的数据,进行join关联计算。

基于内存计算,高性能
Presto是基于内存计算的,减少磁盘IO,计算更快。Presto性能是Hive的10倍以上。Presto能够处理PB级别的数据,但Presto并不是把PB级别的数据一次性加载到内存中计算,而是根据处理方式,例如:聚合场景,边读取数据,聚合,再清空内存,再去读取数据加载内存,再聚合计算,再清空内存… 这种方式。如果使用Join查询,那么就会产生大量的中间数据,速度会变慢。

流水线
由于Presto是基于PipeLine进行设计的,因此在进行海量数据处理过程中,终端用户不用等到所有的数据都处理完成才能看到结果,而是可以向自来水管一样,一旦计算开始,就可以产生一部分结果数据,并且结果数据会一部分接一部分的返回到客户端。

应用场景
Presto 支持在线数据查询,包括 Hive,关系数据库(MySQL、Oracle)以及专有数据存储。一条 Presto 查询可以将多个数据源的数据进行合并,可以跨越整个组织进行分析。

03

Presto架构

Presto是一个运行在多台服务器上的分布式系统,完整安装包括一个 Coordinator 和多个 Worker。

22.png
图片来源于:大数据梦想家

由客户端提交查询,从Presto命令行CLI提交到Coordinator,Coordinator进行解析,分析并执行查询计划,然后分发处理队列到Worker 。

Presto有两类服务器:Coordinator和Worker。

  1. Coordinator:

Coordinator服务器是用来解析语句,执行计划分析和管理Presto的Worker节点。Presto安装必须有一个Coordinator和多个Worker。如果用于开发环境和测试,则一个Presto实例可以同时担任这两个角色。

Coordinator跟踪每个Work的活动情况并协调查询语句的执行。Coordinator为每个查询建立模型,模型包含多个Stage,每个Stage再转为Task分发到不同的Worker上执行。

Coordinator与Worker、Client通信是通过 REST API。

2)Worker

Worker是负责执行任务和处理数据,Worker从Connector获取数据。Worker之间会交换中间数据。Coordinator是负责从Worker获取结果并返回最终结果给Client。

当Worker启动时,会广播自己去发现Coordinator,并告知Coordinator它是可用,随时可以接受Task。

Worker与Coordinator、Worker通信是通过REST API。

3)数据源

贯穿下文,你会看到一些术语:Connector、Catelog、Schema 和 Table,这些是 Presto 特定的数据源。

Connector是适配器,用于Presto和数据源(如 Hive、RDBMS)的连接。你可以认为类似 JDBC那样,但却是Presto的SPI的实现,使用标准的API来与不同的数据源交互。

Presto有几个内建Connector:JMX的Connector、System Connector(用于访问内建的System table)、Hive的Connector、TPCH(用于TPC-H 基准数据),还有很多第三方的 Connector,所以Presto可以访问不同数据源的数据。

每个Catalog都有一个特定的Connector。如果你使用catelog 配置文件,你会发现每个文件都必须包含 connector.name 属性,用于指定catelog管理器(创建特定Connector使用)。

一个或多个catelog用同样的connector是访问同样的数据库。例如,你有两个Hive集群。 你可以在一个Presto集群上配置两个catelog,两个catelog都是用Hive Connector,从而达到可以查询两个 Hive 集群。

04

Presto和Spark SQL、Impala的比较

Presto作为SQL查询引擎,是一个纯内存的计算引擎,它对内存的优化近乎极致。

因为Presto的架构主要是主从式,主节点是coordinator——负责SQL的优化以及分配执行计划,同时还负责整个集群的内存管理,所以它的速度快。

例如:一个查询Query需要消耗12G的内存,你有三台work负责查询,每个work的内存都是32GB,coordinator经过计算后,得出每个节点有6G就差不多了(4G执行,2G备用)。

那么这个Query 即便重复执行5次约等于每个work付出30G内存,Presto照样敢一起执行,所以它快。

但是假如一个Query需要消耗100GB的内存,这就超过了整个集群的内存了,那么Presto的coordinator就直接卡掉这个查询,防止内存溢出,多个查询之和超出集群内存总量就排队。

反过来看Spark SQL:

它主要在集群中的每个计算节点的Executor进程中进行内存管理,它的内存管理主要还是为了优化当前计算节点的性能而设计的,不同于Presto搞了个主从架构专门控制集群内存。

Spark SQL的架构基于Spark,Spark的分布式架构又基于Hadoop Yarn(或者Mesos),作为Yarn不管你内部的内存效率,只关心将你的任务成功的分发到不同阶段的节点上去完成。

例如:Spark SQL生成优化后的物理计划若分成10个task去做,安排在3个Executor进程去创建task并管理,每台Executor在管理task的内存时,也许有的task比较费内存,有的task就不需要那么费,Executor发现自己内存不够,就缓冲到磁盘去做。

所以Spark也会出现内存与磁盘的I/O交换,那么这个速度就不明显了。

因此Presto的主从架构是从集群整体上的内存情况,对进行中的查询进行定时监控,优化调度,将最大将耗内存的查询,调度给work节点配置的最大内存量去使用,大概在堆内存的10%。但是Spark还是单靠每个节点自己的Executor进程来解决内存与磁盘的平衡问题。

但是数据量太大的查询尤其是还存在复杂的关联的全量数据集处理,Spark大多数情况还是比Presto快。

一方面因为Presto遇到这种情况,主要就是对查询的分解、分批、排队。但是Spark就能充分利用MPP架构的能力,多任务分配到切分后的多数据块,先调入计算处理,大不了内存和磁盘一起用。

另一方面Presto倾向于计算与存储分离的架构,每个work并不知道是不是从本地拿数据,只是根据查询要求来做,大多数情况都是远程调用数据。

但是Spark还是计算与存储结合的架构,每个task可以和rdd的一个分区做对应,那么spark对rdd的分布式数据节点分配也会尽量按照就近原则进行,作为复杂的连接操作,尽量多的在本地处理,速度肯定比远程读取或者混洗(shuffle)要快很多。

至于Presto和Impala,建议看下图一目了然。

33.jpg
Presto和Impala的对比

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/124222.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

月薪9K!前台测试男生偷偷努力,工资翻倍转行5G网络优化工程师,“卷死”所有人!

你是否有过这样的生活? 每天重复着外场测试,抱着电脑,手机在户外验证基站信号;长期的出差,频繁的更换城市;每个月领着3500块钱的工资,可能再工作2-3年会涨到4000元,技术也不可能有任何的突破。生活重复单调…

Ubuntu 上安装conan + Cmake

目录 1. 在用户目录下创建共享目录,然后将共享目录挂载到上去 2. 安装新版本的cmake 3. 安装conan 4. 配置CONAN环境 5. 配置conan的访问服务器URL 6. Linux 平台需要切换gcc编译器版本为c11以及version 7. 安装opengl开发库 1. 在用户目录下创建共享目录&…

springboot+mybatis如何快速插入大量数据

在公司业务开发过程中,我们经常会遇到往数据库表中插入大量数据的场景,比如excel批量导入数据。那么该如何快速地插入数据呢?我们可以考虑使用批量插入来实现,该方案实测每秒能达到35000条,后附具体实现代码。接下来我…

经典蓝牙连接过程

ACL是连接基础,sco需要再ACL连接成功后建立连接。基本链接流程如下: 一、创建连接 从用户点击扫描到的蓝牙设备开始,发起连接的设备会发送create_connection给controller。controller会进行page过程。 而后会底层链接完成,这个完成仅仅是确认…

CSS初级教程【第四天】

CSS初级教程【第四天】【1】CSS 外边距【2】CSS 外边距合并【3】所有 CSS 外边距属性【4】CSS 内边距【5】内边距和元素宽度【6】所有 CSS 内边距属性【7】CSS 高度和宽度【8】设置 CSS 尺寸属性CSS上回学习链接 CSS初级教程【第一天】 CSS初级教程【第二天】 CSS初级教程【第三…

windows本地安装openjdk环境

1讲一下为什么要选openjdk 先讲一下为什么小编在这里选择openjdk,而不是像绝大多数人一样选择jdk。那是因为,jdk在1.8的某个版本之后,就不是免费的版本了,不能免费用于商用。有过工作经验的就知道,公司一般对电脑上安装…

掌握这17张图,没人比你更懂RecyclerView的预加载

回顾上一篇文章,我们为了减少描述问题的维度,于演示之前附加了许多限制条件,比如禁用了RecyclerView的预拉取机制。 实际上,预拉取(prefetch)机制作为RecyclerView的重要特性之一,常常与缓存复用机制一起配合使用、共…

Go语言设计与实现 -- Mutex源码剖析

上图来自面向信仰编程 上图中,第一列为常见的同步原语,第二列为容器,第三列为互斥锁。 接下来我们来逐一介绍一下: Mutex 我们先来看一下sync.Mutex的结构体: type Mutex struct {// 当前互斥锁的状态state int32…

代码随想录算法训练营第一天 java : 704.二分查找法、27.移除算法

文章目录Leecode 704.二分查找题目连接:[Leecode 704.二分查找](https://leetcode.cn/problems/remove-element/)遇到的问题题目二分法的第一种写法 (左闭右闭)第二种解法(左闭右开 代码呈现)Leecode 27.移除元素题目链接&#xf…

MyBatis【创建与使用】

MyBatis【创建与使用】🍎一. MyBatis🍒1.1. MyBatis 是什么?🍒1.2 没有使用MyBatis时的操作流程🍒1.3 MyBatis的操作与数据库之间的流程🍎二.创建MyBatis项目🍒2.1 idea创建🍒2.2 配…

【Git】一文带你入门Git分布式版本控制系统(撤销修改、删除文件)

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,也会涉及到服务端 📃个人状态: 在校大学生一枚,已拿多个前端 offer(秋招) 🚀未…

Debezium故障演练

1、搭建演练环境 postgresql及wal2json插件安装:https://blog.csdn.net/li281037846/article/details/128411222 kafka及kafka-connect安装,略 //添加debezium connector curl -i -X POST -H "Content-Type:application/json" -H "Accepted:applic…

Qt样式(qss)使用小结(软件换肤,比如暗黑模式)

1.背景: Qt style sheet(qss)跟前端技术一样,就是为了美化界面。关键是,太好用了。之前还为此写过一篇博客。 Qt样式(qss)手册小结_大橘的博客-CSDN博客 其中主要是记录如何获取手册细节。 …

6、GPIO输入按键检测(轮询检测)

目录 0x01、简介 0x02、硬件设计 0x03、编写函数 0x001、按键初始化 0x002、按键检测 0x003、按键led翻转 0x04、源程序下载地址 0x01、简介 本次实验主要实现按键控制LED灯。 由于机械按键在按下和抬起的时候会产生按键抖动,所以在设计的时候需要考虑如何消除抖…

Pytorch可视化特征图(代码 亲测可用)

2013年Zeiler和Fergus发表的《Visualizing and Understanding Convolutional Networks》 早期LeCun 1998年的文章《Gradient-Based Learning Applied to Document Recognition》中的一张图也非常精彩,个人觉得比Zeiler 2013年的文章更能给人以启发。从下图的F6特征&…

会议OA项目-首页

目录一、Flex布局简介什么是flex布局?flex属性学习地址:案例演示二、轮播图组件及mockjs三、会议OA小程序首页布局一、Flex布局简介 布局的传统解决方案,基于盒状模型,依赖 display属性 position属性 float属性 什么是flex布局…

简单有效的Mac内存清理方法,不用收藏也能记住

Mac电脑使用的时间越久,系统的运行就会变的越卡顿,这是Mac os会出现的正常现象,卡顿的原因主要是系统缓存文件占用了较多的磁盘空间,或者Mac的内存空间已满。如果你的Mac运行速度变慢,很有可能是因为磁盘内存被过度占用…

如何理解并记忆DataFrame中的Axis参数

当我们遇到有axis参数的方法时,脑子里的第一反应应该是:这个方法一定是沿着某一方向进行某种“聚合”或者“过滤”操作。在此场景下,Axis参数就是用来设定操作方向的:是垂直方向还是水平方向? axis0: 一行一行推进&…

【微服务架构实战】第1篇之API网关概述

1.网关概述 采用分布式、微服务的架构模式开发系统时,API 网关是整个系统中必不可少的一环。 1.1 没有网关会有什么问题? 在微服务架构模式下,1个系统会被拆分成多个微服务,如果每个微服务都直接暴露给调用方,会有以…

MySQL主键和唯一键的区别

主键和唯一键基本知识参考这篇文章 MySQL表的约束 ,本篇文章主要是谈一谈主键和唯一键的区别从而更好的理解唯一键和主键。 在上篇文章中已经提到 主键: primary key 用来唯一的约束该字段里面的数据,不能重复,不能为空&#x…