微信搜索bigdata029 | 邀请体验:数阅–数据管理、OLAP分析与可视化平台 | 订阅本站 | 赞助作者:赞助作者

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

Kylin lxw1234@qq.com 10791℃ 41评论

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支持十几种可视化图表,用于将查询返回的数据做可视化展示:

caravel-kylin

关于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权限。

使用命令

wget –no-check-certificate https://github.com/rocky1001/caravel/archive/caravel-kylin.zip

下载zip包,并解压。

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

进入解压后根目录,执行下面的命令安装:

pip install . 

PS:在国内建议使用https://pypi.tuna.tsinghua.edu.cn/simple/ 作为源来安装。

pip install . -i https://pypi.tuna.tsinghua.edu.cn/simple/

安装完后,执行下面的命令初始化Caravel:

## 创建admin用户
fabmanager create-admin --app caravel

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

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

## 加载示例数据(可选)
caravel load_examples

另外,Caravel默认使用sqlite作为元数据库,配置在caravel_config.py 中,你可以修改使用其他如MySQL作为元数据。
如果你需要使用其他数据库作为Caravel的数据源,则还需要安装相应的Python包,如MySQL:

pip install mysqlclient

下载并安装PyKylin

使用root用户或者sudo权限。

使用命令

wget –no-check-certificate https://github.com/rocky1001/pykylin/archive/caravel-kylin.zip

下载zip包,并解压。

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

进入解压后根目录,执行下面的命令安装即可:

pip install .

启动Caravel-Kylin

Caravel和PyKylin成功安装后,执行下面的命令启动Caravel:

nohup gunicorn -w 16 --timeout 60 -b 0.0.0.0:8088 caravel:app >> /tmp/caravel.log 2>&1 &

注意:这里和Caravel给出的启动命令有所不同,这样的启动方式可以避免因查询页面关闭而造成的Server异常退出等问题,建议采用这种启动方式,并将日志重定向到文件中。
启动之后,可以在浏览器打开http://localhost:8088 ,使用admin/admin登陆Caravel。

创建Kylin数据源

caravel-kylin

caravel-kylin

这里需要注意Sqlalchemy Uri的写法:
kylin://ADMIN:KYLIN@172.16.212.17:7070/kylin/api?project=lxw1234
Kylin中的project名称,需要以URL参数的方式传递。
点击”TEST CONNECTION”,提示测试连接成功,并且在最下方,列出了project中所有的表。

添加Kylin表

caravel-kylin

caravel-kylin

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

配置分析维度和指标

caravel-kylin

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

caravel-kylin

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

caravel-kylin

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

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

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

caravel-kylin

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

caravel-kylin

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

caravel-kylin

定制自己的DashBoard

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

caravel-kylin

caravel-kylin

其中,每个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,

caravel-kylin

该字段表达式为字符串常量:

'$|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|$'

字符串以$开头和结尾,以|分隔。
其中: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语句为:

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

PyKylin经过转换后提交给Kylin的SQL语句为:

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

该配置方法对于关联一张维度表获取多个字段,以及关联多张维度表获取多个维度字段同样适用,只需要在Caravel Table中添加多个字段,表达式的写法一样即可。

其他

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

作者:
lxw http://lxw1234.com/
Rocky Qi https://github.com/rocky1001

 


20160812更新:

很多网友在按照上面的方法(基于源码离线安装)安装之后,都遇到了js无法正常加载,页面无法正常显示的问题,该问题是由于node/npm环境未正确安装而导致的。

解决方法请参考官方说明 https://github.com/airbnb/caravel/blob/master/CONTRIBUTING.md#setting-up-the-node–npm-javascript-environment

或者 http://www.cnblogs.com/kevin19900306/p/5701401.html

 

如果觉得本博客对您有帮助,请 赞助作者

转载请注明:lxw的大数据田地 » 开源数据可视化工具(For Apache Kylin)使用说明

喜欢 (22)
分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(41)个小伙伴在吐槽
  1. 博主,您好 安装Caravel-Kylin报错 :pip install .--user 另外Caravel-Kylin和PyKylin的地址好像是一样的 Installing collected packages: caravel Running setup.py install for caravel ... error Complete output from command /usr/local/bin/python -u -c "import setuptools, tokenize;__file__='/tmp/pip-JBIve4-build/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-oIHPQJ-record/install-record.txt --single-version-externally-managed --compile --user --prefix=: running install running build running build_py creating build creating build/lib creating build/lib/tests copying tests/caravel_test_config.py -> build/lib/tests copying tests/core_tests.py -> build/lib/tests copying tests/__init__.py -> build/lib/tests running egg_info creating caravel.egg-info writing requirements to caravel.egg-info/requires.txt writing caravel.egg-info/PKG-INFO writing top-level names to caravel.egg-info/top_level.txt writing dependency_links to caravel.egg-info/dependency_links.txt writing manifest file 'caravel.egg-info/SOURCES.txt' warning: manifest_maker: standard file '-c' not found reading manifest file 'caravel.egg-info/SOURCES.txt' writing manifest file 'caravel.egg-info/SOURCES.txt' running build_scripts creating build/scripts-2.7 error: file '/tmp/pip-JBIve4-build/caravel/bin/caravel' does not exist ---------------------------------------- Command "/usr/local/bin/python -u -c "import setuptools, tokenize;__file__='/tmp/pip-JBIve4-build/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-oIHPQJ-record/install-record.txt --single-version-externally-managed --compile --user --prefix=" failed with error code 1 in /tmp/pip-JBIve4-build/
    star2016-06-20 14:31 回复
    • 两个压缩包名一样,但路径和内容不一样,你可以下载后改一下pykylin的压缩包文件名。 这个错误可能是这个原因导致的。 另外,pip install .–user 是什么意思?
      lxw1234@qq.com2016-06-20 14:38 回复
      • 哦 我还没到pykylin这步呢 上面的错是在安装 Caravel-Kylin时候报的 --user是安装在当前用户下
        star2016-06-20 14:43 回复
        • 好,我看看,之前都是用的root用户。
          lxw1234@qq.com2016-06-20 14:48 回复
        • (建议使用 git clone https://github.com/rocky1001/caravel.git 来下载源码,之前发现wget获取的zip包不完整) 是这个问题导致的,linux中wget获取到的zip包有时候发现不完整,不清楚咋回事。
          lxw1234@qq.com2016-06-20 15:39 回复
  2. 你好博主,我这边一直启动失败,不知道是什么原因,能否帮我查看下。 2016-06-27 17:49:33,615:ERROR:flask_appbuilder.base:Add Permission on Menu Error: (sqlite3.InterfaceError) Error binding parameter 0 - probably unsupported type. [SQL: 'SELECT ab_view_menu.id AS ab_view_menu_id, ab_view_menu.name AS ab_view_menu_name \nFROM ab_view_menu \nWHERE ab_view_menu.name = ?\n LIMIT ? OFFSET ?'] [parameters: (l'Security', 1, 0)]2016-06-27 17:49:33,618:INFO:flask_appbuilder.base:Registering class CssTemplateModelView on menu CSS Templates 2016-06-27 17:49:33,619:INFO:flask_appbuilder.base:Registering class DruidDatasourceModelView on menu Druid Datasources 2016-06-27 17:49:33,623:ERROR:flask_appbuilder.base:Add Permission on Menu Error: (sqlite3.InterfaceError) Error binding parameter 0 - probably unsupported type. [SQL: 'SELECT ab_view_menu.id AS ab_view_menu_id, ab_view_menu.name AS ab_view_menu_name \nFROM ab_view_menu \nWHERE ab_view_menu.name = ?\n LIMIT ? OFFSET ?'] [parameters: (l'Security', 1, 0)] 启动页的报错为: access denied.
    alentain2016-06-28 10:52 回复
  3. 博主:你好!请问下caravel中文乱码的问题,你们解决了吗?如何解决的?我原来用的python2.7是乱码,升级成3.4了 还是乱码
    云开2016-07-06 15:46 回复
    • 不知你说的中文乱码是指哪块的中文? 我们目前用的Python 3.5.1
      lxw1234@qq.com2016-07-07 08:26 回复
      • 数据源显示时就是乱码,数据源目前是mysql,字符集是utf8。不知是caravel显示的问题吗?caravel能设置显示字符吗?在哪里设置?谢谢。
        云开2016-07-07 09:22 回复
        • mysql://user:XXXXXXXXXX@localhost:3306/dbname?charset=utf8 配置数据源时候加上上面的参数试试。
          lxw1234@qq.com2016-07-07 14:37 回复
          • ok,按您说的设置了,没有乱码了。谢谢博主啊赞!
            云开2016-07-07 16:21
  4. 你好,我在机器上装了两个版本的python,2.6和3.5,因为很多项目依赖2.6所以默认指向是2.6,caravel可不可以手动指向python,现在默认会装在2.6的目录下
    wj02282016-07-29 15:36 回复
  5. 博主你好,请问Caravel支持HANA数据库吗
    TJ2016-08-02 18:29 回复
  6. StatementError: (exceptions.AttributeError) 'EntryPoint' object has no attribute 'resolve' [SQL: u'INSERT INTO dbs (created_on, changed_on, database_name, sqlalchemy_uri, password, cache_timeout, extra, changed_by_fk, created_by_fk) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)'] [parameters: [{'password': u'aaaaaa', 'database_name': u'CDM', 'cache_timeout': 9999, 'sqlalchemy_uri': 'mysql://admin:XXXXXXXXXX@172.30.249.154:3306/CDM', 'extra': u'{\r\n "metadata_params": {},\r\n "engine_params": {}\r\n}\r\n'}]] 想连接mysql 试试效果,可是出现这个错误,不是很懂python,感觉像是返回参数和接收参数不匹配,可是为什么会出现这种问题,还有哪没有配置吗
    wj02282016-08-04 20:28 回复
  7. 请问支持离线安装吗?。。。。。
    木子简2016-08-11 18:13 回复
  8. 博主,好。麻烦博主看一下这个问题:在32位的win7系统中安装Caravel,python的版本是3.5,在执行安装caravel后,这个命令“fabmanager create-admin --app caravel”能正确执行,当执行命令“caravel db upgrade”提示:'caravel' 不是内部或外部命令,也不是可运行的程序或批处理文件。以为caravel没有正确安装,当再次执行命令“pip install caravel”时,提示下面这些(部分,剩余部分跟这一样,都提示‘Requirement already satisfied (use --upgrade to upgrade):’),大概意思是已经安装,但是为什么caravel命令不能执行呢?请博主指教 Requirement already satisfied (use --upgrade to upgrade): caravel in c:\users\ hl\appdata\local\programs\python\python35-32\lib\site-packages\caravel-0.10.0 -py3.5.egg Requirement already satisfied (use --upgrade to upgrade): cryptography==1.4 in c :\users\hl\appdata\local\programs\python\python35-32\lib\site-packages (fro m caravel) Requirement already satisfied (use --upgrade to upgrade): flask-appbuilder==1.8. 1 in c:\users\hl\appdata\local\programs\python\python35-32\lib\site-package s (from caravel) Requirement already satisfied (use --upgrade to upgrade): flask-cache==0.13.1 in c:\users\hl\appdata\local\programs\python\python35-32\lib\site-packages (f rom caravel) Requirement already satisfied (use --upgrade to upgrade): flask-migrate==1.5.1 i n c:\users\hl\appdata\local\programs\python\python35-32\lib\site-packages ( from caravel) Requirement already satisfied (use --upgrade to upgrade): flask-script==2.0.5 in c:\users\hl\appdata\local\programs\python\python35-32\lib\site-packages (f rom caravel) Requirement already satisfied (use --upgrade to upgrade): flask-testing==0.5.0 i n c:\users\hl\appdata\local\programs\python\python35-32\lib\site-packages ( from caravel) Requirement already satisfied (use --upgrade to upgrade): humanize==0.5.1 in c:\ users\hl\appdata\local\programs\python\python35-32\lib\site-packages (from caravel) Requirement already satisfied (use --upgrade to upgrade): gunicorn==19.6.0 in c: \users\hl\appdata\local\programs\python\python35-32\lib\site-packages (from caravel)
    hl2016-08-12 15:39 回复
    • 到caravel 安装目录下找到执行文件执行
      wj02282016-08-14 09:04 回复
      • :sad: 还是不行 E:\Areport\tool\caravel-0.10.0\caravel\bin>caravel 'caravel' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
        hl2016-08-15 14:45 回复
  9. 安装完成之后访问页面,进入dashboard发现页面css错误,并且提示缺少js和css。出现这个问题的解决办法是: 1、安装node and npm 2、 cd ${caravel_path}/caravel/assets npm install npm run prod 3、启动
    木子简2016-08-13 01:48 回复
    • 亲,在assets目录下执行了npm install npm run prod命令,结果是生成了一个node_modules目录,里面有npm、run、prod三个目录,但是启动后还是缺少css,请问你是怎么处理的
      龙小人2016-08-16 14:30 回复
    • 抱歉,是我搞错了,原来npm install和npm run prod是两条命令,之前写成一条了 :mrgreen:
      龙小人2016-08-16 14:47 回复
    • 想问下你用的npm的版本是多少~
      龙小人2016-08-17 11:27 回复
      • 我发现我总是安装不了,我现在使用的python2.7 pip 8.1.2 caravel-0.8.9 pykylin-0.0.1,此外npm3.10.9 和 node v5.11.1。
        tc7926178712016-10-24 20:09 回复
  10. 博主 你的站 评论吃掉了换行,使用不友好,建议优化
    木子简2016-08-13 01:49 回复
  11. 636- return '%Y-%m-%d' 637- if type == 'TIME': 638- return '%H:%M:%S' 639- return '%Y-%m-%d %H:%M:%S.%f' 640- 641- tf = get_dtformat(cols[granularity].type or 'DATE') 642- 643- # tf = '%Y-%m-%d %H:%M:%S.%f' 644- tf = '%Y%m%d' 645- time_filter = [ 646: timestamp >= from_dttm.strftime(tf), 647- timestamp = inner_from_dttm.strftime(tf) ==================== git下来的这个版本里面的cols[granularity]字段没有了 这个字段很关键 认为应该保留
    木子简2016-08-15 17:21 回复
  12. 博主,您好,安装好caravel之后,caravel与kylin进行整合的时候,出现如下错误: ERROR:Traceback (most recent call last): ... ... ... NoSuchModuleError: Can't load plugin: sqlalchemy.dialects:kylin
    icichacici2016-09-30 14:41 回复
    • pykylin没有正确安装。
      lxw1234@qq.com2016-09-30 14:54 回复
      • 哦哦 博主,您好,请问执行sh js_build.sh的时候,出现ERROR in Cannot find module 'babel-core'错误。 请问怎么解决?
        icichacici2016-10-08 17:41 回复
  13. 楼主,上面的问题npm install babel-core babel-loader --save-dev之后已经解决掉了,现在又出现一个问题:
    icichacici2016-10-08 19:45 回复
  14. ERROR in ./javascripts/caravel-select2.js Module not found: Error: Cannot resolve 'file' or 'directory' ../node_modules/jquery-ui/themes/base/jquery-ui.css in /opt/caravel-master/caravel/assets/javascripts @ ./javascripts/caravel-select2.js 5:0-62 请问这个怎么解决啊??
    icichacici2016-10-08 19:46 回复
  15. 您好,我使用你上面的http://www.cnblogs.com/kevin19900306/p/5701401.html这个链接的安装方式安装,使用cnpm install的时候出现additional chunk assets 78%,然后就卡死了。请问下这个什么原因么?
    tc7926178712016-10-24 16:33 回复
    • 同样遇到问题 80% optimize chunk assets 最后就nodejs 内存溢出了
      ly81872016-10-25 11:42 回复
    • 两个版本 node --version v6.9.1 npm --version 3.10.8
      ly81872016-10-25 11:43 回复
      • 我也一直卡在78%和80%这里,两种情况都会出现。。。。。 npm版本是3.10.9 node是6.9.2
        Dr.Hell2016-12-25 00:54 回复
  16. 在List Sql Metric页面,可以编辑和定义指标,如果上面对一些字段勾选了Sum、Min、Max、Count Distinct选项,我勾选了相应的选项但是,没有生成对就原指标,求大神指导
  17. 博主:你好!请问下caravel中文乱码的问题,你们解决了吗?如何解决的?我原来用的python2.7是乱码,升级成3.3了 还是乱码 ,我用的是oracle数据库,这个参数是怎么设置的呢
  18. 博主:安装caravel好了,登录到后台发现有些js和css 404,发现javascripts/dist下的这个dist目录没有,在你的github上也没有这个目录
    jackyang2016-11-18 16:18 回复
  19. 博主,请教一个问题,对于Caravel/Superset 我刚开始研究 有个功能想请教下, 表格(table, pivot table)显示有没有Drill Down和Drill Through的功能
    Yang Li2016-11-25 22:52 回复
  20. 如何调用caravel中的图表?
    nineyz2016-12-06 11:29 回复
  21. 你好 我想请问这篇文章里最后提到的kylin schema是什么东西?我按照教程一步步做 最后schema不知道填写什么 留空的话就会添加失败 请问我要去哪里一个table对应的schema呢
    Light2017-01-12 11:06 (6天前)回复
    • 就是kylin中的project
      lxw1234@qq.com2017-01-12 13:38 (6天前)回复