热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Kylin,Mondrian,Saiku系统的整合

原文地址:http:www.tuicool.comarticlesNveQnmY本文主要介绍有赞数据团队为了满足在不
原文地址: http://www.tuicool.com/articles/NveQnmY


本文主要介绍有赞数据团队为了满足在不同维度查看、分析重点指标的需求而搭建的OLAP分析工具。这个工具对Kylin,Mondrian以及Saiku做了一个整合,主要工作包括一些定制化的修改以及环境的配置。 目前这个系统还处于一个需要优化、完善的过程,这篇博文也会相应地更新。

背景

在有赞发展的初期,数据团队主要的工作之一就是根据运营人员的报表需求,编写sql,从hive中获得数据并写入mysql中存储。最后,前端人员写相应的代码展现mysql中存储的报表数据。 随着公司业务的快速发展,如此长周期的报表开发流程已经很难跟上运营人员的分析需求了。为了避免深陷报表开发、维护的泥潭,数据组决定调研大数据场景下的OLAP分析工具。参考了 明略数据的解决方案 之后,我们选择整合Kylin , Mondrian , Saiku 来实现这样一个OLAP系统。

三巨头

Kylin

kylin是apache软件基金会的顶级项目,一个开源的分布式多维分析工具。下面是摘自Kylin官网的介绍:

Apache Kylin™ is an open source Distributed Analytics Engine designed to provide SQL interface and multi-dimensional analysis (OLAP) on Hadoop supporting extremely large datasets, original contributed from eBay Inc.

个人的理解是:Kylin通过预计算所有合理的维度组合下各个指标的值并把计算结果存储到HBASE中的方式,大大提高分布式多维分析的查询效率。Kylin接收sql查询语句作为输入,以查询结果作为输出。通过预计算的方式,将在hive中可能需要几分钟的查询响应时间下降到毫秒级。更细致的关于Kylin的介绍,可以参考我的另一片博客 Kylin初体验 。

Mondrian

Mondrian is an Open Source Business Analytics engine that enables organizations of any size to give business users access to their data for interactive analysis. You can build powerful Business Intelligence solutions with Mondrian as your Online Analytical Processing (OLAP) engine, enabling multidimensional queries against your business data, using the powerful MDX query language.

Mondrian是一个OLAP分析的引擎,主要工作是根据事先配置好的schema,将输入的多维分析语句 MDX (Multidimensional Expressions )翻译成目标数据库/数据引擎的执行语言(比如SQL)。

Saiku

Saiku allows business users to explore complex data sources, using a familiar drag and drop interface and easy to understand business terminology, all within a browser. Select the data you are interested in, look at it from different perspectives, drill into the detail. Once you have your answer, save your results, share them, export them to Excel or PDF, all straight from the browser.

Saiku提供了一个多维分析的用户操作界面,可以通过简单拖拉拽的方式迅速生成报表。Saiku的主要工作是根据事先配置好的schema,将用户的操作转化成MDX语句提供给Mondrian引擎执行。

技术架构


Kylin + Mondrian + Saiku是一个简单的三层架构。git上开源的Saiku的项目已经整合了mondrian的jar包。所以构建这样一个三层架构主要的工作是将Mondrian的schema和Kylin的schema对应起来,同时需要针对Kylin的语法对Mondrian做一些Kylin dialect的定制开发。

Git上已经有一个 整合Kylin,Mondrian以及Saiku的项目 。照着这个项目的指引,可以很轻松的搭建这么一个三层的系统。在此,致谢开源项目作者 mustangore 。

一些细节

介绍完整体的结构,下面讲一些构建过程中遇到的坑。有些可能是我们的理解还不够深入,有些可能随着开源软件版本的升级已经不再是一个坑了。希望能给大家带来一些帮助,如果是由于我们理解的偏差导致踩到的坑,也希望大家留言给出指正:) 本套系统构建基于kylin1.5, Mondrian4.4以及Saiku3.7.4。底层是Hive0.14以及Hbase0.98。

关于schema

前面提到,要让系统运转,Kylin的schema必须和mondrian的schema能够对接上。Kylin是根据自身cube配置的schema来进行预计算的,schema决定Kylin能够接收的sql查询的范围。Mondrian又根据自身的shema翻译MDX到sql, Mondrian的schema决定它生成的sql的范围。如果两者有不一致的情况,就可能导致Mondrian生成的sql无法被Kylin执行。 kylin的schema配置比较简单,管理页面上有一套图形界面指引你一步步地构建一个星型模型,配置di mension、measure。不过要把cube设计得高效,Kylin还是有不少高级地设置的,比如选择 attribute group, derived dimension等。官网上有详细的 介绍 。

Mondrian的schema没有比较好的图形配置工具,需要手写Mondrian schema的XML文档,文档格式参考 官方文档 ,通过Saiku上传。

需要注意的坑:

  • 不要用view作为lookup table 在设计Kylin cube时,用hive view作为fact table是一个比较好的实践方式,可以屏蔽一些底层数据结构变化对Kylin cube的影响。但是不要用view作look up table,在build cube计算维度表容量时会出问题。
  • Kylin无法在预计算指标时制定条件 比如有两个字段:order pay, is payed。我们可以配置sum(order pay)作为订单金额, sum(is payed)作为付款订单数。但是没法配置sum(order pay) where is payed = 1来表示付款订单金额。我们需要在fact view中添加字段payed order pay表示付款的订单金额。
  • 尽量在Kylin中用int类型 比如is_payed字段,就0/1两个值,通常我们在hive里可以设置为tiny int类型的字段。但是在Kylin中,针对tiny int 和 int类型的字段配置出来的measure类型是不一样的,tiny int 类型的字段得到的measure在和Saiku结合时可能会出现问题。
  • 把hive表放在default库中 Kylin添加hive table的时候是可以指定hive table所在库的,但是建议将fact table、lookup table都放在default库中。因为在Mondrian的schema中,physical table是默认去default库查找的,目前还没有发现很好的在Mondrian schema中指定数据库的方式。

关于count distinct

Kylin配置cube的时候可以指定某个measure的聚合方式为count distinct,有精准计算的方式也有基于hyperloglog算法的近似计算方式。同样,在Mondrian的schema里也可以配置count distinct的指标聚合方式。

看上去一切都OK,然而问题来了: Kylin的count distinct语法只针用count distinct聚合的指标字段,在计算维度表大小的时候,kylin无法计算类似 select
count(distinct date) from lu_date
 这样的sql语句。在 mustangore 的项目中,对Mondrian打了Kylin-dialect的补丁。其中添加了一个JdbcDialect的实现:

注意到: allowsCountDistinct() 函数被设置成了 return false; mustangore 通过这种方式避免了Mondrian计算维度大小的时候count disctinct

然而这种一杆子打死的方式也使得Mondrian计算count distinct的指标的时候出现问题: select count(distinct XXX) from
tableA
 这样的语句会被翻译成 select count YYY from (select distinct XXX as YYY from tableA) 而Kylin又不能很好的执行这样的语句。

为了解决这个两难的问题,我们深入到Mondrian的源码中去,找到了计算维度表大小的代码:


private static String generateColumnCardinalitySql(
Dialect dialect,
String schema,
String table,
String column)
{
final StringBuilder buf = new StringBuilder();
String exprString = dialect.quoteIdentifier(column);
if (dialect.allowsCountDistinct()) {
// e.g. "select count(distinct product_id) from product"
buf.append("
select count(distinct")
.append(exprString)
.append("
) from");
dialect.quoteIdentifier(buf, schema, table);
return buf.toString();
}
else if (dialect.allowsFromQuery()) {
// Some databases (e.g. Access) don't like 'count(distinct)',
// so use, e.g., "
select count(*) from (selectdistinct
// product_id from product)"
buf.append("
select count(*) from (selectdistinct")
.append(exprString)
.append("
from");
dialect.quoteIdentifier(buf, schema, table);
buf.append("
)");
...

注意到只有dialect.allowsCountDistinct()为true时才会用count distinct来计算维度表大小。 我们只要将Kylin dialect的allowsCountDistinct()设置为true,同时在generateColumnCardinalitySql添加一个判断条件:

if (dialect.allowsCountDistinct()
&& !dialect.getDatabaseProduct().name().equalsIgnoreCase("KYLIN")) {
...

就可以实现和kylin的count distcint measure的正常对接了。

关于Kylin sql

有了处理count distinct的问题的经验,我们发现,只要了解Kylin sql的特点,针对Kylin sql定制Mondrian 的Kylin—diect就能将Mondrian和kylin较好的对接。 经过在Kylin1.5的交互界面中的测试,我们列出如下的区别:

  • 不能limit beg, end 只能limit length
  • 不支持 union, union all
  • 不支持 where exists 子句

结束语

以上是有赞数据团队实现多维分析工具的探索过程。总的来说,Kylin + Saiku + Mondrian的一套流程是能走通的,中途遇到一些零碎的问题没有完全列出来。通常是因为Kylin只支持cube范围内的查询,如果Mondrian翻译出的sql超出这个范围就会引起系统的错误。 通常有三种解决方案:

  • 重新构建Kylin cube,让它能覆盖更广范围的查询
  • 修改Mondrian schema,让它的cube描述和Kylin cube吻合
  • 定制化开发Mondrian的Kylin dialect,让Mondrian生成符合Kylin特点的sql

目前我们还在对这套三层框架做一些定制化的功能开发以及性能的调优工作。希望这篇文章能给大家带来些帮助,也希望有独特见解或者发现我们的理解不对的朋友们留言交流。


推荐阅读
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • Sleuth+zipkin链路追踪SpringCloud微服务的解决方案
    在庞大的微服务群中,随着业务扩展,微服务个数增多,系统调用链路复杂化。Sleuth+zipkin是解决SpringCloud微服务定位和追踪的方案。通过TraceId将不同服务调用的日志串联起来,实现请求链路跟踪。通过Feign调用和Request传递TraceId,将整个调用链路的服务日志归组合并,提供定位和追踪的功能。 ... [详细]
  • 本文总结了初学者在使用dubbo设计架构过程中遇到的问题,并提供了相应的解决方法。问题包括传输字节流限制、分布式事务、序列化、多点部署、zk端口冲突、服务失败请求3次机制以及启动时检查。通过解决这些问题,初学者能够更好地理解和应用dubbo设计架构。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了关于apache、phpmyadmin、mysql、php、emacs、path等知识点,以及如何搭建php环境。文章提供了详细的安装步骤和所需软件列表,希望能帮助读者解决与LAMP相关的技术问题。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 2016 linux发行版排行_灵越7590 安装 linux (manjarognome)
    RT之前做了一次灵越7590黑苹果炒作业的文章,希望能够分享给更多不想折腾的人。kawauso:教你如何给灵越7590黑苹果抄作业​zhuanlan.z ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
  • 本文讨论了在使用Git进行版本控制时,如何提供类似CVS中自动增加版本号的功能。作者介绍了Git中的其他版本表示方式,如git describe命令,并提供了使用这些表示方式来确定文件更新情况的示例。此外,文章还介绍了启用$Id:$功能的方法,并讨论了一些开发者在使用Git时的需求和使用场景。 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • 像跟踪分布式服务调用那样跟踪Go函数调用链 | Gopher Daily (2020.12.07) ʕ◔ϖ◔ʔ
    每日一谚:“Acacheisjustamemoryleakyouhaven’tmetyet.”—Mr.RogersGo技术专栏“改善Go语⾔编程质量的50个有效实践” ... [详细]
  • [翻译]微服务设计模式5. 服务发现服务端服务发现
    服务之间需要互相调用,在单体架构中,服务之间的互相调用直接通过编程语言层面的方法调用就搞定了。在传统的分布式应用的部署中,服务地 ... [详细]
author-avatar
别说没用的妇
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有