首页 > 其他分享 >【大数据】Presto(Trino)REST API 与执行计划介绍

【大数据】Presto(Trino)REST API 与执行计划介绍

时间:2023-05-19 22:16:59浏览次数:43  
标签:Presto REST 查询 v1 API Trino

目录

一、概述

Presto(现在叫Trino)是一个分布式SQL查询引擎,它允许用户在多个数据源上执行查询。Presto本身是一个独立的Java程序,可以通过REST API与其他应用程序进行通信。

Presto的REST API是一组HTTP接口,可以用于与Presto服务器进行通信,并提交查询请求、获取查询结果等。以下是Presto REST API的一些常见用途:

  • 执行SQL查询:使用REST API,可以提交SQL查询请求,并从Presto服务器获取查询结果。

  • 获取查询进度:使用REST API,可以获取当前查询的进度和状态,例如查询已经执行的百分比、预计完成时间等。

  • 查询元数据:使用REST API,可以获取Presto服务器上的表和列的元数据信息,例如表的名称、列的数据类型等。

  • 管理Presto集群:使用REST API,可以管理Presto集群中的节点,例如添加或删除节点,重新启动节点等。

  • 获取集群状态:使用REST API,可以获取Presto集群的状态、版本号等信息。

Presto REST API使用JSON格式进行数据交互,并提供了许多API端点以满足不同的需求。除此之外,Presto REST API还提供了一些安全控制和权限管理功能,例如对访问API的用户进行身份验证、控制用户的操作权限等。

总之,Presto REST API提供了一种简单、快速、可靠地与Presto进行通信的方式,为Presto的用户提供了更多自由、灵活的操作空间。

在这里插入图片描述

二、环境准备

如已经有环境了,可以忽略,如想快熟部署Presto(Trino)环境可参考我这篇文章:【大数据】通过 docker-compose 快速部署 Presto(Trino)保姆级教程

docker exec -it trino-coordinator bash

# --catalog:数据源 --schema:数据库
${TRINO_HOME}/bin/trino-cli --server http://trino-coordinator:8080 --user=hadoop

三、常用 REST API

以下是一些常见的Presto REST API端点和用途:

  • /v1/catalog:从Presto服务器获取所有数据源的元数据信息,例如数据源名称、表名、列名、数据类型等。

  • /v1/query:提交一个SQL查询请求,Presto服务器会立即返回一个查询ID,并在后台执行查询。使用这个ID,可以获取查询的状态和结果。

  • /v1/query/{queryId}/status:获取查询的状态信息,例如查询是否已经完成、已经执行的百分比等。

  • /v1/query/{queryId}/results:获取查询的结果,以JSON格式返回。这个端点可以多次调用,以获取查询的不同结果部分。

  • /v1/query/{queryId}/cancel:取消正在执行的查询请求。

  • /v1/cluster:获取Presto集群的所有节点信息,包括节点IP地址、端口号、工作状态等。

  • /v1/info:获取Presto服务器的版本号、构建时间、运行时信息等。

  • /v1/stats:获取Presto服务器的使用统计信息,例如查询执行次数、查询响应时间、查询失败次数等。

通过使用这些REST API端点,可以方便地与Presto服务器进行交互,并对Presto进行控制和管理。同时,Presto REST API还提供了若干参数选项和高级功能,可以让用户对Presto服务器的行为进行更加精细的控制和优化。

1)worker 节点优雅退出

官方文档:https://trino.io/docs/current/admin/graceful-shutdown.html

Trino 有一个优雅的关闭 API,可以专门用于 以确保它们在不影响正在运行的查询的情况下终止,给定 足够的宽限期。

# 睡眠 shutdown.grace-period,默认为 2 分钟。如有任务直到所有活动任务完成。
# 关闭应用程序。
curl -v -X PUT -d '"SHUTTING_DOWN"' -H "Content-type: application/json" \
    http://worker:8080/v1/info/state

# 示例:
curl -v -X PUT -d '"SHUTTING_DOWN"' -H "Content-type: application/json" \
    http://docker-compose-presto-trino-worker-2:8080/v1/info/state

2)提交SQL查询请求

curl --request POST \
--url http://presto-server:8080/v1/query \
--header 'content-type: application/json' \
--data '{
    "query": "SELECT COUNT(*) FROM schema.table",
    "timezone": "Asia/Shanghai"
}'

此命令向Presto服务器提交一个SQL查询请求,查询的SQL语句是"SELECT COUNT(*) FROM schema.table",时区设置为"Asia/Shanghai"。执行成功后,Presto服务器会立即返回一个查询ID

3)获取查询状态

curl http://presto-server:8080/v1/query/query-id/status

这个命令使用查询ID查询查询的状态信息,"query-id"是需要替换为具体的查询ID。

4)获取查询结果

curl http://presto-server:8080/v1/query/query-id/results/1

这个命令使用查询ID获取查询结果,"1"表示结果是从第一条开始获取的。执行成功后,Presto服务器会以JSON格式返回查询结果。

5)取消查询请求

curl --request DELETE http://presto-server:8080/v1/query/query-id

这个命令会取消查询ID对应的查询请求,并且终止查询执行。

6)获取Presto 节点信息

curl http://presto-server:8080/v1/node

为检索集群中可用Trino节点的列表提供支持。

7)获取Presto服务器使用统计信息

curl http://presto-server:8080/v1/status

这个命令返回Presto服务器的使用统计信息,例如查询执行次数、查询响应时间、查询失败次数等。

8)获取查询计划

curl http://presto-server:8080/v1/query/query-id/plan

这个命令返回查询ID对应的查询计划,包括查询计划中使用的数据源、过滤器、连接方式等信息。

这里只是列举出部分的api,想了解更多,可参阅官方文档。

四、Presto(Trino)执行计划

Presto(Trino)执行计划的生成基于Presto(Trino)的分布式查询引擎。Presto(Trino)将一个查询分解成多个任务,并在多个节点上并行执行这些任务。执行计划记录每个任务的执行方式,以及每个任务中使用的算子和资源。

以下是Presto(Trino)执行计划的基本生成原理:

  1. 解析:Presto(Trino)将查询语句解析成一棵语法树。这个语法树包含了查询的各个组成部分,如选择器、联结条件、过滤条件等等。

  2. 逻辑优化:Presto(Trino)对语法树进行逻辑优化。例如,它可以通过重组联结条件来改善查询性能,或者消除不必要的过滤器。

  3. 物理优化:Presto(Trino)将逻辑计划转换为物理计划。这个过程中,Presto(Trino)选择合适的算子和连接方式,以在整个集群中共享计算负载。

  4. 任务划分:Presto(Trino)将物理计划分解成多个小任务,并在节点上并行执行这些任务。每个任务都包含一个或多个算子,并指定使用哪些资源和节点。

  5. 执行计划:Presto(Trino)生成执行计划,描述所有任务的执行方式以及每个任务中使用的算子和资源。这个执行计划可以在查询期间进行动态更新,并且会根据查询的进度和节点负载进行调整。

在这里插入图片描述
总之,Presto(Trino)执行计划的生成基于一系列逻辑和物理优化,以及任务分解和分布式执行等技术。通过使用执行计划,您可以更好地了解查询的执行方式和性能瓶颈,从而对查询进行优化。


Presto(Trino)REST API 与执行计划介绍就先到这里了,有任何疑问欢迎私信或留言,也可关注我【大数据与云原生技术分享】加群或私信咨询问题~

标签:Presto,REST,查询,v1,API,Trino
From: https://www.cnblogs.com/liugp/p/17416425.html

相关文章

  • 聊聊原生拖拽API
    拖拽api是我们前端非常常见的api了,比如拖拽排序,拖拽上传文件,树形结构的生成等等都会用到拖拽api,拖拽api本身不复杂难得是在应用上,下面用一个例子来简单使用下这些api先实现布局如下第一步:我们需要把左侧的元素变成可拖拽的,我们可以使用html属性给元素加一个draggable属性把它......
  • SpringBoot 配置统一API对象返回
    1、前言在实际项目开发中,为了便于前端进行响应处理,需要统一返回类格式。特别是在有多个后端开发人员参与的情况下,如果不规范返回类,每个人按照个人习惯返回数据,前端将面临各式各样的返回数据,难以统一处理。为解决这个问题,我们需要规范后端的返回数据,并定义一个统一的返回类,所有数......
  • web页面获取显示钉钉智能会议室申请信息,调用智能会议室api,并传参数
    首页获得会议室房间名称1<!DOCTYPEhtml>2<htmllang="en">3<head>4<metacharset="UTF-8">5<metahttp-equiv="X-UA-Compatible"content="IE=edge">6<metaname="......
  • Restful和WebService区别
    简介Restful是一种架构风格,其核心是面向资源,更简单;而webService底层SOAP协议,主要核心是面向活动;两个都是通过web请求调用接口RESTful是什么REST就是(REpresentationalStateTransfer单词太长记不住就对了)是一种构架风格,REST指的是一组架构约束条件和原则。满足这些约......
  • API架构的选择,RESTful、GraphQL还是gRPC
    hi,我是熵减,见字如面。在现代的软件工程中,微服务或在客户端与服务端之间的信息传递的方式,比较常见的有三种架构设计的风格:RESTful、GraphQL和gRPC。每一种模式,都有其特点和合适的使用场景,今天,我们主要来对三种风格做一个深入的理解和对比,以方便我们在做技术选型时,能够做出有效的......
  • ZCL_REST_CLIENT
    IntroductionHistoryPublicMethodHANDLE_REQUESTProtectedMethod_HANDLE_REQUESTSample建立RESTfulAPIClass設定API路徑LogsAppendixSMICM各環境HostName,PortIntroductionZCL_REST_CLIENTRESTful-APIconsumerenhancement-自動記錄reque......
  • ZCL_REST_SERVER
    IntroductionHistoryPublicMethodIF_HTTP_EXTENSION~HANDLE_REQUESTProtectedMethod_HANDLE_REQUESTSample建立RESTful-APIClass設定API路徑LogsAppendixSMICM各環境HostName,PortIntroductionZCL_REST_SERVERRESTful-APIproviderenhanceme......
  • ZCL_REST_SYSTEM_MONITOR
    IntroductionHistorySwaggerIntroductionClass:ZCL_REST_SYSTEM_MONITOR利用zcl_tools=>get_system_monitor(),給外部取得SAP系統狀況HistoryVersionDateNameDescriptionV0012021/10/13HuangRoy初版SwaggerItemURLSwaggerUIhttp://tao-misdb......
  • [ABC268C] Chinese Restaurant
    [ABC268C]ChineseRestaurant声明:以下的所有操作都会再做一次\(\%n+n)\%n\),比如\(i-1\)会变成\(((i-1)\%n+n)\%n\)题意有\(n\)个人和\(n\)个盘子,每个人如果能拿到\(i-1\)或\(i\)或\(i+1\)号盘子那么他会很开心,现在每个人的站位是\(p_i\),他们的站位位......
  • echart常用的几个api函数
    在对echart进行二次封装时,以下几个api函数很有用。首先是,init和dispose,我们在创建页面及页面卸载时可以使用,让echart的资源能在组件卸载时被释放。this.chart=echarts.init(this.$refs.echart);this.$once('hook:beforeDestroy',()=>{this.chart.dispose();})......