在大数据生态系统里面,分析型数据库产品众多,那么如何展示和洞察其中的数据价值呢?
最直观的当然是可视化方式,如果没有可视化,再好的数据分析看起来也是苍白无力的,不完美的。数据可视化也是 Business Intelligence (BI) 中的核心功能。
俗话说,工欲善其事,必先利其器。选择一款好的数据可视化工具至关重要,不知道是不是孔子说过,数据可视化是大数据的最后一公里。
众所周知,国内的不少公司,针对数据分析的可视化分析工具,大多采取自研手段,可能会相互模仿,重复造轮,最后各家成型的产品与业界很多同类型产品相仿。
当然不可否认的是,国内外也提供了不少非常优秀的可视化分析工具,笔者就不一一列举,避免涉嫌广告。
笔者肯定不是否定自研价值,毕竟也是满足公司定制化需求。但是确实也花费大量人力开发成本,如果非得要拿个指标衡量的话,ROI 其实是很低的。
这里还是需要解释一下,很多公司之所以造轮子,大多也是情非得已,毕竟目前开源的可视化分析工具确实不少,但是大部分功能单一,整体都比较粗糙,个人玩玩还可以,很难普及到公司以提供数据分析师、数据科学家或业务人员等使用。
可能万事都难逃通俗的二八定律吧,排除笔者所说的大部分,值得庆幸的是,开源社区贡献了一些非常好的可视化报表工具,比如 Apache Superset、Redash、Kibana、Davinci 等,以及笔者即将介绍的 Metabase,这是一个有灵魂、有思想以及有追求的项目。
在开始介绍 Metabase 之前,笔者对 Superset 补充说明一下,绝不是和今天主角 Metabase 争高低。因为笔者以前在数据可视化方面对 Superset 研究比较多,也做了相关的开发,希望给读者一二点参考信息。
Superset 是 Airbnb 开源的数据可视化工具,目前由 Apache 孵化,一直被认为是明星级的开源项目,主要用于数据分析师进行数据可视化工作。Superset 支持的数据库也非常多,包括常用的开源大数据分析型数据库以及成熟的商业数据库,如下所示:
Amazon Athena
Amazon Redshift
Apache Drill
Apache Druid
Apache Hive
Apache Impala
Apache Kylin
Apache Pinot
Apache Spark SQL
BigQuery
ClickHouse
Elasticsearch
Exasol
Google Sheets
Greenplum
IBM Db2
MySQL
Oracle
PostgreSQL
Presto
Snowflake
SQLite
SQL Server
Teradata
Vertica
Hana
因为使用过,所以可以说些体会,总体而言,Superset 的确可以满足公司数据可视化与业务报表方面的大部分需求。
但是使用 Superset 还是需要些技术成本的,并不是老少皆宜,更适合有开发经验的工程师。笔者简单罗列几个需要优化或改进的地方:
1. Dashboard 没有分类功能,会形成大杂烩的场面
2. 权限控制设计不太清晰,用起来不方便
3. 联表查询时,需要通过 SQL 工具箱操作 对于数据分析人员来说,通过选择指标、分组条件、和过滤条件来构建 Dashboard,但是这只是针对单表查询。Superset 里的表不支联表查询,只能通过 SQL Lab 方式来实现,但是非常不方便。
4. 数据量大时,页面渲染耗时很长,有可能出不来,需要重复尝试
Superset 在可视化方面做的还是非常好的,支持的图表类型也非常多,绝对是非常赞的,比如支持多种时间序列的图表以及可以接入地图等。
另外,笔者提到的 Redash 也是一个不错的项目,将各种数据源的通过 SQL 查询并可视化数据查询结果,笔者后续文章会介绍。
Metabase 是一个简单而强大的分析工具,任何人都可以通过它学习和决策公司的数据,无需专业的技术知识。同时可以使用 Metabase 进行数据分析、数据可视化和报表生成和分享等。
笔者其实第一印象是被 Metabase 的 UI 设计风格吸引过来的,然后又对其后端的 Clojure 编程语言感兴趣。Metabase 设计初考虑了产品的普适性,针对技术人员和非技术人员,尤其针对非技术人员方面花费心思,让产品经理和市场人员等自由地洞察数据,可以提出问题并获取答案。所以 Metabase 的理念很出色,Metabase 背后也是有一家商业公司团队在维护和支持。
Metabase 的后端是用 Clojure 语言开发的,是一种运行在 Java 平台上的 Lisp 方言。开源社区也有一些不错的产品使用 Clojure 开发,比如早期的 Apache Storm 等。
前端是用流行的前端开发框架 React + Redux 开发的。
Metabase 服务还提供了完整的 API 接口调用,可以很方便地接入其他系统或二次开发。
Metabase 部署是非常方便的,本身就是一个 jar 包,支持部署方式有:
JVM Jar
java -jar metabase.jar
Docker Image/Kubernetes
docker run -d -p 3000:3000 --name metabase metabase/metabase
Amazon Web Services
Heroku
让团队中的成员在不了解 SQL 的情况下提出问题
一般来说,BI 产品的用户都是业务人员(大部分不懂 SQL ),Metabase 把数据分析常用的查询通过通过一个易于操作的界面来操作,即使不懂 SQL 的业务人员也可以快速掌握业务数据。
丰富且漂亮的仪表板与自动刷新和全屏模式
提供针对分析师和数据专家专属的 SQL 模式
创建供团队使用的 segments 和 metrics
发送数据到 Slack 或 Email
使用 Metabot 随时查看 Slack 中的数据
通过重命名、注释和隐藏字段为团队定制个性化数据
业务数据与团队共享
分析好的业务数据可以保存并且分享给团队里其他成员。除此之外,团队中开发人员也可以把复杂的查询写好,把结果共享给业务人员。这是团队共享业务数据的应用场景。
以上特性的部分具体内容,笔者会在文章中进行演示说明。
Metabase 支持一些常用的数据库,包括:
Postgres
MySQL
Druid
SQL Server
Redshift
MongoDB
Google BigQuery
SQLite
H2
Oracle
Vertica
Presto
Snowflake
SparkSQL
另外,对于其他类型的数据库,需要开发对应的驱动,比如目前 Metabase 暂未支持的 Impala 和 ClickHouse 数据库就可以通过第三方开发的驱动来实现。
在本篇文章中,笔者会讲解 Metabase 如何集成 ClickHouse 并提供数据分析功能。
为了方便大家使用,笔者不使用生产环境做演示,而是使用 Docker 重新部署一套环境。
Metabase 提供社区版本和企业版本,Docker Image 分别为:
https://hub.docker.com/r/metabase/metabase
https://hub.docker.com/r/metabase/metabase-enterprise
笔者选择企业版本进行部署,方便讲解 Metabase 企业级版本提供的一些功能。
1.1 下载 Metabase Image
$ docker pull metabase/metabase-enterprise:latest
1.2 启动服务
$ docker run -d -v `pwd`/plugins:/plugins -p 3000:3000 --name metabase metabase/metabase-enterprise:latest
3804bc89ea8c6709994fd97d32445bbe04bc24ce10c406affe8fb93e606836c0
1.3 查看 plugins 目录信息
$ tree plugins
plugins
├── bigquery.metabase-driver.jar
├── druid.metabase-driver.jar
├── google.metabase-driver.jar
├── googleanalytics.metabase-driver.jar
├── mongo.metabase-driver.jar
├── oracle.metabase-driver.jar
├── presto.metabase-driver.jar
├── redshift.metabase-driver.jar
├── snowflake.metabase-driver.jar
├── sparksql.metabase-driver.jar
├── sqlite.metabase-driver.jar
├── sqlserver.metabase-driver.jar
└── vertica.metabase-driver.jar
0 directories, 13 files
可以看到,Metabase 原生是不包含 ClickHouse 驱动,需要我们下载 ClickHouse 驱动包并放到容器挂载的 plugins 目录中。
下载地址:
https://github.com/enqueue/metabase-clickhouse-driver/releases/download/0.6/clickhouse.metabase-driver.jar
将 clickhouse.metabase-driver.jar 放到 plugins 目录,并重启容器:
$ cp clickhouse.metabase-driver.jar plugins/
# 3804 是上面启动的容器 ID 缩写
$ docker restart 3804
在默认配置中,Metabase 使用本地文件系统来运行 H2 嵌入式数据库,用来存储应用程序数据,该数据位于容器内的磁盘上,所以如果您删除了容器,则 Metabase 数据会全部丢失,所以生产环境建议使用 Postgres 或 MySQL 存储 Metabase 应用数据库,如下(Postgres 示例):
docker run -d -p 3000:3000 \
-e "MB_DB_TYPE=postgres" \
-e "MB_DB_DBNAME=metabase" \
-e "MB_DB_PORT=5432" \
-e "MB_DB_USER=" \
-e "MB_DB_PASS=" \
-e "MB_DB_HOST=my-database-host" \
--name metabase metabase/metabase
或先设置环境变量再启动容器(MySQL 示例):
export MB_DB_CONNECTION_URI="mysql://my-database-host:port/metabase?user=&password="
Metabase 镜像里面不包含 ClickHouse 驱动,不过我们可以基于 Metabase 镜像构建包含 ClickHouse 驱动的新的镜像。
2.1 编写 Dockerfile 文件 Dockerfile 文件内容为:
FROM metabase/metabase-enterprise:latest
ADD https://github.com/enqueue/metabase-clickhouse-driver/releases/download/0.6/clickhouse.metabase-driver.jar /plugins/
RUN chmod 744 /plugins/clickhouse.metabase-driver.jar
注:
metabase/metabase-enterprise:latest 版本为 metabase/metabase-enterprise:v1.33.7
2.2 构建镜像 在 Dockerfile 文件当前目录,执行以下命令构建容器镜像:
docker build -t metabase/metabase-enterprise-ck:v1.33.7
构建完成,查看镜像:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
metabase/metabase-enterprise-ck v1.33.7 d126ed80cbef 35 minutes ago 566MB
metabase/metabase v0.34.0 7dae2bd44ea4 2 weeks ago 363MB
metabase/metabase-enterprise latest a0c3c175a8bd 3 weeks ago 558MB
在本篇文章中,笔者会使用 ClickHouse 数据库,相关信息如下:
xxx :) use ssb;
USE ssb
Ok.
0 rows in set. Elapsed: 0.000 sec.
xxx :) show tables;
SHOW TABLES
┌─name───┐
│ ontime │
└────────┘
1 rows in set. Elapsed: 0.001 sec.
xxx :) select count(1) from ontime;
SELECT count(1)
FROM ontime
┌──count(1)─┐
│ 184539910 │
└───────────┘
1 rows in set. Elapsed: 0.003 sec.
xxx :)
Metabase 服务启动后,默认端口为 3000。因为笔者在本地启动,所以访问地址为:
http://localhost:3000
点击 Let's get started
,配置 Metabase 基础信息:
填写好信息后,点击 Next,进入配置数据源步骤。这里,笔者选择 ClickHouse 数据库:
配置 ClickHouse 数据库信息,如下:
点击 Next,进入隐私数据配置项,即是否允许 Metabase 匿名收集使用事件的数据,根据实际情况勾选。
最后配置的就是是否订阅 Metabase 信息的邮箱地址:
所有都配置完成后,点击 Takeme toMetabase
,进入欢迎页面:
Metabase 基于配置数据源的表数据提供了 X-rays 功能,即快速简便地去获取数据的自动洞察和探索,点击 A look at yourOntImetable
查看自动洞察的结果:
这里读者可能注意到了,字段显示有点奇怪,单个字段被拆分为两部分,其实如果字段设计标准的话,拆分的确会很容易阅读,但是我们这里还是先关闭这种优化字段显示的效果。
点击 Admin,在 Settings->General->FRIENDLY TABLE AND FIELD NAMES
设置 Disabled 即可。
再次访问显示的字段就和表结构保持一致了:
大家可以在这里针对字段的值进行过滤或者添加新的字段以生成新的图表。
进入 Metabase Admin Settings 页面:
http://localhost:3000/admin/settings/setup
2.1 Settings->Email
配置公司内部邮箱或外部邮箱,提供用户通过邮箱注册账号功能,如果不配置邮箱,需要 Admin 管理员创建账号,并发给用户使用。
另外邮箱还有其他功能,比如发送可视化报表等。
2.2 Settings->Authentication
提供 Google
和 LDAP
登录方式,根据实际情况开启和配置。
2.3 Settings->Formatting
设置时间、数字和货币方面的展示格式。
2.4 Settings->Caching
开启缓存功能,保存一些查询比较长的结果数据。
在商业版本中,提供了 Whitelabel 功能,即可以定制化应用的配置信息,比如名称、图表颜色、LOGO等信息,如下:
如果要试用 Metabase 商业版本(默认情况下为 30 天),可以在官网进行申请 token,然后激活:
DataAnalysis
是笔者之前创建的 ClickHouse 数据源,而 Sample Dataset 是 Metabase 提供的测试数据。
点击上图中的 Learnaboutourdata
,可以对表进行个人喜好的定制化修改操作:
关于 Metrics 和 Segments 以后再说,笔者这里介绍一下 Databasesandtables
,并选择创建的 DataAnalysis
:
这一块提供了几个功能:
1. 定义表的描述信息
2. 表字段的有意义的描述和字段类型
3. 对表 Ask Questions 这里的 Ask Questions,其实是 Simple Questions,下面介绍。
4. 对表进行 X-ray 操作
Metabase 针对不同背景的用户提供了三种使用方式:
Simple question
对非技术人员友好,选择表,查看数据,并轻松地过滤、汇总和可视化结果数据。
Custom question
使用高级的 notebook 编辑器连接数据表查询、创建自定义列、进行数学运算等等。
Native query
对于更复杂的问题,可以编写自己的 SQL 或原生查询。
具体使用,其实都比较简单,笔者就不再演示,大家赶快试一下吧。
直观看一下数据库和表的权限控制:
Metabase 提供了用户和组的概念,可以针对组进行权限控制,比如控制组内用户访问数据库和表的权限,商业版本还提供数据行级控制。
属于 Administrators 组的用户,拥有访问一切的权限。还有一个 All Users 组,任何用户都属于该组,注意设置 All Users 组的权限。Administrators 和 All Users 组都是无法删除了,它们是 Metabase 保留组。
实际生产环境中,根据业务需求进行分组并控制组内用户访问数据的权限。
商业版本提供了数据的行级访问控制,具体实现是在创建用户时设置属性,其实就是要访问的字段:
如上图所示,设置该用户 AirlineID = 19391,那么该用户访问 ontime 表时,只能看到 AirlineID = 19391 的数据。
要保证行级别访问控制,当然需要设置数据库和表的访问权限,如下:
允许 平台组用户
访问 ontime 表的 AirlineID 字段,然后再给用户指定 AirlineID 指定的属性值。
笔者使用上面的用户进行登录,查询 ontime 数据库:
根据上图所示,数据分析时,该用户只能查询 ontime 表中 AirlineID = 19391 的行数据。
Metabase 提供的功能很多,笔者无法在这一篇文章中全部覆盖到所有知识点,另外 Metabase 官方文档还是非常全面的,值得研究和学习。这里再罗列一些功能点。
有时在编写 SQL 查询时,用户可能会忘记不同表或列的确切名称,或者表包含什么字段。这就是 Data Reference 派上用场的地方,通过数据模型,用户可以从 SQL 编辑器中打开 Data Reference 面板,如下图所示:
另外可以在 Data Model 中设置字段 Hidden、Querable 等属性,用户数据洞察的控制:
商业版本还提供审计日志功能,包括如下功能:
用户访问的操作记录和统计信息
数据库和表的统计信息以及查询统计信息(比如查询数、耗时等)
项目中的 Questions、Dashboards 以及数据下载信息
Metabase 的开源版本包括使用 Google 登录或 LDAP 设置单点登录(SSO)的选项,但 Metabase 的企业版还允许连接基于 SAML 或 JWT 的 SSO。通过整合用户自己的 SSO 与 Metabase 实现如下功能:
自动将用户属性从 SSO 传递到 Metabase 以支持数据沙箱
让用户无需重新验证即可访问配置数据库
Metabase 的开源版本允许用户在 Web 应用程序中嵌入独立的图表或仪表盘,以应对简单的情况。
但是,如果希望为用户提供更具交互性和可浏览性的体验,该怎么办呢?
Metabase 企业版本允许将整个 Metabase 应用程序嵌入到自己的 Web 应用程序中,为图表和表定制穿透钻取,甚至嵌入图形查询生成器,或仪表盘和图表的集合。
笔者在本篇文章中对 Metabase 产品进行了较为深入细致的讲解,使用越深越能体会到 Metabase 项目设计者的细心和对用户使用品质的追求,希望读者能够应用到实际生产环境中,实现数据真正的价值。当然一般企业中都会提供多种可视化数据分析工具,以满足更加复杂多变的业务需求,实现全方位价值洞察。