Presto 分布式SQL查询引擎

Presto的介绍
  1. Presto是Facebook开发的分布式SQL查询引擎,用来进行高效、实时的数据分析;
  2. Presto可以连接Hive、Mysql、Kafka等多种数据源,最常用的是通过Presto连接Hive数据源,可以解决Hive的MapReduce查询耗时太慢的问题;
  3. Presto是一个基于内存的计算引擎,它本身不存储数据,通过丰富的Connector获取第三方服务的数据,例如可以获取Hive数据源保存在HDFS上的数据,将数据加载到内存进行计算,查询数据很快。
Presto的数据模型
  1. Catalog:数据源,例如Hive、Mysql都是数据源,Presto可以连接多个Hive和多个Mysql;
  2. Schema:类似于DataBase,一个Catalog下有多个Schema;
  3. Table:数据表,一个Schema下有多个数据表。

Presto查询语句示例:

# 连接多个数据源进行查询
select * from hive.testdb.tableA a join mysql.testdb.tableB where a.id = b.id
# 查看Presto支持的所有数据源
show catalogs
# 查看所有Schema
show schemas
通过Presto客户端查询Presto命令
# 端口号默认是7670 --catalog指定连接的数据源 --schema指定连接的数据库
./presto-cli-0.212-executable.jar ip:端口号 --catalog hive --schema default
Presto的架构

Presto也是主从架构,由三部分组成:一个Coordinator节点、一个Discovery Server节点,多个Worker节点;

Coordinator为主节点,负责解析SQL语句,生成查询计划,分发执行任务;

Discovery Server负责维护Coordinator和Worker的关系,通常内嵌于Coordinator节点;

Worker节点负责执行查询任务以及与数据源进行交互读取数据。

Presto连接Hive数据源的架构图:

请添加图片描述

工作原理:Presto Coordinator接收Presto客户端发送的SQL语句,根据Hive的元数据信息,解析SQL语句,生成查询计划,并将任务分发给多个Worker节点,Worker节点会读取HDFS上的数据到内存中来进行计算,并将结果返回给Coordinator节点,Coordinator节点再将数据返回给Presto客户端。

Presto连接多数据源的架构图:

请添加图片描述

Java程序访问Presto

Java程序中,是通过JDBC的方式访问Presto的,就类似于通过JDBC访问Mysql数据库一样,举例如下:

<!--导入依赖-->
<dependency>
    <groupId>com.facebook.presto</groupId>
    <artifactId>presto-jdbc</artifactId>
    <version>0.212</version>
</dependency>
public static void main(String[] args) throws SQLException {
    // 注册presto驱动
    try {
        Class.forName("com.facebook.presto.jdbc.PrestoDriver");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    // 获取presto连接(指定url、用户名、密码)
    Connection connection = DriverManager.getConnection("jdbc:presto://192.168.110.112:7670/hive/default", "root", "123456");
    // 执行SQL查询
    Statement statement = connection.createStatement();
    ResultSet res = statement.executeQuery("show tables");
    while (res.next()) {
        System.out.println(res.getString(1));
    }
    res.close();
    // 假设表tableA有两个字段
    ResultSet resultSet = statement.executeQuery("select * from tableA");
    while (res.next()) {
        System.out.println(resultSet.getString(1) + "---" + resultSet.getString(2));
    }
    resultSet.close();
    connection.close();
}
Presto注意点

一般来说,使用Presto操作Hive等数据源是为了加快查询速度,并不支持通过Presto去更新Hive等数据源,例如通过Presto去操作Hive添加分区会失败。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值