Presto是一个分布式SQL查询引擎,适用于交互式分析查询,数据量支持PB到GB字节,不具备存储功能,可以接入多种数据源,并支持跨数据源的数据查询计算
特点:
查询速度快,可以快速给出结果
内存需求大,计算成本高
给予其他组件之上进行快速运算
替代Hive、MapReduce,擅长OLAP
优点:
1.Presto与Hive相比,都能够处理PB级别的海量数据分析,但Presto是基于内存计算,减少没必要的硬盘IO,所以更快
2.能够连接多个数据源,跨数据源连表查
3.部署比Hive简单,因为Hive是基于HDFS的,需要部署HDFS
缺点:
1.虽然能够处理PB几倍的海量数据分析,但不代表Presto能把PB级别的数据都放在内存中计算,而是根据场景,如count,avg等聚合运算,是边读数据变计算,在清除内存,在读数据在计算,这种消耗的内存并不高,但是连表查询可能就产生大量的临时数据,因此速度会变慢,反而Hive会更适合
2.为了到达实时查询,可能会想到用它直连MySql来操作查询,这种效率并不会提升,瓶颈依然在Mysql,此时还引入了网络瓶颈,所以会比原来操作数据要慢
Presto优化:
数据存储:
1.合理设置分区:与Hive类似,Presto会根据元数据信息读取分区数据,合理的分区能减少Presto的数据读取两,提升查询性能
2.使用列式存储,Presto对ORC文件读取做了特定优化,因此在Hive中创建Presto使用的表时,建议采用ORC式存储,相对于Parquet,Presto对ORC的支持更好
3.使用压缩:数据压缩可以减少节点间数据传输对IO带宽压力,对于即席查询需要快速解压,建议采用Snappy压缩
SQL优化:
1.子查询,只选择需要的字段
由于采用列式存储,选择则需要的字段可加快字段的读取,减少数据量,避免采用*读取所有字段
2.查询加上分区字段
对于有分区的表,where语句优先使用分区字段进行过滤。acc_day是分区字段,visit_time是具体访问时间
3.GroupBy语句优化
合理安排GroupBy语句中字段顺序对性能有一定提升,将GroupBy语句中字段按照每个字段distinct数据多少进行降序排列
4.orderby时使用limit
orderby需要扫描数据到单个worker节点进行排序,导致单个worker需要大量内存,如果是查询TopN或者BottomN,使用limit可减少排序计算和内存压力
5.join时将大表放在左边