阅读 160

Prism:Uber 的 Presto 查询网关服务

Presto 在 Uber 的使用情况

图片

上面是 Presto 在 Uber 的使用情况:

每月1.2W的活跃使用用户;每天40W的查询;每天处理50PB的 HDFS 数据;拥有2个数据中心;4500个节点;12个集群。

图片主要使用的 Presto 工具包括:presto-go-client、pyhive 以及 JDBC 客户端, tableau 等

图片

Presto 处理的工作负载主要为交互式查询和批处理;这两种负载是分别使用不同的 Presto 集群处理的:交互式查询是使用交互式 Presto 集群处理的;批处理是发到批处理 Presto 集群处理,不同负载使用不同集群处理可以使得作业之间不受影响。


为什么会要引入 Presto 网关服务

图片

在 Uber 存在多种不同的客户端,这些客户端需要把不同的查询发到不同的 Presto 集群。


图片

但是客户端可能存在无效的映射配置,比如批处理查询客户端把查询发到交互式 Presto 集群,这样就会存在一些问题。而且由于客户端比较多,非常不好控制。

图片

引入了 Prism 之后,整个 Presto 集群的入口就只有一个,所以比较比较好做一些控制。

Presto 网关服务服务的架构设计


图片

下面我们来简要介绍一下 Prism 网关服务的主要功能。

图片

从上图可以看出,Presto 网关服务 主要提供了六大功能:

查询运行;

路由功能;负载均衡;故障转移;查询控制;速度限制。


图片

Prism 主要使用 presto-go-client 客户端和 Presto 集群进行交互;Prism 主要提供两种模式的查询代理:

异步执行 API 返回数据流

异步执行 API 返回文件描述符


图片

返回数据流这种模式的整个流程如下:

用户把查询提交到客户端;

客户端通过 presto-go-client 调用 Prism;Prism 识别出最合适的 Presto 集群来运行这个查询;Prism 通过 HTTP 重定向返回响应,以使 presto-go-client 可以直接在 presto 群集上继续执行。一旦查询完成,执行结果将直接返回客户端。


图片

返回文件描述符这种模式的整个流程如下:

用户把查询提交到客户端;客户端将 Presto 查询发送到 Prism,并且得到一个 query-id;Prism 通过 presto-go-client 把查询发送到 presto 集群;当查询运行完成,Prism 将结果写到 HDFS 上,客户端这时候可以拿到这个 HDFS 路径;客户端通过调用 Prism 获取查询查询的状态;一旦查询完成,客户端通过 HDFS 获取到查询的结果,并返回给用户。

图片

在 Uber 内部,Presto 根据工作负载将集群分为两个类型:

交互式集群:处理 Ad hoc 查询;

批处理集群:处理定时查询(Scheduled queries)

路由功能的实现主要是,Prism 里面存储了从特定源到工作负载类型的映射关系:


Prism 从 HTTP 请求头识别提交的客户端来源。

Prism 将查询转发到正确的集群类型。


图片


负载均衡功能的实现思想如下:

Prism 从 Presto coordinators 中拿到不同集群的当前负载情况;

负载是由运行中的查询数、排队的查询数以及 worker 数决定;使用负载统计,它将用户提交的查询路由到最佳的集群。


图片

故障转移的实现如下:

Prism 可以将流量从一个集群转移到另一个集群;这个功能在以下场景下是非常有用的:部署 Presto 集群、重启 Presto 集群以及 Presto 集群维护。

图片

Prism 其他功能主要有:

可以将一些用户或者一些来源的查询屏蔽;Prism 仅允许用户设置一些确定的会话属性;一些会话属性的值被限制;基于每个源和每个用户运行的查询数量进行速率限制。

图片


©著作权归作者所有:来自51CTO博客作者mob604756e9d3bc的原创作品,如需转载,请注明出处,否则将追究法律责任


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐