Bootstrap

OLAP(二):Presto 、和impala性能测试

一、 Presto  简介

1.1.1 Presto  概念

        Presto 是一个开源的分布式 SQL 查询引擎,数据量支持 GB 到 PB 字节,主要用来处理
秒级查询的场景。注意:虽然 Presto 可以解析 SQL,但它不是一个标准的数据库。不是MySQL、Oracle的代替品,也不能用来处理在线事务(OLTP)。

1.1.2 Presto  架构

1.1.3 Presto  优缺点

1.2 Presto  安装

1.2.1 Presto Server 

1.2.2 Presto  命令行 行 Client  安装

1.2.3 Presto  可视化 Client  安装

1.3 Presto  优化之 数据存储 

1.3.1  合理设置分区

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

1.3.2  使用列式存储

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

1.3.3  使用压缩

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

1.4 Presto  优化之询 查询 SQL

1.4.1  只选择使用的字段

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

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

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

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

[GOOD]: SELECT time, user, host FROM tbl where acct_day=20171101 and  visit_time=20171101 
[BAD]: SELECT * FROM tbl where visit_time=20171101 

1.4.3 Group By  语句优化

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

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

1.4.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 

1.4.5  使用 Join  语句时将大表放在左边。和spark hive相反

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

[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.5  注意事项
1.5.1  字段名引用
避免和关键字冲突:MySQL 对字段加反引号` 、Presto 对字段加双引号分割
当然,如果字段名称不是关键字,可以不加这个双引号。
1.5.2  时间函数
对于 Timestamp,需要进行比较的时候,需要添加 Timestamp 关键字,而 MySQL 中对
Timestamp 可以直接进行比较。
/*MySQL 的写法*/
SELECT t FROM a WHERE t > '2020-01-01 00:00:00';
/*Presto 中的写法*/
SELECT t FROM a WHERE t > timestamp '2020-01-01 00:00:00';
1.5.3  不支持 INSERT OVERWRITE  语法
Presto 中不支持 insert overwrite 语法,只能先 delete,然后 insert into。
1.5.4 PARQUET  格式
Presto 目前支持 Parquet 格式,支持查询,但不支持 insert。 

二、 Presto的连接和使用

推荐使用DBeaver

 驱动设置:

 之后就连接到hive,输入指令可查看Schemas

 

 输入sql即可进行查询:

 Presto能够完成不能框架下的数据查询,例如进行mysql和hive的查询:

2、Presto JDBC使用(java)

maven依赖: <artifactId>presto-jdbc</artifactId>

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class PrestoJDBC {

  public static void main(String[] args) throws Exception {
    //1.加载驱动
    Class.forName("com.facebook.presto.jdbc.PrestoDriver");

    String url = "jdbc:presto://192.168.88.80:8090/hive/myhive";
    Connection connection = null;
    try {
      //2.创建链接
      connection =
        DriverManager.getConnection("jdbc:presto://192.168.88.80:8090/hive/myhive","test",null
        );
      //3.statement
      Statement stmt = connection.createStatement();
      //4.执行SQL
      ResultSet rs = stmt.executeQuery("show tables");

      while (rs.next()) {
        System.out.println(rs.getString(1));
      }

      ResultSet rs = stmt.executeQuery("SELECT * from employee limit 10");
      while (rs.next()) {
        System.out.println(rs.getString(1) + "\t" + rs.getString(2));
      }
      rs.close();
    } catch (SQLException throwables) {
      throwables.printStackTrace();
    } finally {
      //5.关闭连接 
      connection.close();
    }
  }
}

三、 Psto 、Impala  性能比较

https://blog.csdn.net/u012551524/article/details/79124532
测试结论:Impala 性能稍领先于 Presto,但是 Presto 在数据源支持上非常丰富,包括Hive、图数据库、传统关系型数据库、Redis 等

1、单表的聚合操作

Presto:count;1s

 Impala:count:0.24s

Presto:count(distinct ):取了3次,分别是:4、3、3 (s)

 Impala:count(distinct ):取了3次:0.74、0.75、0.76(s)

 2、单值查询

Presto :查询一个ID的记录: 3次:6、5、6(s)

 Impala: 3次都在1.7s左右

 3、两表关联(2张2000W的表做join)

Presto: 3次结果:9、11、9

Impala:3次结果在7s左右

 4、3表关联(3张2000W的表做join)

Presto: 4次结果:13、11、15、12(s)

 Impala: 3次结果在8.9s左右 

总结:这是一些场景下的查询效率的比较,数据量不是很大,但是能看出一些问题,他们的共同点就是吃内存,当然在内存充足的情况下,并且有规模适当的集群,性能应该会更可观,从上图可以看出Impala性能稍领先于presto,但是presto在数据源支持上非常丰富,包括hive、图数据库、传统关系型数据库、Redis等

缺点:这两种对hbase支持的都不好,presto 不支持,但是对hdfs、hive兼容性很好,其实这也是顺理成章的,所以数据源的处理很重要,针对hbase的二级索引查询可以用phoenix,效果也不错

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

四、impala presto SparkSql性能测试对比

测试过程比较简单,分为四个场景sql查询:

查询id查询语句数据量(压缩前)
query1select sum(pv) from d_op_behavior_host_text_snappy35G
query2select siteid,sum(pv) as pv1 from d_op_behavior_host_text_snappy 
where pv>0  group by siteid order by pv1 desc limit 11;
35G
query3select count(*) from dwd.d_ad_3rd_party_fancy_all_data where 
thisdate='2015-11-10' and hour='17';
200G
query4select count(*) from dwd.d_ad_impression where thisdate>='2015-09-01' and thisdate<='2015-10-31'

测试结果对比如下:

查询工具第一次执行时间第二次执行时间
query1impala4.82s5.56s
presto6s5s
sparkSql13s9s
query2impala12.79s12s
presto15s13s
sparkSql20s23s
query3impala挂掉挂掉
presto63s58s
sparkSql88s77s
query4impala131s148s
presto136s128s
sparkSql187s188s

 测试结果对比如下:

impala与presto性能相当,SparkSql逊色不少。

目前看presto相比impala

1、与hive实时共享元数据,impala需要用另外定时任务广播元数据,新生成的数据,用impala不能立即查询。

2、没有出现操作大数据集有时挂掉的情况

3、presto与hive都由fackbook开源,兼容性应该会更好点

;