麻袋财富(原麻袋理财)成立于 2014 年 12 月底,是中信产业基金控股的网络借贷信息中介平台,通过 4 年平稳而快速的发展,截至目前,累计交易金额达 750 亿,已成为行业头部平台。庞大的业务量带来了数据量指数级增加,原有的数据分析处理方式已远远不能知足业务的需求:数据库
流程耗时长:逻辑比较复杂的数据需求,可能会涉及到开发,产品经理,BI 等多方相关人员,经过反复的沟通,确认才能完成,而涉及人员过多增长了沟通成本,拉长项目周期windows
资源浪费:为了促进平台的销量增加,运营会设计各类产品促销或用户促活的短时间活动, 每次活动后都会进行复盘,没有产品化的活动分析一般会致使分析人员的人力浪费网络
集群压力大:一些须要长期监测的复杂指标,天天都要进行重复的查询,并且天天都有几百个临时 SQL 提交到集群中处理,形成集群计算压力大,影响集群性能架构
查询慢:随着数据量愈来愈大,每每一条聚合 SQL 须要几分钟才能出结果,数据分析师须要的快速响应要求已远远不能知足app
针对上述痛点,咱们但愿寻找一个工具可以给用户提供高效、稳定、便利的数据分析性能。ide
为何选择 Kylin工具
咱们调研了市面上主流的 OLAP 引擎,对比详情以下所示: oop
结合公司业务需求:性能
以 T+1 离线数据为主大数据
能够整合 Tableau 使用,实现自助分析
经常使用 30 个左右的维度,100 个左右的指标,任意交叉组合,覆盖 80%+ 的固定和临时需求
业务方须要观察用户从进入到离开的整个生命周期的特征,涉及数据量大,但要快速响应
咱们选择了 Kylin 做为 OLAP 分析引擎,缘由以下:
Kylin 使用预计算,以空间换时间,可以实现用户查询请求秒级响应
能够结合现有 BI 工具——Tableau,实现自助分析
原本须要耗时一周的需求在几分钟内出结果,开发效率提高了 10 倍以上
本文主要介绍麻袋财富基于 CDH 大数据平台的自助分析项目实施,如何将 Apache Kylin 应用到实际场景中,目前的使用现状以及将来准备在 Kylin 上作的工做。
技术架构
系统部署方面,主要分生产环境和预上线环境,生产环境主要负责查询分析,从生产集群 Hive 上跑计算,把预计算结果存储到 HBase。若是想新增一个 Cube 的话,须要分析人员先在预上线环境上操做,再由专人对 Cube 进行优化后迁移到生产环境。
麻袋财富的自助分析架构以下图所示:
数据同步:Sqoop(离线场景)、Kafka(近实时场景)
数据源:Hive(离线场景)、Streaming Table(近实时场景)
计算引擎:MapReduce/Spark
预计算结果存储:HBase
自助分析工具:Tableau
调度系统:Azkaban
Apache Kylin的解决方案
公司业务很是复杂,数据团队将各类业务需求高度抽象,肯定好维度和度量,只需构建一个 Cube,基于该 Cube,造成通用的平台化数据产品,解放数据分析师,下降重复性工做。
Kylin 的离线构建 (1)数据建模
数据建模对 Kylin 实施来讲是最重要的工做。通常使用关系数据库模型中的星型模型,可是现实中因为业务的多样性,维表的基数很大,因此通常咱们把表处理成宽表而且基于宽表建 OLAP 模型,宽表不只能解决数据模型的数据粒度问题,还能解决多表 join 的性能问题,以及维度变化、或者超高基数维度等问题。
各个业务线不一样的数据特色和业务特色决定了 Kylin 的使用场景及模型设计优化方式:
是数据规模和模型特色。从数据规模上来说,宽表的数据量近百亿,天天的增量数据千万级以上。咱们根据业务指标经过 OLAP 建模的高度抽象分析,定义了维度和度量值的关系以及底层数据粒度。
维度基数特色。维度基数最理想的状况是相对较小,但实际上有些维度超过了百万级接近千万级,这和业务需求及行业特色有关。除此以外指标上要用部分维度之间的笛卡尔积组合,形成很难简化 OLAP 模型,生成数据相应的开销也比较大。
维度粒度特色。从维度的角度来看,地域维度包含省份和城市;时间维度上须要一级划分年月日,增长了维度的复杂度。
指标也是维度特色。有一些指标既是维度也是度量,例如:咱们须要分析在投金额为 0 的用户的行为,又须要计算用户的在投金额,因此在投金额即为维度又是度量。
(2)Kylin Cube 设计
从 Kylin Cube 模型上来讲,因为 Cube 须要知足多种场景的需求,业务上须要多个维度互相灵活组合,与分析人员反复沟通,最终确认 Cube 的维度及度量。
Cube 模型概况:
19 个维度:包括省市、操做系统、设备型号、性别、绑卡状态、投资等级等
10 个度量:包括数据量、访问次数、登陆用户数、浏览量、投资金额、年化金额等
增量构建:某一 Cube 源数据增量为 300 万,Build 完一天数据 Cube 大小为 87.79GB
(3)Cube 设计的优化
Cube Build 过程当中常见遇到的是性能问题,例如 SQL 查询过慢、Cube 构建时间过长甚至失败、 Cube 膨胀率太高等等。究其缘由,大多数问题都是因为 Cube 设计不当形成的。所以,合理地进行 Cube 优化就显得尤其重要。
优化方案:
维度精简:去除查询中不会出现的维度,如数据建立日期
强制维度:把每次查询都须要的维度设为强制维度(Mandatory Dimensions)
层次维度: 把有层次的维度(省市或年月日)设为层次维度(Hierarchy Dimensions)
联合维度:把用户关心的维度组合设成联合维度(Joint Dimensions)
调整聚合组:设置多个聚合组,每一个聚合组内设置多组联合维度。不会同时在查询中出现的维度分别包含在不一样聚合组。
调整 Rowkeys 排序,对于基数高的维度,若在这个维度上有过滤、查询,则放在前面,经常使用的维度放在前面。
(4)Cube 优化成果
根据上面的优化方案, 把 assist_date 和 source 设为强制维度,把 province,city 设为层次维度,再根据使用频率和基数高低排序,最终的优化成果以下:
查询性能:秒级响应
构建时间:缩短 31%
Cube 大小:减少 42%
查询性能详情:业务明细表:10 亿
SQL 语句:求每一个城市的在投金额
Kylin 实时增量构建
为了减低 OLAP 分析的延时,在 Kylin 中添加 Streaming Table 实现准实时分析的功能,Kylin 以 Streaming Table 为数据源,Streaming Table 消费 Kafka 中的数据。模型中多增长一个 timestamp 类型的字段,用做时间序列。在实践过程当中,模型优化了以下参数:
kylin.Cube.algorithm=inmem
kylin.Cube.algorithm.inmem-concurrent-threads=8
kylin.Cube.max-building-segments=600
Kylin 整合 Tableau
公司采用 Kylin 2.4.0 版本和 Tableau 9.0 版本, 在前者提供预计算结果的前提下, 但愿结合 Tableau 可以给数据分析师提供更方便、快速的数据自助分析。
在本机上安装与 Tableau 版本对应的 Kylin ODBC Drive,Tableau 链接 Kylin 时选择 Kylin 的 ODBC Driver,而后选择 Kylin 的数据源 Fact Table 和 Join Table,并按 Kylin Cube 模型 join 起来,就能够实现拖拉出结果的即席查询,上钻、下钻、旋转等目标。分析人员摆脱了编写冗长 SQL,漫长等待的过程,能够根据本身的需求进行数据分析。其中一个使用场景以下图所示,展现每一个地区的活跃人数:
实施中的经验总结
1) Tableau 拖拉维度出结果慢
解决:查看 kylin.log,发现耗时最长的都是 select * from fact,因此让这条 SQL 尽量快的失败,能够修改 kylin.properties 的参数:
kylin.query.max-scan-bytes 设置为更小的值
kylin.storage.partitin.max-scan-bytes 设置成更小的值
2) Kylin 整合 Tableau 建立的计算字段必定是 Cube 中包含的,若 Cube 中没有包含该计算字段,那么在 Tableau 中计算会显示通讯错误,由于 Cube 的预计算中不含此值。
3) 使用实时增量时报错:
解决:这是因为 Kylin 2.4.0 版本和 Kafka 的 3.0.0 版本不匹配,把 Kylin 降了一个版本 Kylin 2.3.2 便可。
4) 字段类型转换:在 double 类型的数据转换为 String 时,会自动转换为保留一位小数的字符串,例如 112 转换成了 112.0,致使 join 的时候没法 join 成功。
解决:当咱们要转换的数值只有整形没有小数时,咱们能够先把数值类型转换成 bigint 类型,使用 bigint 类型存储的数值不会采用科学计数法表示。
5) 空值产生的数据倾斜:行为表中对游客的 user_id 是置空的,若是取其中的 user_id 和 用户表中的 user_id 关联,会碰到数据倾斜的问题。
解决:把空值的 user_id 变成一个字符串加上随机数,把倾斜的数据分到不一样的 reduce 上,因为 null 值关联不上,处理后并不影响最终结果。
6) Kylin ODBC Driver 安装是根据 Tableau 版本的,不是根据操做系统而定的。例如,windows 版本是 64 位的,Tableau 版本是 32 位,就须要装 32 位的 ODBC。
将来规划
Kylin 给咱们带来了不少便利,节约了查询时间和精力。随着技术的不断进步,还有许多问题须要解决,还须要不断探索和优化,例如 Kylin 对明细数据的查询支持不理想,可是有时须要查询明细数据;删除 Cube,HBase 中的表不会自动删除,影响查询性能,须要手动清理等。