使用外部db 加速dremio 查询

官方默认的实现是基于rest api 的,尽管可以开启数据反射提升查询速度,但是因为基于http连接有开销性能一般

可选的解决方法

  • etl dremio -> db 实现一个加速
    问题也很明显,失去了使用dremio 的价值了
  • 基于cube.js 预聚合处理(使用外部预聚合)

基于外部预聚合的解决方法

  • 参考配置
    cube.js
 
// Cube.js configuration options: https://cube.dev/docs/config
const DremioDriver = require("@cubejs-backend/dremio-driver")
const MysqlDriver = require("@cubejs-backend/mysql-driver")
 
module.exports = {
    externalDbType: 'mysql',
    externalDriverFactory: () =>
      new MysqlDriver({
        host: 'localhost',
        database: 'demoapp',
        port: 3306,
        user: 'root',
        password: 'jjjjj'
      }),
    dbType: ({ dataSource } = {}) => {
        return "dremio"
    },
    driverFactory: ({ dataSource } = {}) => {
        let dremioDriver = new DremioDriver({
          readOnly: true
        })
        return dremioDriver
    },
    telemetry: false
};

schema 使用

cube(`HrSeaApproveStatistics`, {
  sql: `SELECT * FROM "Hr".hr_sea_approve_statistics`,
 
  joins: {
 
  },
  preAggregations: {
    main: {
      sqlAlias: `original`,
      type: `originalSql`,
      external: true
    }
  },
  measures: {
    count: {
      type: `count`,
      drillMembers: [approverid, startDate, endDate]
    },
 
    instanceCount: {
      sql: `instance_count`,
      type: `sum`
    }
  },
 
  dimensions: {
    approverid: {
      sql: `approverid`,
      type: `string`
    },
 
    startDate: {
      sql: `start_date`,
      type: `time`
    },
 
    endDate: {
      sql: `end_date`,
      type: `time`
    }
  },
 
  dataSource: `default`
});

一个问题

因为官方dremio driver 在处理readOnly的时候有一个bug,我已经提交官方issue 同时pr 解决了,但是还没有发布npm官方
临时的解决方法(修改driver 的构造函数)

 
    this.config = {
      host: config.host || process.env.CUBEJS_DB_HOST || 'localhost',
      port: config.port || process.env.CUBEJS_DB_PORT || 9047,
      user: config.user || process.env.CUBEJS_DB_USER,
      password: config.password || process.env.CUBEJS_DB_PASS,
      database: config.database || process.env.CUBEJS_DB_NAME,
      ssl: config.ssl || process.env.CUBEJS_DB_SSL,
      ...config // 此处是核心
    };

说明

基于外部存储的模式性能提升是很明显的,我们的接口查看基本就可以在秒级响应了

参考资料

https://cube.dev/docs/caching/using-pre-aggregations#read-only-data-source
https://github.com/cube-js/cube.js/pull/2443

posted on 2021-03-26 23:30  荣锋亮  阅读(221)  评论(0编辑  收藏  举报

导航