[TOC]

前言

公司因为架构调整,需要进行数据的实时加载。原本的方案是直接通过客户端查询索引,同时通过索引返回的id查询详情,整个流程比较复杂,并且其中涉及到索引压力大,无法及时加载完毕;针对大数据任务,延迟很大,无法做到实时分析。

这里,了解到Presto是一个分布式的查询引擎,本身也是支持各种数据源:Hadoop、Elasticsearch、MySQL等。所以尝试使用Presto进行数据加载,具体效果还得验证过后才知道,在这里作为一个记录。

安装Presto

Presto官网可以直接下载,分为三个包:

presto-server-0.253.1.tar.gz:这个是服务端的包,使用这个进行部署及配置;

presto-cli-0.253.1-executable.jar:这个是命令行模式的客户端,可以直接连接服务端,直接进行一些操作;

presto-jdbc-0.253.1.jar:这个就是JavaJDBC驱动了,引入后,就可以在程序中连接Presto了;

使用 docker 部署

  1. 准备

    在使用docker部署前,我们先需要准备几个文件夹和文件:

    1
    
    mkdir data etc
    

    编辑etc/node.properties文件内容为:

    1
    2
    3
    4
    5
    6
    
    // 表示环境,可以用 TEST/production
    node.environment=production
    // 实例的唯一 ID,同一台机器不同实例的时候,必须保证不同;同一个实例重启、恢复后,需要保持不变,否则无法恢复到原有实例
    node.id=ffffffff-ffff-ffff-ffff-ffffffffffff
    // 实例的数据目录,用来存放数据、日志等
    node.data-dir=/var/presto/data
    

    编辑etc/config.properties文件内容为:

    1
    2
    3
    4
    5
    6
    7
    8
    
    // 是否为协调节点
    coordinator=true
    node-scheduler.include-coordinator=true
    // 实例端口
    http-server.http.port=8080
    discovery-server.enabled=true
    // 界面地址
    discovery.uri=http://localhost:8080
    

    编辑etc/jvm.config文件内容为:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
    -server
    // 根据实际情况修改堆大小
    -Xmx1G
    -XX:+UseG1GC
    -XX:G1HeapRegionSize=32M
    -XX:+UseGCOverheadLimit
    -XX:+ExplicitGCInvokesConcurrent
    -XX:+HeapDumpOnOutOfMemoryError
    -XX:+ExitOnOutOfMemoryError
    -Djdk.attach.allowAttachSelf=true
    
  2. 编写docker-compose.yml文件

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
    version: "2"
    services:
      presto:
        image: ahanaio/prestodb-sandbox:0.254
        volumes:
          - ./data:/var/presto/data
          - ./etc:/opt/presto-server/etc
        ports:
          - 8080:8080
        container_name: presto
    
  3. 启动

    启动直接使用下列命令即可:

    1
    
    docker-compose up -d
    
  4. 访问界面

    在启动成功后,就可以访问http://host:8080查看了。

简单使用

使用docker部署后,就可以进入命令行模式进行使用了:

1
docker exec -it presto  presto-cli

常用命令:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// 查看库
show catalogs;
// 查看指定库内的 schema
show schemas in {catalog};
// 进入指定库的 schema
use {catalog}.{schema};
// 查看 schema 中的表;
show tables;
// 查询表
select * from {table} limit 1;

数据源接入

Presto的一大优势就是可以接入不同的数据,并且进行联合查询、聚合及操作;

Elasticsearch 接入

  1. 先准备一个es集群,创建一个索引:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    
    PUT users/_mapping/_doc
    {
    "properties": {
      "key": {
        "type": "keyword"
      },
      "username": {
        "type": "keyword"
      },
      "email": {
        "type": "keyword"
      }
    }
    }
    
  2. 编写$PRESTO_HOME/etc/catalog/elasticsearch.properties文件:

    1
    2
    3
    4
    
    connector.name=elasticsearch
    elasticsearch.host=localhost
    elasticsearch.port=9200
    elasticsearch.default-schema-name=my_schema
    
  3. 编写$PRESTO_HOME/etc/elasticsearch/my_schema.users.json文件:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    
    {
      "tableName": "users",
      "schemaName": "my_schema",
      "clusterName": "elasticsearch",
      "index": "users",
      "type": "doc",
      "columns": [
          {
              "name": "key",
              "type": "varchar",
              "jsonPath": "key",
              "jsonType": "varchar",
              "ordinalPosition": "0"
          }
      ]
    }
    
  4. 连接presto:

    1
    
    docker exec -it presto  presto-cli
    
  5. 查询

    1
    
    SELECT * FROM users LIMIT 1;
    

这样,就是Elasticsearch的完整接入了,如果是多个集群,只需要添加对应的catalogschema文件,然后重启presto集群即可。