文章目录

  • 一 Presto简介
    • 1 Presto概念
    • 2 Presto架构
    • 3 Presto优缺点
    • 4 Presto、Impala性能比较
  • 二 Presto安装
    • 1 Presto Server安装
    • 2 Presto命令行Client安装
    • 3 Presto可视化Client安装
  • 三 Presto优化之数据存储
    • 1 合理设置分区
    • 2 使用列式存储
    • 3 使用压缩
  • 四 Presto优化之查询SQL
    • 1 只选择使用的字段
    • 2 过滤条件必须加上分区字段
    • 3 Group By语句优化
    • 4 Order by时使用Limit
    • 5 使用Join语句时将大表放在左边
  • 五 注意事项
    • 1 字段名引用
    • 2 时间函数
    • 3 不支持INSERT OVERWRITE语法
    • 4 PARQUET格式

即席查询解决灵活查询的需求,查询速度要快,可以查询hive的报表,可以理解为更快的查询引擎,如SparkSQL。

hive查询数据的速度和数据的规模成正比,数据越多查询越慢,presto和kylin用来查询中小型数据,对中小型数据查询的速度非常快,但对规模大的数据查询速度又非常慢。

一 Presto简介

1 Presto概念

Presto是一个开源的分布式SQL查询引擎,数据量支持GB到PB字节,主要用来处理秒级查询的场景。

PB字节的查询所需要的节点是十分巨大的。

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

标准的数据库必然是存算一体的,Presto解决的是算,是一个SQL查询引擎。

2 Presto架构

Presto由一个Coordinator和多个Worker组成。

  • CLI:可以理解为JDBC客户端,连接服务器。由客户端提交查询,从Presto命令行CLI提交到Coordinator。
  • Coordinator解析查询计划,将一句SQL转换成job,然后把job分发给Worker执行,可以理解为主机,主要负责SQL的解析、生成工作计划和任务的划分。所以其可以直接接触 hive 的表格,依赖于Hive Metastore服务。类似于MR中AM,Spark中的Driver。
  • Worker负责执行任务和处理数据,可以理解为从机,Worker完成以后,将数据汇集到Coordinator,Coordinator将结果再给CLI。类似于MapTask和ReduceTask,Spark中的Executor。
  • Catolog表示数据源。一个Catelog包含Schema和Connector。
  • Connector是适配器,用于Presto和数据源(如Hive、Redis)的连接,类似于JDBC。
  • Schema类似于Mysql中数据库,Table类似于MySQL中表。
  • Coordinator是负责从Worker获取结果并返回最终结果给Client。

3 Presto优缺点

优点:

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

缺点:

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

4 Presto、Impala性能比较

Impala性能稍领先于Presto,但是Presto在数据源支持上非常丰富,包括Hive、图数据库、传统关系型数据库、Redis等。

二 Presto安装

1 Presto Server安装

官网地址

下载地址

# 将presto-server-0.196.tar.gz导入hadoop101的/opt/software目录下,并解压到/opt/module目录
[hzy@hadoop101 software]$ tar -zxvf presto-server-0.196.tar.gz -C /opt/module/
# 修改名称为presto
[hzy@hadoop101 module]$ mv presto-server-0.196/ presto
# 进入到/opt/module/presto目录,并创建存储数据文件夹
[hzy@hadoop101 presto]$ mkdir data
# 进入到/opt/module/presto目录,并创建存储配置文件文件夹
[hzy@hadoop101 presto]$ mkdir etc
# 配置在/opt/module/presto/etc目录下添加jvm.config配置文件
[hzy@hadoop101 etc]$ vim jvm.config
# 添加如下内容,可以理解为presto启动java时的参数
-server
-Xmx16G
-XX:+UseG1GC
-XX:G1HeapRegionSize=32M
-XX:+UseGCOverheadLimit
-XX:+ExplicitGCInvokesConcurrent
-XX:+HeapDumpOnOutOfMemoryError
-XX:+ExitOnOutOfMemoryError
# Presto可以支持多个数据源,在Presto里面叫catalog,这里配置支持Hive的数据源,配置一个Hive的catalog
[hzy@hadoop101 etc]$ mkdir catalog
[hzy@hadoop101 catalog]$ vim hive.properties
# 添加如下内容
connector.name=hive-hadoop1
hive.metastore.uri=thrift://hadoop101:9083
# 将hadoop101上的presto分发到hadoop102、hadoop102
[hzy@hadoop101 module]$ xsync presto
# 分发之后,分别进入hadoop101、hadoop102、hadoop103三台主机的/opt/module/presto/etc的路径。配置node属性,node id每个节点都不一样。
[hzy@hadoop101 etc]$vim node.properties
node.environment=production
node.id=ffffffff-ffff-ffff-ffff-ffffffffffff
node.data-dir=/opt/module/presto/data[hzy@hadoop102 etc]$vim node.properties
node.environment=production
node.id=ffffffff-ffff-ffff-ffff-fffffffffffe
node.data-dir=/opt/module/presto/data[hzy@hadoop103 etc]$vim node.properties
node.environment=production
node.id=ffffffff-ffff-ffff-ffff-fffffffffffd
node.data-dir=/opt/module/presto/data
# Presto是由一个coordinator节点和多个worker节点组成。在hadoop101上配置成coordinator,在hadoop102、hadoop103上配置为worker。
# hadoop101上配置coordinator节点
[hzy@hadoop101 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://hadoop101:8881
# hadoop102、hadoop103上配置worker节点
[hzy@hadoop102 etc]$ vim config.properties
# 添加内容如下
coordinator=false
http-server.http.port=8881
query.max-memory=50GB
discovery.uri=http://hadoop101:8881[hzy@hadoop103 etc]$ vim config.properties
# 添加内容如下
coordinator=false
http-server.http.port=8881
query.max-memory=50GB
discovery.uri=http://hadoop101:8881
# 在hadoop101的/opt/module/hive目录下,启动Hive Metastore,用hzy角色
[hzy@hadoop101 hive]$
nohup bin/hive --service metastore >/dev/null 2>&1 &
# 分别在hadoop101、hadoop102、hadoop103上启动Presto Server
# 前台启动Presto,控制台显示日志,容易修改错误
[hzy@hadoop101 presto]$ bin/launcher run
[hzy@hadoop102 presto]$ bin/launcher run
[hzy@hadoop103 presto]$ bin/launcher run
# 后台启动Presto
[hzy@hadoop101 presto]$ bin/launcher start
[hzy@hadoop102 presto]$ bin/launcher start
[hzy@hadoop103 presto]$ bin/launcher start
# 日志查看路径/opt/module/presto/data/var/log

2 Presto命令行Client安装

下载Presto的客户端

# 将presto-cli-0.196-executable.jar上传到hadoop102的/opt/module/presto文件夹下
# 修改文件名称
[hzy@hadoop101 presto]$ mv presto-cli-0.196-executable.jar  prestocli
# 增加执行权限
[hzy@hadoop101 presto]$ chmod +x prestocli
# 启动prestocli
[hzy@hadoop101 presto]$ ./prestocli --server hadoop102:8881 --catalog hive --schema gmall
# Presto命令行操作
show tables;
# Presto的命令行操作,相当于Hive命令行操作。每个表必须要加上schema。
# 例如:
# select * from schema.table limit 100
select * from gmall.ads_activity_stats;

3 Presto可视化Client安装

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

查看表结构

这里有个Tree View,可以查看所有表的结构,包括Schema、表、字段等。

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

每个表后面都有个复制键,点一下会复制完整的表名,然后再上面框里面输入sql语句,ctrl+enter键执行显示结果

三 Presto优化之数据存储

1 合理设置分区

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

2 使用列式存储

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

3 使用压缩

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

四 Presto优化之查询SQL

1 只选择使用的字段

由于采用列式存储,选择需要的字段可加快字段的读取、减少数据量。避免采用*读取所有字段。

[GOOD]: SELECT time, user, host FROM tbl[BAD]:  SELECT * FROM tbl

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 Group By语句优化

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

[GOOD]: SELECT GROUP BY uid, gender[BAD]:  SELECT GROUP BY gender, uid

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

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

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

在MySQL的引擎中,最好将大表放在右边。

[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

五 注意事项

1 字段名引用

避免和关键字冲突:MySQL对字段加反引号`、Presto对字段加双引号分割

当然,如果字段名称不是关键字,可以不加这个双引号。

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 不支持INSERT OVERWRITE语法

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

4 PARQUET格式

Presto目前支持Parquet格式,支持查询,但不支持insert。

【电商数仓】数仓即席查询之Presto简介,安装,Presto优化之数据存储、查询SQL、一些注意事项相关推荐

  1. 数据仓库项目(第五节)数仓理论、电商业务数仓介绍与创建

    目录 数仓理论 表的分类 实体表 维度表 事务型事实表 周期型事实表 同步策略 实体表同步策略 维度表同步策略 事务型事实表同步策略 周期型事实表同步策略 范式理论 范式概念 函数依赖 三范式区分 关 ...

  2. 电商离线数仓项目实战(下)

    电商离线数仓项目实战(下) 电商分析--核心交易 文章目录 电商离线数仓项目实战(下) 电商分析--核心交易 一.业务需求 二.业务数据库表结构 1. 数据库表之间的联系 img 2. 业务数据库-- ...

  3. 电商离线数仓-业务数仓指标(GMV主题/转化率主题)

    GMV和转化率 GMV主题 GMV的概念 GMV表的创建 GMV表里导入数据 转化率 转化率概念 转化率表的创建 转化率表里导入数据 ADS层用户行为漏斗分析 GMV主题 GMV的概念 什么是GMV? ...

  4. 如何选择大数据存储查询引擎

    目录: 1.从需求说起 2.救星OlAP 3.新的问题,高并发 随着大数据技术的成熟,涌现了非常多的成熟框架和技术,在大数据存储查询引擎方面也有非常多的优秀产品.为什么出现这么多的优秀产品,为什么不是 ...

  5. 万亿级日志与行为数据存储查询技术剖析

    http://www.sohu.com/a/126082450_355140 目前大数据存储查询方案大概可以分为:Hbase系.Dremel系.预聚合系.Lucene系,本文作者将就自身的使用经验说说 ...

  6. 万亿级日志与行为数据存储查询技术剖析——Hbase系预聚合方案、Dremel系parquet列存储、预聚合系、Lucene系...

    转自:http://www.infoq.com/cn/articles/trillion-log-and-data-storage-query-techniques?utm_source=infoq& ...

  7. 电商数仓数仓环境搭建

    1.hive环境搭建 1.1.hive引擎简介 Hive引擎包括:默认MR.tez.spark Hive on Spark:Hive既作为存储元数据又负责SQL的解析优化,语法是HQL语法,执行引擎变 ...

  8. 大数据电商离线数仓项目-上篇

    下一篇:电商数仓项目-下篇 文章目录 第1章 数仓分层 1.1 为什么要分层 1.2 数据集市与数据仓库概念 1.3 数仓命名规范 1.3.1 表命名 1.3.2 脚本命名 1.3.3 表字段类型 第 ...

  9. 大数据电商离线数仓项目-下篇

    上一篇:电商数仓系统1 文章目录 第5章 数仓搭建-DWS层 5.1 业务术语 5.2 系统函数 5.2.1 nvl函数 5.2.2 日期处理函数 5.2.3 复杂数据类型定义 5.3 DWS层 5. ...

最新文章

  1. AI技术出海 - 阿里云GPU服务器助力旷视勇夺4项世界第一
  2. Android中将布局文件/View添加至窗口过程分析 ---- 从setContentView()谈起
  3. 数据段描述符和代码段描述符(一)——《x86汇编语言:从实模式到保护模式》读书笔记10
  4. [T-ARA][그녀를 보면][看着那个女人的话]
  5. css获取到指定元素的宽度,在回调返回宽度值
  6. JAVA_SE基础——24.面向对象的内存分析
  7. 我很高兴地宣布我正在编写第一本官方ABP图书
  8. android github轮播图,GitHub - ZTJzzz/Banner: Android轮播图
  9. zabbix自定义SNMP监控项
  10. springmvc 使用Jackson的配置
  11. require smarty.class.php 报错,Smarty 报错
  12. 浅析欢乐时光(HAPPY TIME)病毒 (转)
  13. 软件测试项目实战,适合大家练习的实战项目有。
  14. 经济学人精读丨中国的电子商务
  15. poj 3626 Mud Puddles
  16. 电脑常用快捷键与指示灯
  17. 分布式链路追踪系统深入理解
  18. 举个栗子!Tableau 技巧(116):做一个有趣的锥状柱形图
  19. GLU(Gated Linear Unit,门控线性单元)简介
  20. 教你入侵RedHat Linux

热门文章

  1. jpg转换成pdf转换器怎么选
  2. 立体感怎么画?如何把线条画出立体感?
  3. (轻量级||重量级) 区别
  4. 中国平安旗下vipJr开拓多种招聘渠道缓解就业压力
  5. 【Echarts教科书】Echarts数据统计图表教学(详细)
  6. 解决pip更新后找不到的问题
  7. 第二章 CortexM3/M4基础
  8. matlab engine是什么,MATLAB Distributed Computing Engine
  9. java 动画 很少人_java – 这个我正在制作动画的正方形背后有一条小道,任何人都可以找出原因吗?...
  10. 有趣网站盲盒项目设计