Metabase BI 工具部署,并支持 MaxCompute

官网:https://www.metabase.com

先决条件

安装 Metabase

Github 下载最新 jar 包,执行 java -jar metabase.jar, 即可启动 Metabase, 服务默认启动端口:3000. 通过浏览器访问 http://localhost:3000, 首次访问会引导完成基础配置。

支持 MaxCompute

Metabase 通过 driver plugin 支持各种数据库查询,详情参见 Guide to writing a Metabase driver, 这里已经提供了多种官方/社区的数据库驱动,但是 MaxCompute (ODPS) 却不在其中。

各种 driver jars 存放在 metabase.jar 同级目录下的 plugins 中,点击 odps.metabase-driver.jar 下载 odps 驱动 (后面介绍如何开发的), 配置数据源时,就会增加 MaxCompute 类型。

通过 MySQL 保存 Metabase 基础数据

默认保存在 H2 数据库中,文件位于 jar 同级目录下的 metabase.db.mv.db. 正式环境最好保存在 MySQL 数据库中,首先创建数据库 create database metabase;.

创建目录 mkdir -pv ~/metabase/metabase_jar 存放各个版本的 jar 包,将下载好的 jar 包重命名形如 metabase_0.42.3.jar.

编辑部署脚本 vim ~/metabase/deploy_metabase.sh, 内容如下

#!/bin/sh

export MB_DB_TYPE=mysql
export MB_DB_DBNAME=metabase
export MB_DB_PORT=3306
export MB_DB_USER=<username>
export MB_DB_PASS=<password>
export MB_DB_HOST=127.0.0.1
# 下面的密钥可以通过如下命令生成。注意一旦赋值,千万不要改!改了很坑!
# openssl rand -base64 32
export MB_ENCRYPTION_SECRET_KEY=<SECRET_KEY>

export MB_JETTY_PORT=3000
export MB_JETTY_HOST=0.0.0.0

ps -ef | grep "metabase_" | grep -v grep | awk '{print $2}' | xargs kill -9

nohup java -Duser.country=CN -Duser.language=zh -jar metabase_jar/metabase_0.42.3.jar>> metabase.log 2>&1&

tail -fn 200 metabase.log

Metabase MaxCompute Driver

网上几乎找不到开源的驱动,好像 metabase-odps-driver 是唯一能找到的。 已经很久没有更新了,按介绍,支持的 Metabase 版本比较旧,且该项目的 release 页面没有打包好的 jar 包下载地址。

那就按最新的 Metabase Driver 开发构建步骤,自己动手打包一个。

git clone git@github.com:metabase/metabase.git
cd metabase
./bin/build
./bin/build-drivers.sh

构建文档, 开发文档. 为了完成上面的开发构建,需要安装 yarn, clojure.

模仿其他 driver, 比如 mongo, 增加如下目录和文件:

$ tree modules/drivers/odps
modules/drivers/odps
├── deps.edn
├── resources
│   └── metabase-plugin.yaml
└── src
    └── metabase
        └── driver
            └── odps.clj

本质就三个文件:deps.edn 内容如下

{:paths
 ["src" "resources"]

 :deps
 {com.aliyun.odps/odps-jdbc {:mvn/version "3.2.27-SNAPSHOT"}}}

就是加入 odps-jdbc, 当前最新版本是 3.2.26, 直接使用有点小问题,做了细微修改,发了个 SNAPSHOT 版本。

odps.clj 直接拷贝 metabase-odps-driver 中的文件,无需修改。

metabase-plugin.yaml 也是直接拷贝 metabase-odps-driver 中的文件,并将其中的 dependencies 节点删除。

最后还需要在 modules/drivers/deps.edn 中增加如下依赖

metabase/odps               {:local/root "odps"}

执行 ./bin/build-drivers.sh 即可得到需要的 driver jar 啦!

aliyun-odps-jdbc

直接使用官方最新的 jdbc, 将无法查询,根本原因是

@Override
public Statement createStatement(int resultSetType, int resultSetConcurrency,
                                 int resultSetHoldability) throws SQLException {
  log.error(Thread.currentThread().getStackTrace()[1].getMethodName() + " is not supported!!!");
  throw new SQLFeatureNotSupportedException();
}

这个方法没有做兼容处理,直接抛出异常,返回的 Statement 为 null. 简单修改如下

@Override
public Statement createStatement(int resultSetType, int resultSetConcurrency,
                                 int resultSetHoldability) throws SQLException {
  return createStatement(resultSetType, resultSetConcurrency);
}

下来方法也做了简单修改

目前还有一个较严重的报错

failed: ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: java.lang.RuntimeException: Table(xxx,xxxxxx) is full scan with all partitions, please specify partition predicates.
    at com.aliyun.odps.jdbc.OdpsStatement.runSQLOffline(OdpsStatement.java:876)
    at com.aliyun.odps.jdbc.OdpsStatement.runSQL(OdpsStatement.java:978)
    at com.aliyun.odps.jdbc.OdpsStatement.execute(OdpsStatement.java:440)
    at com.mchange.v2.c3p0.impl.NewProxyStatement.execute(NewProxyStatement.java:75)
    at metabase.driver.sql_jdbc.execute$fn__53221.invokeStatic(execute.clj:368)
    at metabase.driver.sql_jdbc.execute$fn__53221.invoke(execute.clj:366)
    at clojure.lang.MultiFn.invoke(MultiFn.java:239)
    at metabase.driver.sql_jdbc.execute$execute_statement_or_prepared_statement_BANG_.invokeStatic(execute.clj:376)
    at metabase.driver.sql_jdbc.execute$execute_statement_or_prepared_statement_BANG_.invoke(execute.clj:373)
    at metabase.driver.sql_jdbc.execute$execute_reducible_query$fn__53301.invoke(execute.clj:502)

开发环境搭建

为加快构建,可以配置国内安装源

:repositories
{"central" {:url "https://maven.aliyun.com/repository/public"}
 "clojars" {:url "https://mirrors.tuna.tsinghua.edu.cn/clojars"}}

参考文献

相关推荐