锐浪报表数据源access_kylin+SuperSet实现实时大数据报表的快速开发

最近我的团队将报表计算引擎从阿里的OLAP分析中间价迁移到了kylin上,解决了非常多的问题,将一些我们的解决方案分享出来,希望对读者或者在用kylin的人有所帮助。

一、 之前现状和问题

之前我们系统的报表都是基于阿里云的相关组件开发的,业务系统在业务代码中将数据同步到消息队列中,然后阿里OLAP分析中间件再从消息队列同步数据,再基于OLAP分析中间价提供的api开发查询逻辑,前端还要开发报表展示的代码。这种方式上线以后,随着数据量的不断增长暴露出了很多缺陷。

1. 经常会出现消息丢失的情况,或者系统变慢的情况。

2. 由于购买的阿里云的服务,相关中间件对我们来说一直是一个黑盒,问题很不好定位和解决,而且很多问题的解决依赖于阿里云,响应时效不是很及时,长此以来积累了大量的报表问题,客户抱怨声不断。

3. 开发工作量庞大,产品人员设计好一张报表以后,要上线要苦等一个多月的开发时间,而且遇到问题还无法上线。

基于以上问题我们觉得再继续用阿里的OLAP中间件作为我们的报表计算引擎,后续问题会越来越多。因此我们尝试使用新的报表引擎,这个报表引擎对我们一定不是一个黑盒。

二、 报表计算引擎的选择(kylin)

基于以上几个问题,在对tidb,druid,kylin,mdrill等各种开源系统进行调研以后,最终选择了kylin作为我们的报表计算引擎,一方面是sql支持度相对来说比其他系统好比如精确distinct功能,一方面是和hadoop的几个组件集成得非常好,tidb和已有hadoop组件集成得不大好,需要重新搭建集群代价很大。还有就是基于java开发很符合团队的技能特点,可以根据业务特点定制我们自己的版本。

三、 数据分钟级延迟问题解决(canal+flume+kafka)

选好了kylin这个报表计算引擎后,还需要解决的就是我们报表计算的数据延迟最大也要到分钟级别,这个可以通过kylin的kafka数据源来实现,配置方式见下面的链接。

http://kylin.apache.org/cn/docs/tutorial/cube_streaming.html

但是使用kafka还有一个问题就是业务系统的数据怎么实时的传输到kafka呢,之前都是在业务系统中编写数据发送逻辑到消息队列中,这种方式和业务系统耦合非常大,随便改点逻辑都需要依赖于业务系统上版本周期很长,沟通成本很大。因此我们采取了用阿里巴巴开源的canal抓取mysql binlog的方式,实时的去抓取mysql的增删改查数据,这种方式要开启mysql的binlog。Canal项目的主页:

https://github.com/alibaba/canal

有了canal抓取并解析binlog以后,还有一个问题要解决的是怎么让canal抓取到的数据可靠的传输到kafka中,基于canal和kafka的api自己开发的方式,成本很大,而且要考虑高可用,容错,扩展性等问题,再者我们的时间和开发资源也非常有限,因此我们基于flume的接口开发了一个canal source,充分利用flume的灵活性,扩展性,高可用,负载均衡和容错等特性,同时也可以和已有的source,channel和sink组件随意组合。

这样通过canal+flume+kafka和kylin的streaming cube特性,我们就很好的解决了数据分钟级别的延迟问题。

四、 数据实时更新和删除问题

下一个要解决的问题就是数据的更新和删除的问题,这个我们是基于业务逻辑来解决的,当然我们在实现上会考虑好业务场景的通用性,每次更新和删除数据我们都不会去修改原来的数据,而是往kafka中插入新的数据并标记这条数据是删除,还是更新,并记录前后值的变化,同时在接入层面尽可能对数据进行去重处理,降低后续cube构建和sql编写的难度。

由于我们在数据层面和原来的变化了,因此我们还需要在sql层面进行改写,当然改写后的sql肯定要利用上kylin的预计算特性,否则查询速度很慢。

在解决数据实时更新和删除问题上,耗费了我们大量的时间,前后也讨论过很多种方案,而且实现起来需要对kylin的预计算特性有深入的了解,对维度设计要利用kylin的特性充分的进行精简,否则会走弯路。

下面是我们的model和cube界面:

五、 并发查询问题

接下来就是并发查询的问题了,由于kylin本身就带有cache特性,负载均衡而且采用的是预计算模式,因此应付并发上很好办,负载均衡这一块开始准备用nginx做负载均衡,后来觉得自己维护还是很麻烦,而且我们其他系统已经在使用阿里的SLB做负载均衡了,因此最终我们还是用SLB来做负载均衡。

六、 使用superset报表开发方式

最后要解决的一个问题就是开发效率的问题了,之前我们的报表开发后台首先要手工编写大量的sql,然后使用spring和mybatis编写大量的业务逻辑,并通过微服务的方式暴露接口,然后前端再根据接口,编写前端展示代码,而且移动端,电脑端都要写一套。

这种方式开发周期长,耗费人力大,而且工作挑战不大也比较枯燥,大家都很痛苦,产品等得痛苦,开发开发得痛苦。

因此我们调研了几个前端的工具,后来发现了airbnb开源的superset这个好东西,操作简单,图表美观,而且单表不支持的情况可以通过自定义sql来支持。最关键的是kylin对它进行了很好的集成,链接如下:

http://kylin.apache.org/blog/2018/01/01/kylin-and-superset/

还有一个关键点是superset的图表可以通过iframe嵌入到网页中数据不是静态的而是随时更新的,还支持在电脑端和手机端展示,对数据和图表的权限控制也做得非常到位。基本满足了自助开发,然后嵌入到页面中展示的要求,可以大大节省我们的报表开发周期和开发工作量,甚至可以做到让产品自助拖拽式开发。

Superset Kylin数据源配置:

图表开发:

Iframe嵌入:

七、 最终的架构

八、 一些实现细节

1. canal主备切换的时候数据会重复,这个问题需要在接入层面或者在canal层面注意,我们是在接入层面监测到切换后对最近数据进行实时去重(自己编写flume source带去重逻辑,会缓存一个可配置时间段的数据,因为canal切换很快所以不需要缓存很长时间,而且用storm里面的timecachmap不会影响到性能)。

2. kylin不支持hadoop和habse的高版本,之前我尝试把我们的集群升级到了hdp3.0版本(hive3.1,hadoop3.0,hbase2.1),也尝试修改kylin源码来适配高版本,但是改到后面发现工作量非常大,时间来不及只好又把集群回退到了hdp2.6.4版本,后面把kylin修改好以后再升级集群。

3. 查询一定要利用kylin的预计算特性否则时间会很长,尤其是子查询很可能会导致利用不上预计算特性。

4. 设计cube的时候维度一定要尽量精简。

5. Kylin的distinct有精确distinct和非精确的,精确的计算要占用非常大的内存。

6. steaming表是不能和lookup表进行join的。

7. superset支持iframe嵌入要修改一些配置权限配置和跨站访问配置,否则不能展示或者要登录。

跨站访问修改这个配置:

HTTP_HEADERS = {'X-Frame-Options': ' '}

免登录访问加入以下配置:

PUBLIC_ROLE_LIKE_GAMMA = True

Public 角色的permissions里把以下三个加上

can explore on Superset
can explore json on Superset
all database access on all_database_access

8.负载均衡模式下,kylinserver session要共享,安全验证用默认的会有多线程更新冲突,要修改。

九、 写在后面

时间仓促,整体方案写出来了,具体细节和遇到的问题写得不够详细有需要进一步了解的可以留言交流。后续报表这一块我们会进一步做到自定义报表到时的维度挑战是一个更大的问题,肯定需要进一步的优化当前方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460369.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

结构体定义的三钟方式

#include <stdio.h>#include <string.h>structStudent{ intid; charname[ 20 ]; intage;} s3; //定义方式3&#xff0c;不常用的一种方式intmain(){ structStudent s1; //定义方式1s1.id 0 ; strcpy (s1.name, "Zhang" ); s1.age 20 ; stru…

极大似然估计 摘自维基百科

最大似然估计[编辑] 原文地址&#xff1a; http://zh.wikipedia.org/wiki/%E6%9C%80%E5%A4%A7%E4%BC%BC%E7%84%B6%E4%BC%B0%E8%AE%A1 最大似然估计&#xff0c;也称为最大概似估计&#xff0c;是一种统计方法&#xff0c;它用来求一个样本集的相关概率密度函数的参数。这个方…

unity改变图片像素大小_类动森像素画反向转换 (xBR)

起因前阵子沉迷动森&#xff0c;DIY 样式的画风真的超萌(&#xff9f;д&#xff9f;)&#xff89;&#xff0c;恰巧在推上看到有个小姐姐在讨论这个像素画转换的算法&#xff0c;就想在 Unity 里整整。最后实现的镜头特效效果如下图。像素缩放算法常见的像素缩放算法对比图如下…

【记忆化搜索】bzoj3208 花神的秒题计划Ⅰ

暴力 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define N 701 const int dx[]{0,0,-1,1},dy[]{-1,1,0,0}; int n,mem[N][N],a[N][N],m; bool cant[N][N]; int f(int x,int y) {if(mem[x][y]) return mem[x][y];mem[x][…

c语言程序2

题目&#xff1a;有一分数序列&#xff1a;2/1&#xff0c;3/2&#xff0c;5/3&#xff0c;8/5&#xff0c;13/8&#xff0c;21/13...求出这个数列的前20项之和。1.程序分析&#xff1a;请抓住分子与分母的变化规律。2.程序源代码&#xff1a; #include "stdio.h" …

99 网络编程_传统网络工程师如何利用python实现公司内网IP地址信息查询?

网工圈网络工程师阿龙圈内最早的公益公众号,本号已认证&#xff01;学网络关注我一个就够了(关注近5w)关注听说99%的网工都来这里充电吖关注我&#xff0c;一个老HCIE(编号3558)带你轻松玩网络技术&#xff01; 交个朋友&#xff0c;一起和一个技术狂热者相互交流&#xff0c;共…

[原创]windows server 2012 AD架构试验系列 – 12 配置操作主机

[原创]windows server 2012 AD架构试验系列 – 12 配置操作主机ActiveDirectory支持域中所有域控制器之间的目录数据存储的多主机复制&#xff0c;因此域中的所有域控制器实质上都是对等的。ActiveDirectory支持域中所有域控制器之间的目录数据存储的多主机复制&#xff0c;因此…

应用沙盒

应用沙盒结构&#xff1a; 应用程序包&#xff1a;包含了所有的资源文件和可执行文件&#xff0c;这个压缩包的内容是不可以修改的。 Documents:保存应用程序运行时生成的需要持久化的的数据&#xff0c;ITunes同步设备时会备份该目录。 Library/Caches:保存应用程序运行时生成…

笔记本换内存条

步骤一 拆除护盖 笔记本内存插槽上都有护盖保护&#xff0c;首先第一步就是先将护盖拆掉。大多数笔记本的护盖上都有标识&#xff0c;有的是内凹的内存图形&#xff0c;而且从护盖的大小也能看出来&#xff0c;一般内存护盖的大小&#xff0c;就比内存条大一点。当然有不少笔记…

python更新es数据_python操作es增删改查

1.查询(search)# 获取案例库信息app.route(/get_dcn_cases, methods[GET, POST])def get_dcn_cases():# 告警事件数据dcn_cases_query {"_source": {"includes": ["faultName", "endTime", "startTime", "checked&quo…

angularJS 指令实践

AngularJS 指令&#xff08;Directives&#xff09;实践指南(1) 2014-03-12 10:22 陈鑫伟 编译 伯乐在线我要评论(0)字号&#xff1a;T|T一个指令用来引入新的HTML语法。指令是DOM元素上的标记&#xff0c;使元素拥有特定的行为。举例来说&#xff0c;静态的HTML不知道如何来创…

数据结构四双向链表

双向链表也叫双链表&#xff0c;是链表的一种&#xff0c;它的每个数据结点中都有两个指针&#xff0c;分别指向直接后继和直接前驱。所以&#xff0c;从双向链表中的任意一个结点开始&#xff0c;都可以很方便地访问它的前驱结点和后继结点。而之前的单链表为单向链表&#xf…

smtplib python教程_Python使用poplib模块和smtplib模块收发电子邮件的教程

poplib模块接收邮件python的poplib模块是用来从pop3收取邮件的&#xff0c;也可以说它是处理邮件的第一步。POP3协议并不复杂&#xff0c;它也是采用的一问一答式的方式&#xff0c;你向服务器发送一个命令&#xff0c;服务器必然会回复一个信息。pop3命令码如下&#xff1a;命…

C#发送电子邮件 (异步) z

///验证电子邮件的正则表达式 string emailStr "^([\w-\.])((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]\.)))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$"; /// <summary> /// 异步发送电子邮件 /// </summary> /// <p…

Linux服务器的初步配置流程

开发网站的时候&#xff0c;常常需要自己配置Linux服务器。 本文记录配置Linux服务器的初步流程&#xff0c;也就是系统安装完成后&#xff0c;下一步要做的事情。这主要是我自己的总结和备忘&#xff0c;如果有遗漏&#xff0c;欢迎大家补充。 下面的操作针对Debian/Ubuntu系统…

C语言趣味程序百例精解

1.绘制余弦曲线 在屏幕上用“*”显示0~360度的余弦函数cos(x)曲线 *问题分析与算法设计 如果在程序中使用数组&#xff0c;这个问题十分简单。但若规定不能使用数组&#xff0c;问题就变得不容易了。 关键在于余弦曲线在0~360度的区间内&#xff0c;一行中要显示两个点&#xf…

cocos2dx 圆盘抽奖_cocoscreator之微信小游戏的抽奖转盘

许多小游戏里面都有涉及到抽奖环节&#xff0c;所以就可能会用到抽奖转盘的制作&#xff0c;今天分享一个自己左转盘的小小过程。1、准备材料过程不多说&#xff0c;拼完界面之后大概是这样的&#xff1a;2、给界面绑定脚本&#xff0c;在脚本的properties里面绑定转盘节点&…

测试报告分析

测试分析报告 1&#xff0e;引言 1 1.1编写目的 1 1.2项目背景 1 1.3参考资料 2 2&#xff0e;测试计划执行情况 2 2.1测试项目 2 2.2测试机构和人员 3 2.3测试结果 3 3&#xff0e;软件需求测试结论 7 4&#xff0e;评价 7 4.1软件能力 7 4.2缺陷和限制 7 4.3建议 7 4.4测试结…

不要学习代码,要学会思考(转)

英文原文&#xff1a;Dont learn to code, learn to think 译/赖信涛 这是一个人人都在学习编程的时代&#xff1a;Code.org请了比尔盖茨&#xff0c;马克扎克伯格和克里斯波什等这些名人&#xff0c;来告诉你&#xff0c;每个人都可以编程&#xff1b;CoderDojo’s在各个国家悄…

python读取多个sheet文件_PythonPandas excel文件如何一次读取所有工作表,并再次写入多个工作表?,pythonpandasexcel,一次性,全部,sheet,重新...

关于如何一次性读取全部sheet&#xff0c;可看我之前写的一篇博客&#xff1b;本文重点讲述如何对同一个excel文件一次性写入多个sheet数据代码示例&#xff1a;import pandas as pdwriter pd.ExcelWriter("新数据.xlsx")sheet1Data [] # 这个为要向Sheet1写入的数…