分享

开源数据可视化工具(For Apache Kylin)使用说明

问题导读:
1. 如何安装Caravel-Kylin和PyKylin?
2. 如何创建Kylin数据源?
3. 如何添加Kylin表并配置表的维度和指标?
4. 如何进行数据探索分析与可视化展示?
5. 如何定制自己的DashBoard?
6. 如何配置多表关联?


Apache Kylin,很好的解决了海量数据OLAP的底层存储与分析引擎,但还缺一个数据可视化工具,可以使用户非常方便的通过图形化分析探索海量数据,而不用写SQL。于是我们发现了Caravel。

原生的Caravel并不支持Kylin,也不支持多表关联,经过好友Rocky和我的修改和调试,使得Caravel支持Kylin,同时也实现了Kylin中多表关联分析。
GitHub地址(基于caravel 0.8.9):
https://github.com/rocky1001/pykylin/tree/caravel-kylin
https://github.com/rocky1001/caravel/tree/caravel-kylin

本文详细介绍了如何使用这款工具来可视化分析探索Apache Kylin。

Content:

关于Caravel
关于PyKylin
下载并安装Caravel-Kylin
下载并安装PyKylin
启动Caravel
创建Kylin数据源
添加Kylin表
配置表的维度和指标
数据探索分析与可视化展示
定制自己的DashBoard
配置多表关联
其他


关于Caravel

Caravel(曾用名Panoramix),是由知名在线房屋短租公司Airbnb开源的一款数据探索与可视化工具,该工具在可视化、易用性和交互性上非常有特色,用户可以轻松对数据进行可视化分析。官网地址为: http://airbnb.io/caravel/

Caravel底层使用Python开发,与SQLAlchemy深度整合,目前原生支持的数据源有:
MySQL、Postgres、Presto、Oracle、sqlite、Redshift、MSSQL以及Druid。对于前面的关系型数据库,Caravel通过将界面的操作转换成SQL语句,提交给SQLAlchemy适配数据源查询并返回结果,对于Druid,Caravel将界面的操作转换成Druid的API进行查询并返回结果,与Druid的深度集成,可以实现大规模海量数据的OLAP分析和实时探索。

另外,为了提高并发查询下的性能,还支持数据缓存,可配置将数据缓存至Redis、Memcache或者本地文件系统。
Caravel支持十几种可视化图表,用于将查询返回的数据做可视化展示:
20160606-6.png


关于PyKylin

PyKylin是由@Wu Xiang开源的Kylin DBAPI Driver 和SQLAlchemy Dialect
https://github.com/wxiang7/pykylin),Caravel使用SQLAlchemy适配数据源并提交查询,因此,需要使用PyKylin,将Kylin作为一个数据库引擎注册进SQLAlchemy,然后由Caravel自动适配并执行。


下载并安装Caravel-Kylin

Python 2.7.*. (建议使用Python3,避免中文乱码问题)。
关于Python的其他依赖,请参考:http://airbnb.io/caravel/installation.html (OS dependencies)

使用root用户或者sudo权限。

使用命令

下载zip包,并解压。
(建议使用 git clone https://github.com/rocky1001/caravel.git 来下载源码,之前发现wget获取的zip包不完整)

进入解压后根目录,执行下面的命令安装:
[mw_shl_code=bash,true]pip install .[/mw_shl_code]
PS:在国内建议使用https://pypi.tuna.tsinghua.edu.cn/simple/ 作为源来安装。
[mw_shl_code=bash,true]pip install . -i https://pypi.tuna.tsinghua.edu.cn/simple/[/mw_shl_code]
安装完后,执行下面的命令初始化Caravel:
[mw_shl_code=bash,true]## 创建admin用户
fabmanager create-admin --app caravel

## 初始化Caravel元数据
caravel db upgrade

## 初始化Caravel默认的用户角色和权限
caravel init

## 加载示例数据(可选)
caravel load_examples[/mw_shl_code]
另外,Caravel默认使用sqlite作为元数据库,配置在caravel_config.py 中,你可以修改使用其他如MySQL作为元数据。
如果你需要使用其他数据库作为Caravel的数据源,则还需要安装相应的Python包,如MySQL:
[mw_shl_code=bash,true]pip install mysqlclient[/mw_shl_code]

下载并安装PyKylin

使用root用户或者sudo权限。

使用命令

下载zip包,并解压。
(建议使用 git clone https://github.com/rocky1001/pykylin.git 来下载源码,之前发现wget获取的zip包不完整)

进入解压后根目录,执行下面的命令安装即可:
[mw_shl_code=bash,true]pip install .[/mw_shl_code]

启动Caravel-Kylin

Caravel和PyKylin成功安装后,执行下面的命令启动Caravel:
[mw_shl_code=bash,true]nohup gunicorn -w 16 --timeout 60 -b 0.0.0.0:8088 caravel:app >> /tmp/caravel.log 2>&1 &[/mw_shl_code]
注意:这里和Caravel给出的启动命令有所不同,这样的启动方式可以避免因查询页面关闭而造成的Server异常退出等问题,建议采用这种启动方式,并将日志重定向到文件中。

启动之后,可以在浏览器打开http://localhost:8088 ,使用admin/admin登陆Caravel。


创建Kylin数据源

20160606-7.jpg
20160606-8.jpg

这里需要注意Sqlalchemy Uri的写法:
kylin://ADMIN:KYLIN@172.16.212.17:7070/kylin/api?project=lxw1234
Kylin中的project名称,需要以URL参数的方式传递。

点击”TEST CONNECTION”,提示测试连接成功,并且在最下方,列出了project中所有的表。


添加Kylin表

20160606-10.jpg
20160606-11.jpg

其中,Database选择之前创建好的数据源,Table Name必须是数据源中对应真实的表名,表中必须包含一个Date或者Timestamp类型的字段。
另外,如果该表在Kylin中的Schema为DEFAULT,这里的Schema配置留空即可。


配置分析维度和指标

20160606-12.jpg

在Table List页面,点击表的Edit record按钮,进入属性编辑页面:
20160606-13.jpg

在List Table Column页面中,可以定义那些字段可以GroupBy,那些可以过滤,那些可以Count Distinct,那些可以Sum、Min、Max,那些字段属于时间序列字段(Is Dttm)。
20160606-14.jpg

在List Sql Metric页面,可以编辑和定义指标,如果上面对一些字段勾选了Sum、Min、Max、Count Distinct选项,则这里会自动生成相应的指标字段。


数据探索分析与可视化展示

Table定义好维度字段和指标之后,即可针对该表进行数据探索分析与可视化展示,在List Table页面,点击一个表名,即可进入:
20160606-15.jpg

如下图,在分析页面中,可以针对某一个表事先定义的时间字段、维度及指标字段进行数据探索分析,并可以选择相应的图表进行可视化展示。
20160606-16.jpg

可以将一个定制好的数据探索保存成Slice,后面直接从Slices页面查看:
20160606-17.jpg


定制自己的DashBoard

在添加DashBoard页面,可以将之前保存好的多个Slice组合成一个DashBoard:
20160606-18.jpg
20160606-19.jpg

其中,每个Slice对应的模块,可以自由拖拽位置和大小,并保存整个Dashboard的布局。


配置多表关联

为了支持Kylin中多表查询,一般是一个事实表关联多张维度表,并获取衍生维度,我们通过在Caravel Table中添加自定义字段,并对该字段定义一定规则的表达式(字段串常量),提交到PyKylin之后,PyKylin解析该字符串常量,转换成与维度表关联的SQL查询并返回结果。

这里做法有些粗糙,但功能基本实现,你可以参考该思路做进一步的优化和修改。

这里以事实表AD_REPORT2为例,其中有维度ID字段AD_ID,在Kylin中构建Cube时候,通过INNER JOIN维度表AD_DIM来获取维度名称AD_NAME。
在Caravel的AD_REPORT2中添加字段ad_name,
20160613-1.jpg

该字段表达式为字符串常量
[mw_shl_code=sql,true]'$|INNER JOIN (select ad_id as __ad_id,ad_name as __ad_name from LIUXIAOWEN.AD_DIM) as b ON (ad_id = __ad_id)|b.__ad_name|$'[/mw_shl_code]
字符串以$开头和结尾,以|分隔。

其中:INNER JOIN (select ad_id as __ad_id,ad_name as __ad_name from LIUXIAOWEN.AD_DIM) as b ON (ad_id = __ad_id) 定义了维度表、JOIN类型、ON条件,该字符串会直接添加到原始SQL中,作为JOIN子句;在维度表中的字段前面加上__为了和事实表中的字段区分而不用考虑表的别名。
b.__ad_name 定义了使用该字段作为最终的字段取值。

当选择ad_name作为维度查询时,Caravel提交给PyKylin的SQL语句为:
[mw_shl_code=sql,true]SELECT '$|INNER JOIN (select ad_id as __ad_id,ad_name as __ad_name from LIUXIAOWEN.AD_DIM) as b ON (ad_id = __ad_id)|b.__ad_name|$' AS ad_name,
SUM(imp_pv) AS sum__imp_pv
FROM liuxiaowen.AD_REPORT2
WHERE pt >= '2015-06-13'
AND pt <= '2016-06-13'
GROUP BY '$|INNER JOIN (select ad_id as __ad_id,ad_name as __ad_name from LIUXIAOWEN.AD_DIM) as b ON (ad_id = __ad_id)|b.__ad_name|$'
ORDER BY SUM(imp_pv) DESC
LIMIT 50[/mw_shl_code]
PyKylin经过转换后提交给Kylin的SQL语句为:
[mw_shl_code=sql,true]SELECT b.__ad_name as ad_name,
SUM(imp_pv) AS sum__imp_pv
FROM liuxiaowen.ad_report2
inner join (SELECT ad_id AS __ad_id,ad_name AS __ad_name FROM liuxiaowen.ad_dim) AS b
ON (ad_id = __ad_id)
WHERE pt >= '2015-06-13' AND pt <= '2016-06-13'
GROUP BY b.__ad_name
ORDER BY SUM(imp_pv) DESC[/mw_shl_code]
该配置方法对于关联一张维度表获取多个字段,以及关联多张维度表获取多个维度字段同样适用,只需要在Caravel Table中添加多个字段,表达式的写法一样即可。


其他

此版本只是在Caravel基础之上增加了对Apache Kylin的支持,Caravel的其他功能和支持的数据源不受任何影响。
Caravel UI上的错误提示非常不友好,很多时候需要根据Caravel日志来确定问题;
选择的时间段内没有数据、维度和指标的选择,都有可能造成图表不能正常显示;

转载自 lxw的大数据田地

已有(2)人评论

跳转到指定楼层
titanic 发表于 2016-8-5 14:34:04
nohup gunicorn -w 16 --timeout 60 -b 0.0.0.0:8088 caravel:app >> /tmp/caravel.log 2>&1 &
运行这个启动命令出现一下异常。
-----------------------------------------------------------------------------
[2016-08-05 13:58:54 +0000] [26298] [INFO] Starting gunicorn 19.4.5
[2016-08-05 13:58:54 +0000] [26298] [INFO] Listening at: http://0.0.0.0:8088 (26298)
[2016-08-05 13:58:54 +0000] [26298] [INFO] Using worker: sync
[2016-08-05 13:58:54 +0000] [26303] [INFO] Booting worker with pid: 26303
[2016-08-05 13:58:54 +0000] [26303] [ERROR] Exception in worker process:
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/gunicorn/arbiter.py", line 515, in spawn_worker
    worker.init_process()
  File "/usr/lib/python2.7/dist-packages/gunicorn/workers/base.py", line 122, in init_process
    self.load_wsgi()
  File "/usr/lib/python2.7/dist-packages/gunicorn/workers/base.py", line 130, in load_wsgi
    self.wsgi = self.app.wsgi()
  File "/usr/lib/python2.7/dist-packages/gunicorn/app/base.py", line 67, in wsgi
    self.callable = self.load()
  File "/usr/lib/python2.7/dist-packages/gunicorn/app/wsgiapp.py", line 65, in load
    return self.load_wsgiapp()
  File "/usr/lib/python2.7/dist-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp
    return util.import_app(self.app_uri)
  File "/usr/lib/python2.7/dist-packages/gunicorn/util.py", line 366, in import_app
    __import__(module)
ImportError: No module named caravel
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/gunicorn/arbiter.py", line 515, in spawn_worker
    worker.init_process()
  File "/usr/lib/python2.7/dist-packages/gunicorn/workers/base.py", line 122, in init_process
    self.load_wsgi()
  File "/usr/lib/python2.7/dist-packages/gunicorn/workers/base.py", line 130, in load_wsgi
    self.wsgi = self.app.wsgi()
  File "/usr/lib/python2.7/dist-packages/gunicorn/app/base.py", line 67, in wsgi
    self.callable = self.load()
  File "/usr/lib/python2.7/dist-packages/gunicorn/app/wsgiapp.py", line 65, in load
    return self.load_wsgiapp()
  File "/usr/lib/python2.7/dist-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp
    return util.import_app(self.app_uri)
  File "/usr/lib/python2.7/dist-packages/gunicorn/util.py", line 366, in import_app
    __import__(module)
ImportError: No module named caravel
[2016-08-05 13:58:54 +0000] [26303] [INFO] Worker exiting (pid: 26303)
[2016-08-05 13:58:54 +0000] [26298] [INFO] Shutting down: Master
[2016-08-05 13:58:54 +0000] [26298] [INFO] Reason: Worker failed to boot.
--------------------------------------------------------------------------------------------
java开发人员,没基础过python。不好意思
回复

使用道具 举报

lgwhwyhd 发表于 2016-8-6 11:29:44
在## 创建admin用户
fabmanager create-admin --app caravel
出现Was unable to import caravel Error: cannot import name urllib异常
操作系统centos7.2
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条