trino入门及插件编写

PRESTO & TRINO

一、简介

presto 主页链接 trinno 主页链接

1.起源

首先来简述一下Presto的发展起源,Presto其实是由FaceBook开源的一个MPP计算引擎,主要用来以解决 Facebook 海量 Hadoop 数据仓库的低延迟交互分析问题,Facebook版本的Presto更多的是以解决企业内部需求功能为主,也叫Presto DB,版本号以http://0.xxx来划分。后来,Presto其中的几个人出来创建了更通用的Presto分支,取名Presto SQL,版本号以xxx来划分,例如345版本,这个开源版本也是更为被大家通用的版本。前一段时间,为了更好的与Facebook的Presto进行区分,Presto SQL将名字改为Trino,除了名字改变了其他都没变。所以我们以后慢慢接受Trino这个引擎吧~(后面统一用Trino吧)

2.特点及原理

Trino这个查询引擎之前在大数据查询一章中讲到过,那时候还叫他Presto,这个查询引擎的特点正如文章标题描述的这样,多源、即席。多源就是它可以支持跨不同数据源的联邦查询,即席即实时计算,将要做的查询任务实时拉取到本地进行现场计算,然后返回计算结果。

  • 架构图

img

整个Trino主要是由Client、Coordinator、Worker以及Connector来构成

  • Client

    Client就是来接受客户端查询请求的

  • Coordinator

    Coordinator来对接受到的查询进行词法、语法分析,然后进行任务和资源的调度

  • Worker

    Worker来做具体的工作了,例如去数据源拉取数据,然后进行计算

  • Connector

    那Connector就是Worker去数据源拉取数据的连接器(适配器/管道)

3.应用与意义
  • 附图

    img

img

上图能够非常形象等展示出Trino这种多源数据即席查询引擎的优点:

(1)屏蔽底层数据源,提供统一的查询接口:通过统一的SQL查询,你可以查询结构化的数据库(例如Oracle、MySql等)、非结构化数据库(Neo4j、MongoDB)、Hive/HDFS、Kafka以及Terradata、GreemPlum等等;

(2)提高效率:一方面,基于内存计算,查询速度快是其一个特点;另一方面,由于它可以跨不同的数据源拉取数据并进行连接、聚合等操作,这也减少了数据搬家、数据迁移等步骤,从整个的计算逻辑上来看也是大大加快了;

(3)提高数据治理能力:在大数据时代,提高数据治理能力、发挥数据价值是重中之重,通过Trino可以很方便的进行异构数据的提取、整合与分析,对于打破数据孤岛、提高数据治理能力至关重要。

二、安装

1. 单节点安装-tar.gz
  • 环境要求
组件版本
Linux64位
Java11
python2.6.x 、2.7.x或3.x版本
  • 详细配置

    https://trino.io/docs/current/installation/deployment.html

  • 安装

#下载压缩包
curl -o ~/trino-server-354.tar.gz https://repo1.maven.org/maven2/io/trino/trino-server/354/trino-server-354.tar.gz

#解压
tar xf ~/trino-server-354.tar.gz

#自行安装jdk 与python 环境

# 切换trino主目录
cd trino-server-354

#准备相关配置 
tree etc

etc
├── catalog
│   └── jmx.properties
├── config.properties
├── jvm.config
├── log.properties
└── node.properties


#启动测试
./bin/launcher run

  • 查看

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

TODO

2. docker安装
#拉取镜像
docker pull trinodb/trino:latest

#测试运行
docker run -p 8080:8080 trinodb/trino

#执行运行
docker exec -it a901420d43c4 trino  
trino> show catalogs
    -> ;
 Catalog 
---------
 jmx     
 memory  
 system  
 tpcds   
 tpch    
(5 rows)

3.集群安装

参见 https://trino.io/docs/current/installation/deployment.html

三、简单使用

1.连接器
序号链接器说明
1Accumulo Connector
2BigQuery Connector
3Black Hole Connector
4Cassandra Connector
5ClickHouse connector
6Delta Lake Connector
7Druid Connector
8Elasticsearch Connector
9Hive Connector
10Hive Security Configuration
11Hudi connector
12Iceberg Connector
13JMX Connector
14Kafka Connector
15Kafka Connector Tutorial
16Kudu Connector
17Lark Sheets connector
18Local File Connector
19Memory Connector
20MongoDB Connector
21MySQL Connector
22Oracle Connector
23Apache Pinot Connector
24PostgreSQL Connector
25Prometheus Connector
26Redis Connector
27Redshift Connector
28SQL Server Connector
29System Connector
30Thrift Connector
31TPCDS Connector
32TPCH Connector
2.快速配置使用 -mysql 为例
  • 创建配置

    vi mysql.properties

    connector.name=mysql
    connection-url=jdbc:mysql://192.168.11.229:3306
    connection-user=root
    connection-password=123456
    
  • 重启服务

    docker restart a901420d43c4 && docker logs -f a901420d43c4
    
  • 查看

    docker exec -it a901420d43c4  trino
    trino> show catalogs;
     Catalog 
    ---------
     jmx     
     memory  
     mysql   
     system  
     tpcds   
     tpch    
     
    trino> show SCHEMAS from mysql;
             Schema         
    ------------------------
     big-whale              
     cels-zipkin            
     certificate            
     ctj                    
     ctj-test               
     cup                    
     cup_boot               
     cup_db                 
     cup_meta               
     dap_auth               
     data_cloud             
     db-mcms-open           
     dps_v5                 
     ems_v6                 
     esmcnts                
     ewp_give_alarm_details 
     ……
     
    trino> show tables from mysql.dap_auth;
            Table         
    ----------------------
     cup_attach           
     cup_client           
     cup_code             
     cup_datasource       
     cup_dept             
     cup_dict             
     cup_dict_biz         
     cup_ds               
     cup_ds_def           
     cup_log_api          
     cup_log_error        
     cup_log_usual        
     cup_menu             
     cup_notice           
     cup_oss           
     ……
    
    
    
    
3. 分页测试
docker exec -it a901420d43c4  trino

# 分页查询  
trino> select * from mysql.dap_auth.cup_user  offset 1 limit 10;
trino> select * from mysql.dap_auth.cup_user  offset 2 limit 10;

  • 对比查询结果

    • 查询结果 1

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    • 查询结果 2

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 更多参考官方说明

    https://trino.io/docs/current/connector.html

四、源码编译

1.前置条件
环境版本备注
systemLinux、windows、mac
javajdk17jdk11 以上
mavenapache-maven-3.8.1
2.注意事项
  • Trino 参考博客 链接

  • 关闭license 检查

    <air.check.skip-spotbugs>true</air.check.skip-spotbugs>
    <air.check.skip-pmd>true</air.check.skip-pmd>
    
3.开始编译
  • clone 代码

    git clone https://github.com/trinodb/trino.git

    cd trino

  • maven 编辑打包

    mvn clean install -DskipTests
    
  • 启动测试

    • 配置catalog

      工程目录创建 etc/catalog

      jmx.properties

    • 启动参数

    main class: io.trino.server.DevelopmentServer
    vm options: -Dconfig=testing/trino-server-dev/etc/config.properties -Dlog.levels-file=testing/trino-server-dev/etc/log.properties -Djdk.attach.allowAttachSelf=true
    
    • 启动日志

      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 通过client 连接

    #切到客户端工具 工程目录
    cd client/trino-cli/target
    #执行jar --server 指定
    ./trino-cli-411-SNAPSHOT-executable.jar --server http://localhost:8080
    trino>  show catalogs;
     Catalog 
    ---------
     jmx     
     system  
    (2 rows)
    
    

五、插件实现

1.插件开发参考

csdn-blog

2.样例插件实现
  • 实现插件核心类

    • Plugin

    • Module

    • ConnectorFactory

    • ConnectorMetadata

    • ConnectorSplitManager

    • ConnectorRecordSetProvider

    • ConnectorTableHandle

    • ColumnHandle

    • ConnectorHandleResolver

    • ConnectorSplit

    • ConnectorSplitManager

    • ConnectorTableLayoutHandle

    • ConnectorTransactionHandle

    • RecordCursor

    • RecordSet

3.扩展插入数据
  • Connector

    • getPageSinkProvider() 插入数据需要
  • ConnectorPageSinkProvider

    • createPageSink
  • ConnectorMetadata

    • createTable() 创建表
    • dropTable() 删除表
    • beginInsert() 插入数据前 返回表列定义
    • finishInsert()
  • ConnectorPageSink

    • appendPage 方法
  • DemoColumnHandle

    • 重写 equals; hashCode (很重要)
  • 注意点

    • SchemaTableName 会将schemaName、tableName 对象转小写,需要映射实现 ,获取数据需要

    • ColumnMetadata 会将查询列转小写 查询返回需 as Column.toLowerCase()

  • 开始编写

    • 实现接口 ConnectorMetadata

      ConnectorMetadata 定义接口实现指定中间件的类SQL操作

      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    • 读操作插件需要实现相关方法

      T method(){
        //jdbc or http 等客户端操作 返回接口需要的数据
      }
          
      //获取库schema对象
      List<String> getSchemaNames();
      
      //获取指定table对象行数据
      Iterator<Row> select(String tableName);
      
      //获取指定schema对象所有table对象
      List<String> getTableName(String schemaName);
      
      //获取指定table对象字段描述信息
      List<Column> getColumnsByTableName(String tableName)
      

六、验证插件

1、启动服务加载配置
  • 启动主类

    • com.facebook.presto.server.PrestoServer
  • VM Options

    • -XX:+UseG1GC -XX:G1HeapRegionSize=32M -XX:+UseGCOverheadLimit -XX:+ExplicitGCInvokesConcurrent -Xmx2G -Dconfig=etc/config.properties -Dlog.levels-file=etc/log.properties
  • 增加测试配置文件

    #connector.name 名称必须与自定义 ConnectorFactory getName 匹配
    connector.name=demo
    connection-url=jdbc:mysql://192.168.11.229:3306
    connection-user=root
    connection-password=123456
    
    
  • 修改配置加载插件

    vi presto-main/etc/config.properties
    
    plugin.bundles=\
      ../presto-mysql/pom.xml,\
      ../presto-demo/pom.xml
    
2、客户端连接测试
#连接服务
./presto-cli-0.278.1-SNAPSHOT-executable.jar --server http://localhost:8080

#查看连接器
presto> SHOW catalogs;
 Catalog 
---------
 demo    
 mysql   
 system  
(3 rows)

#查看所有schema 
presto> SHOW schemas from demo;
       Schema       
--------------------
 db1                
 db2                
 db3                
 information_schema 
 (4 rows)

#查看schema下的表
presto> SHOW tables from demo.db1;
 Table  
--------
 table1 
 table2 
(2 rows)

#查看指定表结构
presto> SHOW COLUMNS FROM demo.db1.table1;
 Column |  Type   | Extra | Comment 
--------+---------+-------+---------
 name   | varchar |       |         
 age    | integer |       |         
(2 rows)

#查看数据
presto> select * from demo.db1.table1;
   name   | age 
----------+-----
 zhangsan |  18 
(1 row)




七、后续集成实现插件

1、clone bigdata组下presto工程
git clone http://192.168.11.101:8083/bigdata/presto.git
2、复制 presto-demo模板模块

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3、DemoDBHelper 实现相关方法代码
package com.facebook.presto.demo.thirtpart;

import com.facebook.presto.common.type.IntegerType;
import com.facebook.presto.common.type.VarcharType;
import com.facebook.presto.demo.DemoConfig;
import com.facebook.presto.demo.DemoRow;
import com.facebook.presto.spi.ColumnMetadata;
import com.google.common.collect.ImmutableList;

import javax.inject.Inject;
import java.util.*;

/**
 * 操作数据库
 */
public class DemoDBHelper {

    private String url;
    private String user;
    private String password;

    @Inject
    public DemoDBHelper(DemoConfig demoConnectorId) {
        this.url = demoConnectorId.getUrl();
        this.user = demoConnectorId.getUser();
        this.password = demoConnectorId.getPassword();
    }

    /**
     * 返回所有schema 对象
     * @return
     */
    public List<String> listSchemaNames() {
        //TODO 
        return null;
    }

    /**
     * 返回表定义结构信息
     * @param schemaName
     * @param tableName
     * @return
     */
    public List<ColumnMetadata> getColumnMetaData(String schemaName, String tableName) {
        //TODO 
        return null;
    }

    /**
     * 返回指定schema 下所有表
     * @param schemaName
     * @return
     */
    public List<String> getTableNames(String schemaName) {
        //TODO 
        return null;
    }

    /**
     * 返回指定 List<Map> 对象
     * @param schemaName
     * @param tableName
     * @return
     */
    public Iterator<DemoRow> select(String schemaName, String tableName) {
        //TODO 
        return null;
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Trino Impala是一种音乐组合,组合集结了来自英国的天才音乐人Trino Green和Impala Johnson。他们以独特的音乐风格和出色的表演才华而闻名。 Trino Impala的音乐融合了多种音乐元素,包括摇滚、放克、灵魂和电子音乐。他们的音乐充满了活力和创新,总能给听众带来耳目一新的感觉。 Trino Impala在音乐上展现了他们对各种音乐流派的深入理解和掌握。他们的歌曲旋律优美动人,创作风格独特。他们以实验性摇滚为基础,将各种不同的音乐元素自由地混合在一起,创造出新颖而又独特的音乐风格。 Trino Green是一位出色的吉他手和作曲家。他的吉他演奏技巧非常高超,能够将吉他的音色变化发挥到极致。他的创作充满了惊喜和创新,并经常利用各种不同的音效和技巧来丰富音乐的表达方式。 Impala Johnson则是一位才华横溢的歌手和键盘手。她的声线清澈动人,唱腔充满灵性。她的键盘演奏技巧独特,能够通过琴键传递出丰富的情感。 Trino Impala的表演气氛十分活跃和狂热。他们的舞台表演充满了能量和活力,总能让观众沉浸在音乐的世界中。他们的音乐受到了广大听众的热爱和追捧,并在国内外音乐界取得了很大的成功。 总之,Trino Impala是一支深受欢迎的音乐组合,他们以独特的音乐风格和卓越的艺术才华在音乐界崭露头角。他们的音乐充满了活力和创新,总能给听众带来美妙的音乐体验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值