大数据Hadoop之——基于内存型SQL查询引擎Presto(Presto-Trino环境部署)


目录
  • 一、概述
  • 二、Trino特点
  • 三、Trino架构
    • 1)架构和服务节点
    • 2)Trino数据模型
  • 四、Trino安装部署
    • 1)单机版(Coordinator和Worker同进程)
      • 1、安装JDK11
      • 2、安装python
      • 3、下载Trino安装包
      • 4、配置
      • 5、配置jmx连接器
      • 6、启动服务
      • 7、测试验证
      • 8、下载客户端
    • 2)单机版(Coordinator和Worker不同进程)
    • 3)集群模式(多worker节点)
      • 1、安装JDK11
      • 2、安装python
      • 3、copy worker目录到其它节点
      • 4、修改配置
      • 5、启动worker节点服务
  • 1)生成证书
  • 2、配置
  • 3、重启服务并验证
  • 4、配置账号密码访问
  • 六、连接器
    • 1)MySQL连机器
    • 2)Hive连接器
  • 七、Trino JDBC driver
    • 1)Maven配置
    • 2)示例演示
  • 一、概述

    Presto是Facebook开源的MPP(Massively Parallel Processing:大规模并行处理)架构的OLAP(on-line transaction processing:联机分析处理),完全基于内存的并?计算,可针对不同数据源,执行大容量数据集的一款分布式SQL交互式查询引擎。 它是为了解决Hive的MapReduce模型太慢以及不能通过BI或Dashboards直接展现HDFS数据等问题。

    但是Presto目前有两大分支:PrestoDB(背靠Facebook)和PrestoSQL现在改名为Trino(Presto的创始团队),虽然PrestoDB背靠Facebook,但是社区活跃度和使用群体还是远不如Trino。所以这里以Trino为主展开讲解。

    PrestoDB官方文档:https://prestodb.io/docs/current/

    Trino官方文档:https://trino.io/docs/current/

    二、Trino特点

    Trino是基于java开发的,对于大部分开发者和使用者而言,Trino容易学习并对特定的场景进行二次开发和性能优化等。多数据源、支持SQL、扩展性强、高性能,流水线模式。

    • 多数据源:目前版本支持20多种数据源,几乎能覆盖所有常见情况,Elasticsearch 、Hive 、JMX 、Kafka Kudu 、Local File、Memory 、MongoDB 、MySQL 、Redis等等

    • 支持SQL:完成支持ANSI SQL,提供SQL shell

    • 扩展性:支持开发自己的特定数据源的connector

    • 高性能:Trino基于内存计算,在绝大多数情况下,Trino的查询性能是hive的10倍以上,完全能实现交互式,实时查询

    • 流水线:Trino是基于PipeLine设计的,在进行大量设计处理过程中,终端不需要等待所有的数据计算完毕之后才能看到结果,计算一部分就可以看部分结果

    三、Trino架构

    1)架构和服务节点

    • Trino查询引擎是一个Master-Slave的架构,有两种进程Coordinator服务进程和worker服务进程组成。细分的话还有一个Discovery Server节点,Discovery Server通常内嵌于Coordinator节点中。
    • Coordinator主要作用是接收查询请求,解析查询语句,生成查询执行计划,任务调度和worker管理。
    • Worker服务进程执行被分解的查询执行任务:task
    • Worker节点启动后向Discovery Server服务注册,CoordinatorDiscovery Server获得可以正常工作的Worker节点。
    • 如果配置了Hive Connector,需要配置一个Hive MetaStore服务为Trino提供Hive元信息,Worker节点与HDFS交互读取数据。

    2)Trino数据模型

    Trino就是通过Connector来访问不同的数据源的,相当于访问不同数据源的驱动程序,每种connector都实现了Trino的标准SPI接口,因此只要实现了标准SPI接口就可以制定特殊的Connector来访问数据源。

    Trino采取三层表结构:

    • Catalog

    Trino中Catalog类似于mysql中的一个数据库实例,Schema类似于mysql当中的一个database。如用Trino去连接一个hive中的一个库
    trino --server ip:port --catalog hive --schema xxx 这样就可以访问hive的中的xxx库。

    • Schema

    Trino中的schema就相当于mysql中的一个具体的database

    • Table

    Trino中的table和mysql中table含义一样

    四、Trino安装部署

    官方安装文档:https://trino.io/docs/current/installation/deployment.html

    1)单机版(Coordinator和Worker同进程)

    1、安装JDK11

    【温馨提示】JDK最低要求版本为11.0.11



    $ cd /opt/bigdata/hadoop/software/
    $ wget https://cdn.azul.com/zulu/bin/zulu11.54.25-ca-jdk11.0.14.1-linux_x64.zip
    $ unzip zulu11.54.25-ca-jdk11.0.14.1-linux_x64.zip -d /opt/bigdata/hadoop/server/
    

    配置环境变量,在/etc/profile添加如下内容:

    export JAVA_HOME=/opt/bigdata/hadoop/server/zulu11.54.25-ca-jdk11.0.14.1-linux_x64
    export PATH=$JAVA_HOME/bin:$PATH
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    

    加载生效

    $ source /etc/profile
    $ java -version
    

    2、安装python

    一般linux机器自带了python,所以自带了就可以不用再装了,没python环境,就得安装下面步骤安装python环境

    $ yum -y install python3
    $ python3 --version
    $ ln -s /usr/bin/python3 /usr/bin/python
    

    当然也可以离线安装,各个版本下载地址:https://www.python.org/ftp/python/

    3、下载Trino安装包

    $ cd /opt/bigdata/hadoop/software
    $ wget https://repo1.maven.org/maven2/io/trino/trino-server/375/trino-server-375.tar.gz
    $ tar -xvf trino-server-375.tar.gz -C /opt/bigdata/hadoop/server/
    $ cd /opt/bigdata/hadoop/server
    $ mv trino-server-375 presto375
    

    4、配置

    首先创建etc和data目录,后面配置文件需要用到

    $ cd /opt/bigdata/hadoop/server/presto375
    $ mkdir etc data
    
    • Node properties
    $ cat << EOF > etc/node.properties
    # 环境的名字。集群中所有的Trino节点必须具有相同的环境名称。
    node.environment=presto
    # 此Trino安装的唯一标识符。这对于每个节点都必须是唯一的。
    node.id=presto-worker
    # 数据目录的位置(文件系统路径)。Trino在这里存储日志和其他数据。
    node.data-dir=/opt/bigdata/hadoop/server/presto375/data
    EOF
    
    • JVM config

    【温馨提示】 -Xmx最大堆内存大小,根据机器配置来定,但是一般jvm堆内存分配<32G。

    $ cat << EOF > etc/jvm.config
    -server
    -Xmx2G
    -XX:-UseBiasedLocking
    -XX:+UseG1GC
    -XX:G1HeapRegionSize=32M
    -XX:+ExplicitGCInvokesConcurrent
    -XX:+ExitOnOutOfMemoryError
    -XX:+HeapDumpOnOutOfMemoryError
    -XX:-OmitStackTraceInFastThrow
    -XX:ReservedCodeCacheSize=512M
    -XX:PerMethodRecompilationCutoff=10000
    -XX:PerBytecodeRecompilationCutoff=10000
    -Djdk.attach.allowAttachSelf=true
    -Djdk.nio.maxCachedBufferSize=2000000
    EOF
    
    • Config properties
    $ cat << EOF > etc/config.properties
    # 设置该节点为coordinator节点
    coordinator=true
    # 允许在协调器上调度工作,也就是coordinator节点又充当worker节点用
    node-scheduler.include-coordinator=true
    # 指定HTTP服务器的端口。Trino使用HTTP进行内部和外部web的所有通信。
    http-server.http.port=9000
    # 查询可以使用的最大分布式内存。【注意】不能配置超过jvm配置的最大堆栈内存大小
    query.max-memory=1GB
    # 查询可以在任何一台机器上使用的最大用户内存。【注意】也是不能配置超过jvm配置的最大堆栈内存大小
    query.max-memory-per-node=1GB
    # hadoop-node1也可以是IP
    discovery.uri=http://hadoop-node1:9000
    EOF
    
    • Log levels
    $ cat << EOF > etc/log.properties
    # 设置日志级别,有四个级别:DEBUG, INFO, WARN and ERROR
    io.trino=INFO
    EOF
    

    5、配置jmx连接器

    Java管理扩展(JMX)提供有关JVM中运行的Java虚拟机和软件的信息。JMX连接器用于在Trino服务器中查询JMX信息。

    配置

    $ cd /opt/bigdata/hadoop/server/presto375
    # 先创建catalog目录
    $ mkdir etc/catalog/ -p
    $ echo "connector.name=jmx" > etc/catalog/jmx.properties
    

    6、启动服务

    $ cd /opt/bigdata/hadoop/server/presto375
    $ bin/launcher start
    $ netstat -tnlp|grep :9000
    

    7、测试验证

    web访问验证:http://hadoop-node1:9000


    8、下载客户端

    $ cd /opt/bigdata/hadoop/server/presto375/bin/
    $ wget https://repo1.maven.org/maven2/io/trino/trino-cli/375/trino-cli-375-executable.jar
    # 改名,加执行权限
    $ mv trino-cli-375-executable.jar trino
    $ chmod +x trino
    
    ### 连接测试
    $ cd /opt/bigdata/hadoop/server/presto375
    $ ./bin/trino --server hadoop-node1:9000
    # 命令不区分大小写
    show catalogs;
    # 查库
    show schemas from system;
    # 查表
    show tables from system.runtime;
    # 查具体记录,查看当前node节点记录
    select * from system.runtime.nodes;
    

    2)单机版(Coordinator和Worker不同进程)

    其实上面的部署方式,是Coordinator和Worker在同一个进程中,现在需要分开。

    • 先停掉服务
    $ cd /opt/bigdata/hadoop/server/presto375
    $ ./bin/launcher stop
    
    • 创建coordinator和worker目录
    $ cd mkdir coordinator worker
    # copy to coordinator
    $ cp -r bin data etc lib NOTICE plugin README.txt coordinator/
    # copy to worker
    $ cp -r bin data etc lib NOTICE plugin README.txt worker/
    
    • 修改coordinator配置
    $ cd /opt/bigdata/hadoop/server/presto375/coordinator
    
    ### etc/node.properties
    $ cat << EOF > etc/node.properties
    node.environment=presto
    node.id=presto-coordinator
    node.data-dir=/opt/bigdata/hadoop/server/presto375/coordinator/data
    EOF
    
    ### etc/jvm.config
    $ cat << EOF > etc/config.properties
    # 设置该节点为coordinator节点
    coordinator=true
    # 允许在协调器上调度工作,也就是coordinator节点又充当worker节点用
    node-scheduler.include-coordinator=false
    # 指定HTTP服务器的端口。Trino使用HTTP进行内部和外部web的所有通信。
    http-server.http.port=9000
    # 查询可以使用的最大分布式内存。【注意】不能配置超过jvm配置的最大堆栈内存大小
    query.max-memory=1GB
    # 查询可以在任何一台机器上使用的最大用户内存。【注意】也是不能配置超过jvm配置的最大堆栈内存大小
    query.max-memory-per-node=1GB
    # hadoop-node1也可以是IP
    discovery.uri=http://hadoop-node1:9000
    EOF
    
    • 启动coordinator
    $ ./bin/launcher start
    

    • 修改worker配置
    $ cd /opt/bigdata/hadoop/server/presto375/worker
    
    ### etc/node.properties
    $ cat << EOF > etc/node.properties
    node.environment=presto
    node.id=presto-worker
    node.data-dir=/opt/bigdata/hadoop/server/presto375/worker/data
    EOF
    
    $ cat << EOF > etc/config.properties
    # 设置该节点为worker节点
    coordinator=false
    # 指定HTTP服务器的端口。Trino使用HTTP进行内部和外部web的所有通信。这里端口得改,要不然会存在端口冲突
    http-server.http.port=8080
    # 查询可以使用的最大分布式内存。【注意】不能配置超过jvm配置的最大堆栈内存大小
    query.max-memory=1GB
    # 查询可以在任何一台机器上使用的最大用户内存。【注意】也是不能配置超过jvm配置的最大堆栈内存大小
    query.max-memory-per-node=1GB
    # hadoop-node1也可以是IP
    discovery.uri=http://hadoop-node1:9000
    EOF
    
    • 启动worker
    $ ./bin/launcher start
    $ netstat -tnlp|grep 8080
    $ jps
    

    3)集群模式(多worker节点)

    把worker目录全部copy到另外的机器(hadoop-node2)启动即可,修改配置,启动即可以。操作如下:

    1、安装JDK11

    $ cd /opt/bigdata/hadoop/software/
    $ wget https://cdn.azul.com/zulu/bin/zulu11.54.25-ca-jdk11.0.14.1-linux_x64.zip
    $ unzip zulu11.54.25-ca-jdk11.0.14.1-linux_x64.zip -d /opt/bigdata/hadoop/server/
    

    配置环境变量,在/etc/profile添加如下内容:

    export JAVA_HOME=/opt/bigdata/hadoop/server/zulu11.54.25-ca-jdk11.0.14.1-linux_x64
    export PATH=$JAVA_HOME/bin:$PATH
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    

    加载生效

    $ source /etc/profile
    $ java -version
    

    2、安装python

    一般linux机器自带了python,所以自带了就可以不用再装了,没python环境,就得安装下面步骤安装python环境

    $ yum -y install python3
    $ python3 --version
    $ ln -s /usr/bin/python3 /usr/bin/python
    

    3、copy worker目录到其它节点

    # hadoop-node2上创建目录
    $ mkdir -p /opt/bigdata/hadoop/server/presto375
    # 在hadoop-node1上执行下面操作
    $ cd /opt/bigdata/hadoop/server/presto375
    $ scp -r worker hadoop-node2:/opt/bigdata/hadoop/server/presto375/
    

    4、修改配置

    $ /opt/bigdata/hadoop/server/presto375/worker
    # 只需要修改etc/node.properties
    $ cat << EOF > etc/node.properties
    # node.environment所有节点都是一样的
    node.environment=presto
    # node.id唯一性
    node.id=presto-worker02
    node.data-dir=/opt/bigdata/hadoop/server/presto375/worker/data
    EOF
    

    5、启动worker节点服务

    $ cd /opt/bigdata/hadoop/server/presto375/worker
    $ ./bin/launcher start
    $  netstat -tnlp|grep 8080
    


    查表验证

    $ cd /opt/bigdata/hadoop/server/presto375/coordinator
    # 非交互式,以TSV_HEADER格式展示
    $ ./bin/trino --server hadoop-node1:9000 --execute "select * from system.runtime.nodes;" --output-format=TSV_HEADER
    # 下面这句跟上面等价
    $ ./bin/trino --server hadoop-node1:9000 --catalog system --schema runtime --execute "select * from nodes;" --output-format=TSV_HEADER
    

    五、配置HTTPS(coordinator)

    1)生成证书

    $ cd /opt/bigdata/hadoop/server/presto375/coordinator
    $ mkdir certificate
    $ cd certificate
    # 生成 CA 证书私钥
    $ openssl genrsa -out clustercoord.key 4096
    # 生成 CA 证书
    $ openssl req -x509 -new -nodes -sha512 -days 3650 \
     -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=mypresto.com" \
     -key clustercoord.key \
     -out clustercoord.cert
    
    # 合并
    $ cat clustercoord.key clustercoord.cert > clustercoord.pem
    

    2、配置

    $ cd /opt/bigdata/hadoop/server/presto375/coordinator
    

    在etc/config.properties添加如下配置:

    http-server.https.enabled=true
    http-server.https.port=8443
    http-server.https.keystore.path=/opt/bigdata/hadoop/server/presto375/coordinator/certificate/clustercoord.pem
    

    3、重启服务并验证

    $ ./bin/launcher restart
    $ jps
    $ netstat -tnlp|grep 9000
    $ netstat -tnlp|grep 8443
    

    web UI:https://hadoop-node1:8443/

    【温馨提示】之前的http也还是可以访问的:http://hadoop-node1:9000/

    4、配置账号密码访问

    # etc/config.properties增加如下配置:
    http-server.authentication.type=PASSWORD
    

    创建配置etc/password-authenticator.properties,此处可以配置使用LDAP密码文件认证,这里测试采用密码文件认证。配置内容如下:

    password-authenticator.name=file
    file.password-file=/opt/bigdata/hadoop/server/presto375/coordinator/etc/password.db
    

    创建密码文件etc/password.db,配置账号和密码,密码是bcrypt格式密文密码,这里账号密码自定义就好,这里使用,admin/123456

    这里提供一个在线bcrypt加密地址:http://www.ab126.com/goju/10822.html

    etc/password.db内容如下:

    admin:$2y$10$9O.FnPn27br2ebxzns3QkOj22OTQAaTvIBPjZd1dAjS5MOXaOJFxK
    

    【温馨提示】生成出来的密文密码,开头必须是$2y$,所以把上面的a换成了y了,要不然登录不了。

    重启服务验证

    $ cd /opt/bigdata/hadoop/server/presto375/coordinator
    $ ./bin/launcher restart
    


    到这里就配置完成了。还有其它认证方式,可以查看官方文档。

    六、连接器

    连接器其实就是指定某种数据源,上面已经配置过了jmx,这里就不再重复,这里主要讲mysql和hive这两个连接器,mysql和hive的安装可以参考我之前的文章:。其它的连接器,可以自行查看官方文档。

    1)MySQL连机器

    MySQL连接器允许在外部MySQL实例中查询和创建表。

    在etc/catalog目录下,增加mysql配置,配置文件为mysql.properties,具体配置如下:

    # 所有节点都得添加
    $ cat << EOF > etc/catalog/mysql.properties
    connector.name=mysql
    connection-url=jdbc:mysql:/hadoop-node1:3306
    connection-user=root
    connection-password=123456
    EOF
    

    重启Trino服务

    $ ./bin/launcher restart
    # 注意下面连接方式会报错,因为是使用https方式,而我们上面生成的证书是不可信的,所以需要加--insecure,去跳过证书验证。
    $ ./bin/trino --server https://hadoop-node1:8443 --user=admin --password
    # 交互式登录
    $ ./bin/trino --server https://hadoop-node1:8443 --user=admin --password --insecure
    show catalogs;
    show schemas from mysql;
    show tables from mysql.azkaban;
    

    非交互登录

    # 非交互登录设置一个TRINO_PASSWORD 环境变量
    $ export TRINO_PASSWORD="123456"
    $ ./bin/trino --server https://hadoop-node1:8443 --user=admin --password --insecure
    show catalogs;
    

    非交互式执行SQL,加上这个参数--execute="sql语句"TRINO_PASSWORD 环境变量

    $ export TRINO_PASSWORD="123456"
    ## --execute=
    $ ./bin/trino --server https://hadoop-node1:8443 --user=admin --password --insecure --execute="show catalogs;"
    # 以不同的格式输出,--output-format
    $ ./bin/trino --server https://hadoop-node1:8443 --user=admin --password --insecure --execute="show catalogs;" --output-format=JSON
    # 如果觉得这条命令太长,可以设置别名
    $ alias trino='./bin/trino --server https://hadoop-node1:8443 --user=admin --password --insecure'
    $ trino --execute="show catalogs;" --output-format=JSON
    


    到这步就可以开始愉快的写sql了。

    2)Hive连接器

    Hive依赖于hadoop的基础服务,可以参考我之前的文章:大数据
    Hive的安装部署可以参考我之前的文章::

    启动hdfs、yarn、hive服务

    # 启动hdfs、yarn服务,hdfs webui端口:9870,yarn webui端口:8088
    $ start-all.sh
    # 启动hive metastore服务,端口:9083
    $ nohup hive --service metastore &
    

    准备好基础服务后,就可以开始配置Trino了。

    $ cat << EOF > etc/catalog/hive.properties
    connector.name=hive
    hive.metastore.uri=thrift://hadoop-node1:9083
    EOF
    

    重启服务

    $ ./bin/launcher restart
    

    验证

    $ ./bin/trino --server https://hadoop-node1:8443 --user=admin --password --insecure
    show catalogs;
    show schemas from hive;
    show tables from hive.default;
    

    【温馨提示】虽然是连hive,但是计算不会再走MR了,直接在内存中计算输出结果,insert添加数据也是直接在内存完成,把数据推到HDFS,元数据还是存在mysql,非常快,这也是Trino的优势。示例如下:

    insert into person_1 values (1,'p1',21);
    insert into person_1 values (2,'p2',22);
    


    更多连接器,请查阅官方文档:https://trino.io/docs/current/connector.html

    七、Trino JDBC driver

    Trino JDBC驱动程序允许用户使用基于java的应用程序和运行在JVM中的其他非java应用程序访问Trino。其实就是java大数据开发。

    环境搭建可以参考我之前的文章:

    1)Maven配置

    pom.xml添加如下内容:

    
        
            io.trino
            trino-jdbc
            375
        
    
    

    2)示例演示

    package com.bigdata;
    
    import java.sql.*;
    import java.util.Properties;
    
    public class TrinoTest001 {
        public static void main(String[] args) throws SQLException {
            // URL parameters
            String url = "jdbc:trino://hadoop-node1:8443/hive/default";
            Properties properties = new Properties();
            properties.setProperty("user", "admin");
            properties.setProperty("password", "123456");
            properties.setProperty("SSL", "true");
            // 证书不可信,必须这下面这行
            properties.setProperty("SSLVerification", "NONE");
            Connection connection = DriverManager.getConnection(url, properties);
            Statement stmt = connection.createStatement();
            ResultSet rs = stmt.executeQuery("show tables");
            while (rs.next()) {
                // 获取第一列数据
                System.out.println(rs.getString(1));
            }
            rs.close();
            connection.close();
            // properties
            /**
             * 另一种写法
             * String url = "jdbc:trino://hadoop-node1:8443/hive/default?user=admin&password=123456&SSL=true&SSLVerification=NONE";
             *Connection connection = DriverManager.getConnection(url);
             * Statement stmt = connection.createStatement();
             * ResultSet rs = stmt.executeQuery("show tables");
             * while (rs.next()) {
             *   // 获取第一列数据
             *
             *   System.out.println(rs.getString(1));
             * }
             * rs.close();
             * connection.close();
            *
            */
    
        }
    }
    

    Trino的基础部分就到这结束了,如果疑问欢迎给我留言,关于更Trino的知识可以参考官方文档:https://trino.io/docs/current/index.html,关于更多大数据相关知识,请耐心等待~