Presto从入门到精通以及案例实操系列

这篇具有很好参考价值的文章主要介绍了Presto从入门到精通以及案例实操系列。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、简介

1.1、Presto的由来

Presto最初由Facebook公司开发,旨在解决Facebook内部大规模数据处理和数据分析的问题。在传统的Hadoop生态圈中,MapReduce作为数据处理框架,虽然能够处理海量数据,但是其查询性能却比较低下,尤其是对于需要进行交互式查询(如数据探索、数据挖掘等)的应用场景,更是不够灵活。

为了解决这一问题,Facebook团队在2012年开始开发Presto,其目标是建立一个高性能、可扩展、支持SQL查询语言的跨平台数据处理引擎,以适应Facebook内部不断增长的数据规模和业务需求。在Presto出现之前,Facebook使用Hive来处理数据,但随着数据量和查询复杂度的增加,Hive的查询性能已经不能满足需求,因此Facebook决定开发Presto替代Hive。

Presto是一个开源的分布式SQL查询引擎,适用于交互式分析查询,数据量支持GB到PB字节。

1.2、Presto的特点

Presto是一个高性能、可扩展、支持多数据源的分布式SQL查询引擎,其作用主要有以下几个方面:

  • 查询大规模数据集:Presto可以查询PB级别的数据,并且可以对数据进行分布式处理。因此,Presto非常适用于需要查询大规模数据集的场景,比如数据分析、数据仓库等。

  • 提供高性能查询:Presto利用内存计算技术,将计算结果放在内存中进行实时查询,相比于Hadoop MapReduce的磁盘IO,其性能更快,可以实现秒级响应。因此,Presto非常适用于对查询性能要求较高的场景,比如数据探索、数据挖掘等。

  • 支持多数据源查询:Presto提供了对多种数据源的支持,包括传统的关系型数据库和同类系统,还有一些NoSQL数据库和分布式存储系统。因此,Presto非常适用于需要对多种数据源进行查询和集成分析的场景。

  • 易用性:Presto提供了一个CLI(Command-Line Interface)工具和Web界面,使用户可以轻松地提交查询语句、查看执行状态和结果。因此,Presto非常适用于需要方便易用的数据处理场景。

1.3、Presto的架构

Presto 集群中一共有两种服务器进程: Coordinator服务进程,Worker服务进程。

  • Coordinator进程: 接受查询请求,解析查询语句,生成查询执行计划,任务调度,Worker管理。
  • Worker进程: 执行被分解后端而查询执行任务–>Task

Presto从入门到精通以及案例实操系列

执行流程如下图所示:

  • Connector Presto访问不同数据源的驱动程序。每种Connector都实现Presto中标准SPI接口。当年需要使用某种Connector访问特定的数据源时,需要在$PRESTO_HOME/etc/catalog中配置文件:example.properties,并在配置文件中设置一个属性:connector.name,PrestoConnector Manager就是通过该配置属性来决定使用哪一个Connector去访问数据。
  • Catalog 对应某一类数据源,例如hive的数据,或mysql的数据。当你访问Catalog中某个表时,该表的全名总是以Catalog的名字开始。例如 名字为example.schema1.table1的表,指的是表table1位于名schema1下的schema中,而schema1又位于example的Catalog中。
  • Schema 对应mysql中的数据库
  • Table 对应mysql中的表

Presto从入门到精通以及案例实操系列
Presto查询步骤

  1. 客户端通过Http协议发送一个查询语句给Presto集群的Coordinator
  2. Coordinator接到客户端传递过来的查询语句,会对该查询语句进行解析,生成查询执行计划,Coordinator会根据数据本地行生成对应的HttpRemoteTask
  3. Coordiantor将每一个Task都分发到其所需要处理的数据所在的Worker上进行执行。这个过程是通过HttpRemoteTask中的HttpClient将创建或者更新Task请求发送给数据所在节点上TaskResource所提供的RestFul接口,TaskResource接收到请求之后最终会在对应的Worker上启动一个SqlTaskExecution对象或者更新对应的SqlTaskExecution对象需要处理的Split。
  4. 执行处于上游的Source Stage中的Task,这些Task通过各种Connector从相应的数据源中读取所需要的数据。
  5. 处于下游的会读取上游Stage产生的输出结果,并在该Stage每隔Task所在Worker的内存中进行后续的计算和处理。
  6. Coordinator从分发的Task之后,就会一直持续不断的从Single Stage中的Task获取计算结果,并将计算结果缓存到Buffer中,直到所有的计算结束。
  7. Client从提交查询语句之后,就会不断地从Coordinator中获取本次查询的计算结果,直到获得了所有的计算记过。并不是等到所有的查询结果都产生完毕之后一次全部显示出来,而是每产生一部分,就会显示一部分,直到所有的查询结果都显示完毕。

1.4、Presto的优缺点

Presto从入门到精通以及案例实操系列

1.4.1、优点

  • Presto是基于内存运算,减少没必要的硬盘IO,所以更快。
  • 能够连接多个数据源,跨数据源连表查,如从Hive查询大量网站访问记录,然后从Mysql中匹配出设备信息。

1.4.2、缺点

  • 虽然能够处理PB级别的海量数据分析,但不是代表Presto把PB级别都放在内存中计算的。而是根据场景,如count,avg等聚合运算,是边读数据边计算,再清内存,再读数据再计算,这种耗的内存并不高。但是连表查,就可能产生大量的临时数据,因此速度会变慢,反而hive此时会更擅长。

  • 为了达到实时查询,可能会想到用它直连MySql来操作查询,这效率并不会提升,瓶颈依然在MySql,此时还引入网络瓶颈,所以会比原本直接操作数据库要慢。

  • 虽然Presto可以解析SQL,但它不是一个标准的数据库。不是MySQL、PostgreSQL或者Oracle的代替品,也不能用来处理在线事务(OLTP)。

2、Presto的安装

2.1、Presto Server安装

  1. 官网地址

  2. 下载地址

https://repo1.maven.org/maven2/com/facebook/presto/presto-server/0.196/presto-server-0.196.tar.gz 
  1. presto-server-0.196.tar.gz导入hadoop102的/opt/software目录下,并解压到/opt/model目录
[song@hadoop102 software]$ tar -zxvf presto-server-0.196.tar.gz -C /opt/model/
  1. 修改名称为presto
[song@hadoop102 model]$ mv presto-server-0.196/ presto
  1. 进入到/opt/model/presto目录,并创建存储数据文件夹
[song@hadoop102 presto]$ mkdir data
  1. 进入到/opt/model/presto目录,并创建存储配置文件文件夹
[song@hadoop102 presto]$ mkdir etc
  1. 配置在/opt/model/presto/etc目录下添加jvm.config配置文件
[song@hadoop102 etc]$ vim jvm.config

添加如下内容

-server
-Xmx16G
-XX:+UseG1GC
-XX:G1HeapRegionSize=32M
-XX:+UseGCOverheadLimit
-XX:+ExplicitGCInvokesConcurrent
-XX:+HeapDumpOnOutOfMemoryError
-XX:+ExitOnOutOfMemoryError
  1. Presto可以支持多个数据源,在Presto里面被叫做catalog,这里我们配置支持Hive的数据源,配置一个Hive的catalog
[song@hadoop102 etc]$ mkdir catalog
[song@hadoop102 catalog]$ vim hive.properties 

添加如下内容

connector.name=hive-hadoop2
hive.metastore.uri=thrift://hadoop102:9083
  1. 将hadoop102上的presto分发到hadoop103、hadoop104
[song@hadoop102 module]$ xsync presto
  1. 分发之后,分别进入hadoop102、hadoop103、hadoop104三台主机的/opt/model/presto/etc的路径。配置node属性,node id每个节点都不一样。
[song@hadoop102 etc]$vim node.properties
node.environment=production
node.id=ffffffff-ffff-ffff-ffff-ffffffffffff
node.data-dir=/opt/module/presto/data

[song@hadoop103 etc]$vim node.properties
node.environment=production
node.id=ffffffff-ffff-ffff-ffff-fffffffffffe
node.data-dir=/opt/module/presto/data

[song@hadoop104 etc]$vim node.properties
node.environment=production
node.id=ffffffff-ffff-ffff-ffff-fffffffffffd
node.data-dir=/opt/module/presto/data
  1. Presto是由一个coordinator节点和多个worker节点组成。在hadoop102上配置成coordinator,在hadoop103、hadoop104上配置为worker。

    • hadoop102上配置coordinator节点
    [song@hadoop102 etc]$ vim config.properties
    

    添加内容如下

    coordinator=true
    node-scheduler.include-coordinator=false
    http-server.http.port=8881
    query.max-memory=50GB
    discovery-server.enabled=true
    discovery.uri=http://hadoop102:8881
    
    • hadoop103、hadoop104上配置worker节点
    [song@hadoop103 etc]$ vim config.properties
    

    添加内容如下

    coordinator=false
    http-server.http.port=8881
    query.max-memory=50GB
    discovery.uri=http://hadoop102:8881
    
    [song@hadoop104 etc]$ vim config.properties
    

    添加内容如下

    coordinator=false
    http-server.http.port=8881
    query.max-memory=50GB
    discovery.uri=http://hadoop102:8881
    
  2. 在hadoop102的/opt/model/hive目录下,启动Hive Metastore,用song角色

[song@hadoop102 hive]$
nohup bin/hive --service metastore >/dev/null 2>&1 &
  1. 分别在hadoop102、hadoop103、hadoop104上启动Presto Server
  • 前台启动Presto,控制台显示日志
[song@hadoop102 presto]$ bin/launcher run
[song@hadoop103 presto]$ bin/launcher run
[song@hadoop104 presto]$ bin/launcher run
  • 后台启动Presto
[song@hadoop102 presto]$ bin/launcher start
[song@hadoop103 presto]$ bin/launcher start
[song@hadoop104 presto]$ bin/launcher start
  1. 日志查看路径/opt/model/presto/data/var/log

2.2、Presto命令行Client安装

  1. 下载Presto的客户端
https://repo1.maven.org/maven2/com/facebook/presto/presto-cli/0.196/presto-cli-0.196-executable.jar
  1. presto-cli-0.196-executable.jar上传到hadoop102的/opt/model/presto文件夹下
  2. 修改文件名称
[song@hadoop102 presto]$ mv presto-cli-0.196-executable.jar  prestocli
  1. 增加执行权限
[song@hadoop102 presto]$ chmod +x prestocli
  1. 启动prestocli
[song@hadoop102 presto]$ ./prestocli --server hadoop102:8881 --catalog hive --schema default
  1. Presto命令行操作
    Presto的命令行操作,相当于Hive命令行操作。每个表必须要加上schema。例如:select * from schema.table limit 100

2.3、Presto可视化Client安装

  1. yanagishima-18.0.zip上传到hadoop102的/opt/model目录
  2. 解压缩yanagishima
[song@hadoop102 module]$ unzip yanagishima-18.0.zip
[song@hadoop102 module]$ cd yanagishima-18.0
  1. 进入到/opt/model/yanagishima-18.0/conf文件夹,编写yanagishima.properties配置
[song@hadoop102 conf]$ vim yanagishima.properties
添加如下内容
jetty.port=7080
presto.datasources=atguigu-presto
presto.coordinator.server.atguigu-presto=http://hadoop102:8881
catalog.atguigu-presto=hive
schema.atguigu-presto=default
sql.query.engines=presto
  1. /opt/model/yanagishima-18.0路径下启动yanagishima
[song@hadoop102 yanagishima-18.0]$ nohup bin/yanagishima-start.sh >y.log 2>&1 &
  1. 启动web页面http://hadoop102:7080

  2. 查看表结构

Presto从入门到精通以及案例实操系列
这里有个Tree View,可以查看所有表的结构,包括Schema、表、字段等。

比如执行select * from hive.dw_weather.tmp_news_click limit 10,这个句子里Hive这个词可以删掉,是上面配置的Catalog

Presto从入门到精通以及案例实操系列
每个表后面都有个复制键,点一下会复制完整的表名,然后再上面框里面输入sql语句,ctrl+enter键执行显示结果

Presto从入门到精通以及案例实操系列

3、Presto的优化

3.1、Presto优化之数据存储

3.1.1、合理设置分区

与Hive类似,Presto会根据元数据信息读取分区数据,合理的分区能减少Presto数据读取量,提升查询性能。

3.1.2、使用列式存储

Presto对ORC文件读取做了特定优化,因此在Hive中创建Presto使用的表时,建议采用ORC格式存储。相对于Parquet,Presto对ORC支持更好。

3.1.3、使用压缩

数据压缩可以减少节点间数据传输对IO带宽压力,对于即席查询需要快速解压,建议采用Snappy压缩。

3.2、Presto优化之查询SQL

3.2.1、只选择使用的字段

由于采用列式存储,选择需要的字段可加快字段的读取、减少数据量。避免采用*读取所有字段。
[GOOD]: SELECT time, user, host FROM tbl

[BAD]: SELECT * FROM tbl

3.2.2、过滤条件最好加上分区字段

对于有分区的表,where语句中优先使用分区字段进行过滤。acct_day是分区字段,visit_time是具体访问时间。

[GOOD]: SELECT time, user, host FROM tbl where acct_day=20171101

[BAD]:  SELECT * FROM tbl where visit_time=20171101

3.2.3、Group By语句优化

合理安排Group by语句中字段顺序对性能有一定提升。将Group By语句中字段按照每个字段distinct数据多少进行降序排列。

[GOOD]: SELECT GROUP BY uid, gender

[BAD]:  SELECT GROUP BY gender, uid

3.2.4、Order by时最好使用Limit

Order by需要扫描数据到单个worker节点进行排序,导致单个worker需要大量内存。如果是查询Top N或者Bottom N,使用limit可减少排序计算和内存压力。

[GOOD]: SELECT * FROM tbl ORDER BY time LIMIT 100

[BAD]:  SELECT * FROM tbl ORDER BY time

3.2.5、使用Join语句时将大表放在左边

Presto中join的默认算法是broadcast join,即将join左边的表分割到多个worker,然后将join右边的表数据整个复制一份发送到每个worker进行计算。如果右边的表数据量太大,则可能会报内存溢出错误。

[GOOD] SELECT ... FROM large_table l join small_table s on l.id = s.id

[BAD] SELECT ... FROM small_table s join large_table l on l.id = s.id

3.3、注意事项

3.3.1、字段名引用

避免和关键字冲突:MySQL对字段加反引号、Presto对字段加双引号分割
当然,如果字段名称不是关键字,可以不加这个双引号。

3.3.2、时间函数

对于Timestamp,需要进行比较的时候,需要添加Timestamp关键字,而MySQL中对Timestamp可以直接进行比较。

/*MySQL的写法*/
SELECT t FROM a WHERE t > '2017-01-01 00:00:00'; 

/*Presto中的写法*/
SELECT t FROM a WHERE t > timestamp '2017-01-01 00:00:00';

3.3.3、不支持INSERT OVERWRITE语法

Presto中不支持insert overwrite语法,只能先delete,然后insert into。

3.3.4、PARQUET格式

Presto目前支持Parquet格式,支持查询,但不支持insert。文章来源地址https://www.toymoban.com/news/detail-464216.html

到了这里,关于Presto从入门到精通以及案例实操系列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MyBatisPlus入门案例与简介

    这一节我们来学习下MyBatisPlus的入门案例与简介,这个和其他课程都不太一样,其他的课程都是先介绍概念,然后再写入门案例。而对于MyBatisPlus的学习,我们将顺序做了调整,主要的原因MyBatisPlus主要是对MyBatis的简化,所有我们先体会下它简化在哪,然后再学习它是什么,以

    2023年04月12日
    浏览(36)
  • 【C++入门到精通】智能指针 shared_ptr 简介及C++模拟实现 [ C++入门 ]

    在 C++ 动态内存管理中,除了 auto_ptr 和 unique_ptr 之外,还有一种 智能指针 shared_ptr ,它可以让多个指针共享同一个动态资源,并且能够自动释放资源。 shared_ptr 通过引用计数的方式来管理内存,能够避免程序中出现悬空指针和内存泄漏等问题 。本文将介绍 shared_ptr 的简介和

    2024年01月22日
    浏览(48)
  • C++常用软件分析工具从入门到精通案例集锦汇总

    本文是 C++常用软件分析工具从入门到精通案例集锦 专栏的导航贴( 点击链接,跳转到专栏主页,欢迎订阅,持续更新… )。 专栏介绍 :根据近几年C++软件异常排查的项目实践,详细地讲述如何使用PE工具、Dependency Walker、GDIView、Process Explorer、Process Monitor、API Monitor、Clum

    2024年02月14日
    浏览(44)
  • OpenCV从入门到精通(一) ——OpenCV简介、模块、常用函数、图像视频读取显示保存

    说明:关于OpenCV的教程和书籍已经很多了,所以,我不想重复别人已经做过的事情。如何系统全面的掌握OpenCV?我想这是每个学习OpenCV的人都想要做到的事情。说到底,OpenCV只是一个数字图像处理函数库,要全面掌握OpenCV的使用,只需要明白有哪些函数,每个函数怎么使用。

    2024年02月07日
    浏览(55)
  • Spring MVC简介附入门案例

    目录   一、SpringMVC简介 1.1 MVC模型 1.2 SpringMVC 二、SpringMVC入门案例 2.1 创建项目 2.2 引入依赖和tomcat插件 2.3 修改web.xml文件  2.4 新建springmvc.xml文件 2.5 编写控制器  2.6 配置运行方式 2.7 运行测试  三、SpringMVC执行流程 3.1 SpringMVC的组件 3.2 组件的工作流程 往期专栏文章

    2024年02月09日
    浏览(54)
  • 对抗生成网络GAN系列——DCGAN简介及人脸图像生成案例

    🍊作者简介:秃头小苏,致力于用最通俗的语言描述问题 🍊往期回顾:对抗生成网络GAN系列——GAN原理及手写数字生成小案例 🍊近期目标:写好专栏的每一篇文章 🍊支持小苏:点赞👍🏼、收藏⭐、留言📩 本节已录制视频:DCGAN简介及人脸图像生成案例🧨🧨🧨 ​  

    2024年01月16日
    浏览(40)
  • sqoop入门简介 | 安装部署 | sqoop案例展示

    Sqoop (发音:skup)是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql…)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。 Sqoop项目开始于2009年,最早是作

    2024年02月04日
    浏览(42)
  • 【MyBatis-Plus】入门案例与简介

    1. 入门案例 MybatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发、提供效率。 开发方式 基于MyBatis使用MyBatisPlus 基于Spring使用MyBatisPlus 基于SpringBoot使用MyBatisPlus SpringBoot刚刚我们学习完成,它能快速构建Spring开发环境用以整合其他技术,使用起来是非常简

    2024年02月10日
    浏览(41)
  • STM32 从入门到精通系列讲解 - 总目录

    👦 作者介绍:Bazinga bingo,专注C语言应用硬核干货分享,潜心修炼,虚心学习,立志做嵌入式相关赛道的Top。 📕 本文收录于《STM32开发》专栏,包含STM32内部模块介绍、片内资源开发、不同通信总线应用、屏幕显示等功能性开发。每篇文章包含相关知识点、代码编程详解以

    2024年02月10日
    浏览(41)
  • API 渗透测试从入门到精通系列文章(下)

    导语:在本系列文章的前面一部分我们从使用 Postman 开始,创建了集合和请求,并通过 Burp Suite 设置为了 Postman 的代理,这样我们就可以使用 Burp 的模糊测试和请求篡改的功能。 在本系列文章的前面一部分我们从使用 Postman 开始,创建了集合和请求,并通过 Burp Suite 设置为了

    2024年02月03日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包