大数据即席查询-Presto

楼高2年前技术文章927

一、Presto 概念

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

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

二、Presto 优缺点

优点:

Presto基于内存运算,减少了硬盘IO,计算更快。

能够连接多个数据源,跨数据源连表查,如从Hive查询大量网站访问记录,然后从Mysql中匹配出设备信息。

缺点:

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

三、Presto、Impala 性能比较

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

四、Presto 优化之数据存储

4.1 合理设置分区

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

4.2 使用列式存储 

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

 4.3 使用压缩 

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

五、 Presto 优化之查询 SQL

5.1只选择使用的字段 

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

正确: SELECT time, user, host FROM tbl 

错误: SELECT * FROM tbl 

5.2过滤条件必须加上分区字段 

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

正确: SELECT time, user, host FROM tbl where acct_day=20230713 

错误: SELECT * FROM tbl where access_time=20230713

5.3Group By 语句优化 

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

正确: SELECT GROUP BY uid, gender 

错误: SELECT GROUP BY gender, uid 

5.4Order by 时使用 Limit 

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

正确: SELECT * FROM tbl ORDER BY time LIMIT 100 

错误: SELECT * FROM tbl ORDER BY time 

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

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

正确: SELECT ... FROM large_table l join small_table s on l.id = s.id 

错误: SELECT ... FROM small_table s join large_table l on l.id = s.id

5.6 注意事项

5.6.1字段名引用 

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

5.6.2 时间函数 

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

/*MySQL 的写法*/ 

SELECT t FROM a WHERE t > '2023-07-13 00:00:00'; 

/*Presto 中的写法*/ 

SELECT t FROM a WHERE t > timestamp '2023-07-13 00:00:00';

5.6.3 不支持 INSERT OVERWRITE 语法 

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

5.6.4  PARQUET 格式 

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

相关文章

Doris 介绍及使用场景

Doris 介绍及使用场景

Doris 介绍                    Apache Doris 是一个基于 MPP 架构的高性能、实时的分析型数据库,以极速易用的特点被人们所熟知,仅需亚秒级响应时间即可返回海量数据...

Docker 容器技术:简化 MySQL 主从复制部署与优化

前言    在现代数据库管理中,MySQL 主从复制是一种关键技术,用于提高数据的可用性和性能。随着 Docker 容器技术的普及,利用 Docker 搭建 MySQL 主从复制环境已成为一种趋势,它...

 Ranger-hive插件部署

Ranger-hive插件部署

解压插件tar -zxf ranger-metastore-plugin.tar.gz -C /opt修改配置vim /opt/ranger-metastore-plugin/install.prop...

Kafka优化参数

一、配置文件Kafka的配置文件为 config/server.properties,在此文件中进行 Kafka 的基础配置,例如端口、日志目录、Zookeeper 信息和 Broker ID 等还可...

HDP部署Tez UI

HDP部署Tez UI

首先部署tomcat在官网下载apache-tomcat-9.0.22.tar.gz[root@hdp02 opt]# wget https://archive.apache.org/dist/tom...

Hbase Rowkey设计方法

良好的 rowkey 设计,应当遵循以上四大原则,并且能让数据分散,从而避免热点问题。下面是几种常用的 rowkey 设计方法。1 Salt 加盐这里说的 Salt 加盐方法,是给每一个 rowkey...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。