官方默认的实现是基于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,
};
说明
基于外部存储的模式性能提升是很明显的,我们的接口查看基本就可以在秒级响应了
参考资料
https://cube.dev/docs/caching/using-pre-aggregations#read-only-data-source
https://github.com/cube-js/cube.js/pull/2443