本文主要记录工作中,企业对开源项目Superset(https://github.com/apache/incubator-superset)的改进,以及个人对此项目的一些总结。当然也欢迎评论、赐教,若有转载请联系我。
注: 上图用了processon, 未采用思维导图重画
1. 开发工作流程和基础
1.1 开发环境
local 本地,dev 开发环境,pro 生产环境;当然主要是确保上线代码后功能的正确性,所以是本地测试ok,提交代码;然后上测试,测试主要是模拟线上,确保上线前的准确;最后上了生产也要测试,不然需要立马回滚,重新遵循本地->测试->生产
的上线流程。
多人开发,git的一些基础操作,必不可少;会有冲突,或者临时一些hotfix等情况。
1.2 框架
Superset采用了很传统的后端模板渲染前端的做法,只有少部分前端分离,在开发中也遇到了很多问题,如下列举了一些我在公司开发过程中遇到的困难和改进:
-
Flask Appbuilder
的英文文档学习不方便,使得很多前端交互优化,某些时候变得困难。 -
Flask
框架的角色管理:Admin
,Alpha
等确实提供了不少有效的权限管理,但是很多时候增改权限,容易忘记,这个也需要理解;在上线过程中,这里也犯过不少错误。 -
由于前后端不分离,导致很多时候开发比较麻烦,比如在进行性能优化上,前后端任务对接上。很多时候,前段需要理解后端,后端需要考虑前端,合作中沟通成本很大,也造成分工不明确,后端要写js,react的情况。实际上,我兼职了部分前端;不过由于人力的新增,我们提出了前后端分离,这样对Superset的改进交互将会增强,同时前后端都专注于自己的方向,对于学习和Supsert的性能优化都提供了便利。
实践中,还是采用了python2.7, 某些网络密集的操作使用了gevent
库用协程做了处理。关于python,开发中基本也不需要特别高深的语法,还是基础为主,可以参考:https://doctording.github.io/sword_at_offer/ 的python部分
2 Superset改进
2.1 数据源对接
Superset自身是能对接多种数据源的,MySQL, Apache Druid, Apache Kylin等等, 不过由于公司统一封装了一层数据服务,并有自己的SQL语义;所以在对接企业数据服务平台时,使用了 SQLAlchemy
拼接成符合平台查询的SQL,这样之后进行查询,再得到数据服务返回的结果,做可视化分析。
在数据源的数据表层面,我们加上了控制权限,如下
- 表级别的访问控制权限。表,我们称为逻辑表。
- 表的行,列级别的访问控制权限。一个表有很多这样的权限控制,能针对企业不能角色的人眼,每一个模板都称为一个逻辑表的权限模板, 一个逻辑表会有多个权限模板。
这样之后,某个用户对某张逻辑表查询的时候,我们会做权限校验,SQL拼接的时候也会加上特定的where,having等限制。
为了方便权限的使用和回收,接着使用了邮件审批流,并对接了公司的权限管理平台。这样用户的对某个逻辑表的某个权限模板的获取,将严格的通过审批控制。当然,实际后台也是能直接赋予权限的,这主要是开发中,遇到紧急问题的修复,脏数据处理等等
2.2 数据库相关
为了满足条件: 诸如上述对接数据源,逻辑表,以及改造Superset看板,切片等,对元数据存储的数据库进行了部分修改和新增(公司使用的是MySQL, 线上操作需要DBA)。在此过程的开发中遇到过部分问题:
-
数据库连接池的问题:Superset使用的是
SQLAlchemy
,Flask-SQLAlchemy
, 有一些配置的不合理,在后期由于用户增多产生了连接池不够的情况,做了处理,可参考我学习的整理笔记:https://github.com/doctording/MyTodos -
Superset里面有些多表join的慢查询,还有一些数据库操作使用的坑,也遇到了数据库事务的问题,等等一些做了不少工作,作为新人,也学到了不少东西。
2.3 日志
对日志模块,采用了python的Kafka
模块包,将日志打到公司的Kafka
平台。由于公司数据服务直接支持了Kafka
数据构造成逻辑表,所以我们也利用起来,将日志也能构造成Superset切片直接可视化。基于此,有不少对接用户使用了这种方式,做了一些数据统计方面的问题。对于Superset自身,我们就利用其能统计诸如:Superset使用用户情况,看板、切片创建和使用情况,用户查询SQL的情况等等,这极大的方便了工作。
python Kafka logging
学习可参考我的整理:https://github.com/doctording/py_kafka_logging
2.4 图表新增和优化
在开发过程中,Superset本身的图表就有很多bug,我们fix了不少,这个过程也研究了不少Python Pandas
的使用,诸如透视表等图表,非常需要Pandas
的数据处理能力。在图表显示方面,也替换了一些百度echarts
, 因为d3
,nvd3
有些显示问题真的很糟糕,对于用户反应的显示问题很难处理,我们兼顾了这些前端可视化组件,都采用了。
优化点还比较多,我简单的列举了几项,当然还有不少可优化指出:
- 在某些排序场景,优化成了
通讯录
排序方式,支持更自由的排序 - 图表上加上筛选,颜色变化等
- 数据导出,优化
csv
,excel
等下载,切片的分享也优化成公司方便等交流工具 - 中文更加的友好,各种筛选,提示等
- 某些图表新增漂移对比功能,比如
日环比
,月环比
等等
2.5 看板、切片的改进
看板dashbords
,切片slices
这两块是整个Superset比较核心的地方,图表的各种分析,展示主要依靠此,Superset对此部分的前后端代码还是比较清晰的,前端主要是react
,antd
等js库。
看板,切片都增加了分组管理,即目录一样等的,这方便不同部门,小组查看自身的切片,同时增加了公开,私有的概念,也是方便用户自己对自己创建的东西可以保护,管理。
切片必然对应一个逻辑表,在权限上,比如上级大佬看到某个切片时,想知道该切片数据表权限还有那些人,权限怎么来的等,我们集成到了切片上,并且提供了快捷等删除权限等操作。
针对部分图表我们增加了告警功能,比如折线图某个指标量,我们可能需要对比上周,上月,昨天等,发现有什么大波动,能给予告警,在告警方式上,当然也是支持诸如:邮件,短信,电话告警等
2.6 权限管理
无论是切片,看板,还是用户登录,使用数据,各个地方都需要理清楚权限。对企业数据的保护,是一种责任。
项目进行中,由于缓存
问题,也出过一次权限事故;还有一些接口对接没有同步,造成权限泄漏的假象,被批评的现象。
权限这部分,不难,但要做好,难。所以测试需要更加的细致些。
3. Superset技术栈
后端:
- Python基础语法,协程,
- 一些常用Python库:时间,HTTP处理,Sqlparse语法解析库,logging,kafka
- Flask,Flask-Appbuilder(框架,权限,接口暴露)
- Sqlachemy, Flask-Sqlachemy (Python数据库处理相关)
- Pandas(Python数据处理, 重点掌握)
- 缓存基础知识
前端:
- 主要是React & Antd (Flask-appbuilder 前端)
- 可视化图表库: echats,d3.js,nvd3.js
- 前端各种组件
- HTTP协议熟练掌握
4. 2019年项目展望
-
前后端分离,性能更加的好,前端显示,交互等友好,方便,舒服
-
后端支持更大的并发量,减少bug
-
告警更加完善,对数据延迟,各种自定义计算分析支持的更好
-
图表的丰富和加强,满足各种多维分析,自定义维度,自定义指标,自定义参考线等等
// TODO