首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Presto 设计与实现(一):开篇

Presto 是一款快速的、稳定的 SQL 查询引擎。

上面的图片来自于 Presto 官网,Presto 将组件划分为三层:

底层:存储结构化数据的数据源,数据源来自于关系型数据库、非关系型数据库、OLAP、分布式数据库、消息中间件、HDFS 以及各种云存储;

中间层:Presto,支持异构数据源的查询以及异构数据源之间的联合查询;

应用层:借助于 Presto 查询引擎,在复杂的异构数据源中操作数据构建上层应用。

统计接口调用次数:未使用 Presto

在之前的项目中为了计算每天用户调用接口的次数,使用 Redis 累加调用次数,用户基本信息存储在 MySQL 中,下面是实际的实现。

MySQL 中的 user 表:

Redis 中的 key 设计:

调用接口总次数:api_tag_count

每天调用接口次数:api_tag_count_20230812

用户调用接口总次数:user_1_api_tag_count

用户每天调用接口次数:user_1_api_tag_count_20230812

使用 Jedis 客户端累加接口调用次数:

实际应用:管理员可以按照时间、用户查询接口的调用次数

上面实现的代价:

创建 User、ApiStats 实体类;

使用 mybatis 框架构建 userDao;

使用 userDao 获取用户详情;

使用 jedis 客户端获取调用次数。

如果我们使用 Presto 实现会变的简单些吗 ?

使用 Presto 实现

1. 配置 MySQL Catalog

配置后可通过 mysql.ice.user 访问 user 表。

2. 配置 Redis Catalog

你需要配置虚拟的表名,完整的表名为 redis.schema1.api,Presto 内置了映射的列,_key 对应 Redis 中实际的键,_value 对应键的值,更详细的可参考:https://prestodb.io/docs/current/connector/redis.html。

在 Worker 节点验证下配置的是否正确:

3. 编写实现代码

pom.xml 中加入 presto-jdbc:

编写实现服务:ApiStatsService,该服务可通过用户 id、接口名称和日期查询调用次数。

ApiStatsService 实现的主要逻辑通过 MySQL 和 Redis 中的表关联,关联条件基于用户 id 和 Redis 键的构建规则。

4. 实际使用

输出:

基于 Presto 的实现:面向 SQL 编程,代码实现简单,原本几个阶段的查询现在转变为一次查询,实际上是 Presto 帮你进行了异构数据源的融合,而对于开发者只需要关心 Catalog 配置的是否正确,查询的 SQL 拼装的是否正确。

Presto 为你做了什么

Presto 管理了数据源的元数据信息:数据源类型、连接地址、用户名和密码等信息;

Presto 定义了异构数据源的访问标准:Catalog、Scehma 和 Column;

Presto 定义了 SQL 语句查询的标准:DDL、DML、方法和运算符等;

Presto SQL 的查询变成了分布式查询,理论上加速了查询,同时限制 SQL 查询过程中内存的使用。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/Obq5hfB4J39sVc_lnRrQsHkA0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券