大数据即席查询-Presto

楼高2年前技术文章1033

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

相关文章

Spark on yarn 动态资源配置

Spark on yarn 动态资源配置

1、背景spark on yarn 的环境下,开源的spark 默认是关闭动态分配申请资源的。每次提交时,需要手动定义--num-executors 的数量。为了提交任务方便,需要开启动态分配资源sp...

nginx服务企业应用

1、软件的分类1.1 常用来提供静态服务的软件Apache :这是中小型Web服务的主流,Web服务器中的老大哥,Nginx :大型网站Web服务的主流,曾经Web服务器中的初生牛犊,现已长大。Ngi...

域名购买及备案

域名购买及备案

购买域名域名控制台 -- 域名列表 -- 注册域名注意域名购买时候域名系统中填写的持有者单位名称需与提交审核证件中的单位名称严格完全一致的模板认证中企业/组织相关材料及填写要求可参考此文档https:...

创建跨集群用户

1.       登陆源集群和目标集群创建迁移时需要使用的用户(例:hadoop_copy),赋予用户集群超级管理员权限和hdfs超级用户权...

ES运维(三)架构与规划(阿里云)

ES运维(三)架构与规划(阿里云)

1、 阿里云Elasticsearch架构图阿⾥云Elasticsearch和Kibana容器化运⾏在ECS中,监控agent(独⽴进程)负责收集监控指标,通过SLS发送给云监控完成监控报警。实例之间...

数据湖技术之iceberg(十三)Iceberg与Hudi对比

Iceberg和Hudi都是数据湖技术,从社区活跃度上来看,Iceberg有超越Hudi的趋势。他们有以下共同点:l   都是构建于存储格式之上的数据组织方式l &nbs...

发表评论    

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