到 Github 下载最新 jar 包,执行 java -jar metabase.jar
, 即可启动 Metabase, 服务默认启动端口:3000
.
通过浏览器访问 http://localhost:3000, 首次访问会引导完成基础配置。
Metabase 通过 driver plugin 支持各种数据库查询,详情参见 Guide to writing a Metabase driver, 这里已经提供了多种官方/社区的数据库驱动,但是 MaxCompute (ODPS) 却不在其中。
各种 driver jars 存放在 metabase.jar
同级目录下的 plugins
中,点击 odps.metabase-driver.jar 下载 odps 驱动 (后面介绍如何开发的), 配置数据源时,就会增加 MaxCompute
类型。
默认保存在 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-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 啦!
直接使用官方最新的 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);
}
下来方法也做了简单修改
setAutoCommit
直接 return;
setReadOnly
直接 return;
setHoldability
直接 return;
getHoldability
直接 return ResultSet.CLOSE_CURSORS_AT_COMMIT;
getTypeMap
直接 return new HashMap<>();
目前还有一个较严重的报错
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)
v14.17.4
npm install -g yarn
brew install clojure/tools/clojure@1.10.3.998
/usr/local/bin
目录下,并增加可执行权限。为加快构建,可以配置国内安装源
:repositories
{"central" {:url "https://maven.aliyun.com/repository/public"}
"clojars" {:url "https://mirrors.tuna.tsinghua.edu.cn/clojars"}}