cube.js 对于presto 的支持是通过presto-client 刚好简单修改了一个可以支持presto-gateway 连接的
以下是一个简单的集成,以及关于集成中原有的一些修改

环境准备

  • docker-compose 文件
version: "3"
services:
  proxy:
     image: dalongrong/presto-gateway:1.6.1
     ports:
     - "8888:8888"
     - "8082:8082"
     - "8083:8083"
     build: ./
     volumes:
     - "./config.yml.template:/config.yml.template"
  presto1:
     image: starburstdata/presto
     ports:
     - "8080:8080"
  presto2:
     image: starburstdata/presto
     ports:
     - "8081:8080"
  • presto-gateway 配置
requestRouter:
  port: 8888
  name: prestoRouter
  cacheDir: /var/log/prestoproxy/cache
  historySize: 1000
backends:
  - localPort: 8082
    name: presto1
    proxyTo: http://presto1:8080
    routingGroup: adhoc
  - localPort: 8083
    name: presto2
    proxyTo: http://presto2:8080
    routingGroup: scheduled
server:
  applicationConnectors:
    - type: http
      port: 8090
  adminConnectors:
    - type: http
      port: 8091
notifier:
  smtpHost: localhost
  smtpPort: 587
  sender: presto-gw-monitor-noreply@lyft.com
  recipients:
    - prestodev@yourorg.com
modules:
  - com.lyft.data.gateway.module.ProxyBackendProviderModule
  - com.lyft.data.gateway.module.GatewayProviderModule
  - com.lyft.data.gateway.module.NotifierModule
managedApps:
  - com.lyft.data.gateway.GatewayManagedApp
  - com.lyft.data.gateway.ActiveClusterMonitor
# Logging settings.
logging:
  # The default level of all loggers. Can be OFF, ERROR, WARN, INFO, DEBUG, TRACE, or ALL.
  level: INFO
  # Logger-specific levels.
  loggers:
    com.lyft: DEBUG
  appenders:
    - type: console
    - type: file
      currentLogFilename: /var/log/prestoproxy/prestoproxy-java.log
      archivedLogFilenamePattern: /var/log/prestoproxy/prestoproxy-java-%d{yyyy-MM-dd}-%i.log.gz
      archivedFileCount: 7
      timeZone: UTC
      maxFileSize: 100MB

cube.js presto 项目

  • 初始化
cubejs  create -d presto mypresto
  • 修改生成的项目
    主要是关于presto-client 的替换以及环境变量的添加,还有就是部分代码的简单修改
  • package.json 改进
 
yarn add @dalongrong/presto-client
  • 添加环境变量
    .env
 
CUBEJS_DB_HOST=localhost
CUBEJS_DB_USER=dalong
CUBEJS_DB_PORT=8888
CUBEJS_DB_CATALOG=memory
CUBEJS_DB_TYPE=prestodb
CUBEJS_ROUTING_GROUP=scheduled
CUBEJS_DB_SCHEMA=default
CUBEJS_API_SECRET=71a4454929e8b429158759a29f4a7ddfcc957505efed7e5a93e02a859d7bd9f7ed7e49daac2243024a94cdaa3e88faa4cd3946dae7aea562f947bb1ed525125b
  • 修改关于presto 连接
    文件node_modules/@cubejs-backend/prestodb-driver/driver/PrestoDriver.js
const presto = require('@dalongrong/presto-client');
const {
  map, zipObj, prop, concat
} = require('ramda');
const BaseDriver = require('@cubejs-backend/query-orchestrator/driver/BaseDriver');
const SqlString = require('sqlstring');
class PrestoDriver extends BaseDriver {
  constructor(config) {
    super();
    this.config = {
      host: process.env.CUBEJS_DB_HOST,
      port: process.env.CUBEJS_DB_PORT,
      catalog: process.env.CUBEJS_DB_CATALOG,
      schema: process.env.CUBEJS_DB_SCHEMA,
      user: process.env.CUBEJS_DB_USER,
      routingGroup: process.env.CUBEJS_ROUTING_GROUP,
      basic_auth: process.env.CUBEJS_DB_PASS ? {
        user: process.env.CUBEJS_DB_USER,
        password: process.env.CUBEJS_DB_PASS
      } : undefined,
      ...config
    };
    this.catalog = this.config.catalog;
    this.client = new presto.Client(this.config);
  }
  testConnection() {
    const query = SqlString.format(`show catalogs like ?`, [`%${this.catalog}%`]);
    return this.queryPromised(query)
      .then(catalogs => {
        if (catalogs.length === 0) {
          throw new Error(`Catalog not found '${this.catalog}'`);
        }
      });
  }
  query(query, values) {
    const queryWithParams = SqlString.format(query, values);
    return this.queryPromised(queryWithParams);
  }
  queryPromised(query) {
    return new Promise((resolve, reject) => {
      let fullData = [];
      this.client.execute({
        query,
        schema: this.config.schema || 'default',
        routingGroup: this.config.routingGroup,
        data: (error, data, columns) => {
          const normalData = this.normalizeResultOverColumns(data, columns);
          fullData = concat(normalData, fullData);
        },
        success: () => {
          resolve(fullData);
        },
        error: error => {
          reject(error.message || JSON.stringify(error));
        }
      });
    });
  }
  normalizeResultOverColumns(data, columns) {
    const columnNames = map(prop('name'), columns || []);
    const arrayToObject = zipObj(columnNames);
    return map(arrayToObject, data || []);
  }
}
module.exports = PrestoDriver;

启动&&效果

  • 启动
yarn  dev
  • 效果

  • 生成schema
  • 集成效果

  • presto-gatesway 效果

说明

以上是一个简单的集成,通过presto-gateway 可以方便我们的管理,是一个很不错的工具

参考资料

https://github.com/cube-js/cube.js
https://github.com/rongfengliang/presto-client-node
https://github.com/lyft/presto-gateway

cube.js 通过presto-gateway 进行连接的更多相关文章

  1. cube.js 学习 cube 连接mongodb 试用

    cube.js 对于mongodb 的连接是通过mongodb bi connector(mysql 协议)处理的,以下为简单的试用 安装mongo bi connector 这个玩意用docker ...

  2. cube.js 最近版本的一些更新

    有一段时间没有关注cube.js 了,刚好晚上收到一封来自官方的更新介绍,这里简单说明下 更多的数据驱动支持 bigquey, clickhouse snowflake,presto (很棒),hiv ...

  3. cube.js 开源模块化分析框架

    cube.js 是一款很不错的模块化web 应用分析框架.cube.js 的设计主要是面向serverless 服务, 但是同时也支持所有rdbms, cube.js不是一个单体应用,包含了以下部分: ...

  4. cube.js 集成cratedb 的尝试

    cratedb 提供了pg协议的兼容,我们可以直接使用pg client 连接,但是也不是完整实现pg 协议的 以下是 cube.js 集成cratedb 的一些尝试 环境准备 docker-comp ...

  5. cube.js 新版本试用preosto

    cube.js 新的版本添加了更多的数据库的支持,但是目前cubejs-cli 以及官方文档问题还挺多,使用不清晰,文档有明显的错误 以下演示presto 数据库的使用 环境准备 安装新版本的cube ...

  6. cube.js 学习(八)backend部署模式

    cube.js 从设计上就进行了系统上的分层,backend,frontend,backend 是cube.js 的核心 对于cube.js backend 的部署官方也提供了好多中方法 部署模型 s ...

  7. cube.js 学习(七)cube.js type 以及format 说明

      cube.js 对于measure以及dimension 提供了丰富的数据类型,基本满足我们常见应用的开发,同时对于不同类型也提供了 格式化的操作 measure类型 number 格式 purc ...

  8. 通过JS判断联网类型和连接状态

    通过JS判断联网类型和连接状态 中国的移动网络环境复杂,为了给用户带去更好访问体验,开发者希望能了解用户当前的联网方式,然后给用户一个符合当前网络环境的请求结果. W3C的规范中给出了一个方法来获得现 ...

  9. ASP.net与SQLite数据库通过js和ashx交互(连接和操作)

    ASP.net与SQLite数据库通过js和ashx交互(连接和操作): 废话(也是思路):用的是VS2010,打算做网站前后台.由于不喜欢前台语言里加些与html和css和js的其他内容,想实现前后 ...

随机推荐

  1. 【题解】Luogu P5327 [ZJOI2019]语言

    原题传送门 看到这种树上统计点对个数的题一般是线段树合并,这题也不出意外 先对这棵树进行树剖,对于每次普及语言,在\(x,y\)两点的线段树上的\(x,y\)两位置打\(+1\)标记,在点\(fa[l ...

  2. python中用分别用selenium、requests库实现Windows认证登录

    最近在搞单位的项目,实现python自动化,结果在第一步就把我给拒之门外,查资料问大佬,问我们开发人员,从周一折腾到周五才搞定了 接下给大家分享一下 项目背景:我们系统是基于Windows平台实现的, ...

  3. http的GET方法参数中不能传列表,接收端的key会变

    如下 async initTable() { await getHostAttributesForUser({'username': this.username}).then(response =&g ...

  4. 测试欧气的小游戏-java

    Java 用我们学到的知识做处一个小的项目或者游戏等等应该都或多或少的有一点点的成就感吧,下列就是我用所学的基础知识做的猜字谜游戏,并且给他赋予了灵魂哈哈哈.有兴趣的可以尝试的用自己会的知识做一些小的 ...

  5. 第三章 Maven构建 Java Spring Boot Web项目

    3.1   认识Srping Boot Spring Boot是一个框架,是一种全新的编程规范,它的产生简化了对框架的使用,简化了Spring众多的框架中大量的繁琐的配置文件,所以说Spring Bo ...

  6. SpringMVC+EasyUI实现页面左侧导航菜单

    1. 效果图展示 2. 工程目录结构 注意: webapp下的resources目录放置easyui和js(jQuery文件是另外的)                    3. 代码 index.j ...

  7. Django---CBV和FBV的使用,CBV的流程,给视图加装饰器,Request对象方法,属性和Response对象,form表单的上传

    Django---CBV和FBV的使用,CBV的流程,给视图加装饰器,Request请求对象方法,属性和Response响应对象,form表单的上传 一丶CBV和FBV       在Django中存 ...

  8. FineReport连接ApacheKylin

    1.前言 Apache Kylin™是一个开源的分布式分析引擎,提供Hadoop之上的SQL查询接口及多维分析(OLAP)能力以支持超大规模数据,最初由eBay Inc. 开发并贡献至开源社区.它能在 ...

  9. 在windows 10 64位系统下安装TensorFlow

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/mao_hui_fei/article/de ...

  10. js刷新页面得重新加载和页面的刷新

    1.reload 方法,该方法强迫浏览器刷新当前页面. 语法:location.reload([bForceGet]) 参数: bForceGet, 可选参数, 默认为 false,从客户端缓存里取当 ...