工作项目总结:Superset

本文主要记录工作中,企业对开源项目Superset(https://github.com/apache/incubator-superset)的改进,以及个人对此项目的一些总结。当然也欢迎评论、赐教,若有转载请联系我。

在这里插入图片描述注: 上图用了processon, 未采用思维导图重画

1. 开发工作流程和基础

1.1 开发环境

local 本地,dev 开发环境,pro 生产环境;当然主要是确保上线代码后功能的正确性,所以是本地测试ok,提交代码;然后上测试,测试主要是模拟线上,确保上线前的准确;最后上了生产也要测试,不然需要立马回滚,重新遵循本地->测试->生产的上线流程。

多人开发,git的一些基础操作,必不可少;会有冲突,或者临时一些hotfix等情况。

1.2 框架

Superset采用了很传统的后端模板渲染前端的做法,只有少部分前端分离,在开发中也遇到了很多问题,如下列举了一些我在公司开发过程中遇到的困难和改进:

  1. Flask Appbuilder的英文文档学习不方便,使得很多前端交互优化,某些时候变得困难。

  2. Flask框架的角色管理:Admin,Alpha等确实提供了不少有效的权限管理,但是很多时候增改权限,容易忘记,这个也需要理解;在上线过程中,这里也犯过不少错误。

  3. 由于前后端不分离,导致很多时候开发比较麻烦,比如在进行性能优化上,前后端任务对接上。很多时候,前段需要理解后端,后端需要考虑前端,合作中沟通成本很大,也造成分工不明确,后端要写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,这样之后进行查询,再得到数据服务返回的结果,做可视化分析。

在数据源的数据表层面,我们加上了控制权限,如下

  1. 表级别的访问控制权限。表,我们称为逻辑表。
  2. 表的行,列级别的访问控制权限。一个表有很多这样的权限控制,能针对企业不能角色的人眼,每一个模板都称为一个逻辑表的权限模板, 一个逻辑表会有多个权限模板。

这样之后,某个用户对某张逻辑表查询的时候,我们会做权限校验,SQL拼接的时候也会加上特定的where,having等限制。

为了方便权限的使用和回收,接着使用了邮件审批流,并对接了公司的权限管理平台。这样用户的对某个逻辑表的某个权限模板的获取,将严格的通过审批控制。当然,实际后台也是能直接赋予权限的,这主要是开发中,遇到紧急问题的修复,脏数据处理等等

2.2 数据库相关

为了满足条件: 诸如上述对接数据源,逻辑表,以及改造Superset看板,切片等,对元数据存储的数据库进行了部分修改和新增(公司使用的是MySQL, 线上操作需要DBA)。在此过程的开发中遇到过部分问题:

  1. 数据库连接池的问题:Superset使用的是SQLAlchemy,Flask-SQLAlchemy, 有一些配置的不合理,在后期由于用户增多产生了连接池不够的情况,做了处理,可参考我学习的整理笔记:https://github.com/doctording/MyTodos

  2. 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有些显示问题真的很糟糕,对于用户反应的显示问题很难处理,我们兼顾了这些前端可视化组件,都采用了。

优化点还比较多,我简单的列举了几项,当然还有不少可优化指出:

  1. 在某些排序场景,优化成了通讯录排序方式,支持更自由的排序
  2. 图表上加上筛选,颜色变化等
  3. 数据导出,优化csv,excel等下载,切片的分享也优化成公司方便等交流工具
  4. 中文更加的友好,各种筛选,提示等
  5. 某些图表新增漂移对比功能,比如日环比,月环比等等

2.5 看板、切片的改进

看板dashbords,切片slices 这两块是整个Superset比较核心的地方,图表的各种分析,展示主要依靠此,Superset对此部分的前后端代码还是比较清晰的,前端主要是reactantd等js库。

看板,切片都增加了分组管理,即目录一样等的,这方便不同部门,小组查看自身的切片,同时增加了公开,私有的概念,也是方便用户自己对自己创建的东西可以保护,管理。

切片必然对应一个逻辑表,在权限上,比如上级大佬看到某个切片时,想知道该切片数据表权限还有那些人,权限怎么来的等,我们集成到了切片上,并且提供了快捷等删除权限等操作。

针对部分图表我们增加了告警功能,比如折线图某个指标量,我们可能需要对比上周,上月,昨天等,发现有什么大波动,能给予告警,在告警方式上,当然也是支持诸如:邮件,短信,电话告警等

2.6 权限管理

无论是切片,看板,还是用户登录,使用数据,各个地方都需要理清楚权限。对企业数据的保护,是一种责任。

项目进行中,由于缓存问题,也出过一次权限事故;还有一些接口对接没有同步,造成权限泄漏的假象,被批评的现象。

权限这部分,不难,但要做好,难。所以测试需要更加的细致些。

3. Superset技术栈

后端:

  1. Python基础语法,协程,
  2. 一些常用Python库:时间,HTTP处理,Sqlparse语法解析库,logging,kafka
  3. Flask,Flask-Appbuilder(框架,权限,接口暴露)
  4. Sqlachemy, Flask-Sqlachemy (Python数据库处理相关)
  5. Pandas(Python数据处理, 重点掌握)
  6. 缓存基础知识

前端:

  1. 主要是React & Antd (Flask-appbuilder 前端)
  2. 可视化图表库: echats,d3.js,nvd3.js
  3. 前端各种组件
  4. HTTP协议熟练掌握

4. 2019年项目展望

  • 前后端分离,性能更加的好,前端显示,交互等友好,方便,舒服

  • 后端支持更大的并发量,减少bug

  • 告警更加完善,对数据延迟,各种自定义计算分析支持的更好

  • 图表的丰富和加强,满足各种多维分析,自定义维度,自定义指标,自定义参考线等等

// TODO

发布了441 篇原创文章 · 获赞 110 · 访问量 57万+

猜你喜欢

转载自blog.csdn.net/qq_26437925/article/details/86550053