大数据即席查询-Presto

楼高2年前技术文章974

一、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

相关文章

大数据监控系列(二)——Prometheus+Grafana在CDH使用实践(包含Altermanager告警)

大数据监控系列(二)——Prometheus+Grafana在CDH使用实践(包含Altermanager告警)

1 概述我们之前在《大数据监控系列(一)——Promehteus+Grafana监控概述》中对Promehteus和Grafana的基本概念做了介绍,这里将介绍Promehteus和Grafana在c...

MongoDB的索引(五)

十一、2d Indexes1、在MongoDB 2.2版本之前或者地址位置字段没有使用GeoJSON进行存储的情况下,我们使用2d索引比较多。2、2d索引一般是用来计算平面上的计算,对于球面的一些几何...

Kubernetes节点与令牌管理

令牌管理查看令牌```Plain Text [root@master ~]# kubeadm token list## **删除令牌**Plain Text [root@master ~]# ku...

数据湖技术之iceberg(五)Hive与Iceberg整合

数据湖技术之iceberg(五)Hive与Iceberg整合

1.  版本支持约束条件Iceberg就是一种表格式,支持使用Hive对Iceberg进行读写操作,但是对Hive的版本有要求,如下:Iceberg 与 Hive 2.x 和 Hive 3....

达梦数据库初始化

达梦数据库初始化

1、dm数据库初始化认证dm数据库默认开启了ssl,在第一次登录时,使用SYSDBA用户登录,需要通过命令指定对应的ssl文件。不然会出现ssl 初始化失败的报错./disql SYSDBA/SYSD...

alluxio短路读

alluxio短路读

原理当Client和Worker在同一节点时,客户端对本地缓存数据的读写请求可以绕过RPC接口,使本地文件系统可以直接访问Worker所管理的数据,这种情况被称为短路写,速度比较快,如果该节点没有Wo...

发表评论    

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