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

Kylin大数据下的OLAP解决方案(原理篇)

ApacheKylin大数据下的OLAP解决方案(原理篇)http:mp.weixin.qq.coms?__bizMzI2MDU5ODY2Mg&mid2247483927&idx1

//
Apache Kylin 大数据下的OLAP解决方案(原理篇)
http://mp.weixin.qq.com/s?__biz=MzI2MDU5ODY2Mg==&mid=2247483927&idx=1&sn=6697cde0bc54e1725da868c5cf52aeb0&chksm=ea667cfedd11f5e8803a6ee9ebc2444d515b7c18c641261f697d4ca341d1439ac3acca472240&mpshare=1&scene=1&srcid=0306oTHdHxhTi2IWYsK4Etr6#rd

**前言******

在现在的大数据时代,Hadoop已经成为大数据事实上的标准规范,一大批工具陆陆续续围绕Hadoop平台来构建,用来解决不同场景下的需求。
让我们来想想有哪些业务需求呢?

《Kylin 大数据下的OLAP解决方案(原理篇)》

比如Hive是基于Hadoop的一个用来做企业数据仓库的工具,可以将存储在HDFS分布式文件系统上的数据文件映射为一张数据库表,并提供SQL查询功能,Hive执行引擎可以将SQL转换为MapReduce任务来进行运行,非常适合数据仓库的数据分析。

再比如HBase是基于Hadoop,实现高可用性,高性能,面向列,可伸缩的分布式存储系统,Hadoop架构中的HDFS为HBase提供了高可靠性的底层存储支持。

《Kylin 大数据下的OLAP解决方案(原理篇)》

但是缺少一个基于Hadoop的分布式分析引擎,虽然目前存在业务分析工具,如Tableau等,但是他们往往存在很大的局限,比如难以水平扩展、无法处理超大规模数据,同时也缺少Hadoop的支持。
ApacheKylin的出现,能够基于Hadoop很好地解决上面的问题。Apache Kylin是一个开源的分布式存储引擎。它提供Hadoop之上的SQL查询接口及多维分析(OLAP)能力以支持大规模数据,能够处理TB乃至PB级别的分析任务,能够在亚秒级查询巨大的Hive表,并支持高并发。

大数据多维分析的挑战

在Apache Kylin集群上跑了多个Cube测试,结果表明它能够有效解决大数据计算分析的三大痛点问题:

《Kylin 大数据下的OLAP解决方案(原理篇)》
接下面我们就来详细说说****Apache ****Kylin****的基本原理和架构

ApacheKylin从数据仓库中最常用的Hive中读取源数据,使用 MapReduce作为Cube构建的引擎,并把预计算结果保存在HBase中,对外暴露Rest API/JDBC/ODBC的查询接口。

《Kylin 大数据下的OLAP解决方案(原理篇)》

核心:预计算

Apache Kylin的核心思想是预计算,即对多维分析可能用到的度量进行预计算,将计算好的结果保存成 Cube,供查询时直接访问。把高复杂度的聚合运算、多表连接等操作转换成对预计算结果的查询,这决定了Kylin能够拥有很好的快速查询和高并发能力。

《Kylin 大数据下的OLAP解决方案(原理篇)》

上图所示就是一个Cube的例子,假设我们有4个dimension,这个Cube中每个节点(称作Cuboid)都是这4个dimension的不同组合,每个组合定义了一组分析的dimension(如group by),measure的聚合结果就保存在这每个Cuboid上。查询时根据SQL找到对应的Cuboid,读取measure的值,即可返回。
Cube计算

Cube的构建,Kylin提供了一个称作Layer Cubing的算法。简单来说,就是按照dimension数量从大到小的顺序,从Base Cuboid开始,依次基于上一层Cuboid的结果进行再聚合。一个N维的完全Cube,是由:1个N维子立方体(Cuboid), N个(N-1)维Cuboid, N*(N-1)/2个(N-2)维Cuboid …, N个1维Cuboid, 1个0维Cuboid,总共2^N个子立方体组成的,每一层的计算都是一个单独的Map Reduce任务。如下图所示:

《Kylin 大数据下的OLAP解决方案(原理篇)》

此算法Mapper以上一层Cuboid的结果(Key-Value对)作为输入。由于Key是由各维度值拼接在一起,从其中找出要聚合的维度,去掉它的值成新的Key,然后把新Key和Value输出,进而HadoopMapReduce对所有新Key进行排序、洗牌(shuffle)、再送到Reducer处;Reducer的输入会是一组有相同Key的Value集合,对这些Value做聚合计算,再结合Key输出就完成了一轮计算。
由于Mapper不做预聚合,此算法会对Hadoop MapReduce输出较多数据; 虽然已经使用了Combiner来减少从Mapper端到Reducer端的数据传输,所有数据依然需要通过Hadoop MapReduce来排序和组合才能被聚合,无形之中增加了集群的压力。
快速Cube算法(Fast Cubing)

该算法的主要思想是,对Mapper所分配的数据块,将它计算成一个完整的小Cube 段(包含所有Cuboid);每个Mapper将计算完的Cube段输出给Reducer做合并,生成大Cube,也就是最终结果,如下图:

《Kylin 大数据下的OLAP解决方案(原理篇)》

Mapper的预聚合:Mapper会利用内存做预聚合,算出所有组合;Mapper输出的每个Key都是不同的,这样会减少输出到Hadoop MapReduce的数据量,Combiner也不再需要;一轮MapReduce便会完成所有层次的计算,减少Hadoop任务的调配。
在Cuboid的推算过程中的每一步,Fast Cubing算法都会比逐层算法产生更少数据;总的加起来,新算法中的Mapper对Hadoop的输出,会比老算法少一个或几个数量级;越少的数据,意味着越少的I/O和CPU,从而使得性能得以提升。
Cube存储

MapReduce的计算结果最终保存到HBase中,HBase中每行记录的Rowkey由dimension组成,measure会保存在 column family中。为了减小存储代价,这里会对dimension和measure进行编码。查询阶段,利用HBase列存储的特性就可以保证Kylin有良好的快速响应和高并发。

《Kylin 大数据下的OLAP解决方案(原理篇)》

有了这些预计算的结果,当收到用户的SQL请求,Kylin会对SQL做查询计划,并把本该进行的Join、Sum、CountDistinct等操作改写成Cube的查询操作。
Cube查询

《Kylin 大数据下的OLAP解决方案(原理篇)》

查询时,SQL语句被SQL解析器翻译成一个解释计划,从这个计划可以准确知道用户要查哪些表,它们是怎样join起来,有哪些过滤条件等等。Kylin会用这个计划去匹配寻找合适的Cube。
如果有Cube命中,这个计划会发送到存储引擎,翻译成对存储(默认HBase)相应的Scan操作。Groupby和过滤条件的列,用来找到 Cuboid,过滤条件会被转换成Scan的开始和结束值,以缩小Scan的范围; Scan的result,Rowkey会被反向解码成各个dimension的值,Value会被解码成Metrics值 。

《Kylin 大数据下的OLAP解决方案(原理篇)》

Apache Kylin****项目实践

目前基于kylin的数据分析平台已经在业务中开始测试以及使用,并且在用户管理和权限操作方面做了的二次开发改造,以实现project和cube的安全管理。
下图是cube的查询响应图表,cube 大小为157GB,包括一个事实表,14个维度和4个度量:

《Kylin 大数据下的OLAP解决方案(原理篇)》

在项目实践过程中也遇到问题:
Hadoop任务内存资源不够,cube计算失败。

调整MapReduce分配资源参数:在cube计算过程中,会出现mr任务失败,根据日志排查,主要因mr的内存分配不足导致,于是,我们根据任务实际情况整体调整了yarn.nodemanager.resource.memory-mb、mapreduce.map.memory.mb、
mapreduce.map.java.opts、mapreduce.reduce.memory.mb、apreduce.reduce.java.opts
等参数。
JVMGC相关参数调优:可以通过GC调优获得更好的GC性能,减少单次GC的时间和FULL GC频率。

使用Apache Kylin的实践总结

1、大的事实表采用天分区增量构建,为了不影响查询性能,可以定期做合并(Merge),周期可以根据实际情况确定。
2、对于维表比较大的情况,或者查询Select部分存在复杂的逻辑判断,存在Apache Kylin不支持的函数或语句时,可以将事实表和维表的关联处理创建为Hive视图,之后根据视图创建Cube模型。
3、每次查询必然带有的条件建议在字典设置步骤将其设置为Mandatory。这样会最终 Build出来Cube的大小会减少一半。
4、Cube的维度如果超过10个,建议将常用的聚合字段做分组。
5、Cube定义中RowKey顺序:Mandatory维度,Where过滤条件中出现频率较多的维度,高基数维度,低基数维度。
6、当Segment中某一个Cuboid的大小超过一定的阈值时,修改数据分片大小以实现数据读取的并行化,从而优化Cube的查询速度。
7、设计合适的维度编码能减少维度对空间的占用,比如对于高基数的维度如果使用Dict字典编码方式占用大量空间,容易造成构建引擎或查询引擎的内存溢出。
8、对维度进行分片,如果Cuboid中某两个行的Shard by Dimension的值相同,那么无论这个Cuboid最终会被划分多少个分片,这两行数据必然会被分配到同一个分片中,方便查询和索引。
9、部署层面,可以通过Nginx在前端做负载均衡,后端启动多个Query Server接收查询请求处理。

基于Kylin的前景规划

经过项目的摸索和实践,Apache Kylin能很好的解决开篇所说的大数据计算分析的3大痛点问题,提升业务的查询效率。
首先,在接下来我们也将会持续关注Kylin的发展变化,包括数据字典的分布式构建以及基于Kafka定义Streaming Table,从而完成准实时Cube的构建的特性。
其次,规划设计符合需求的拖拽前台界面,支持探索性数据查询。采用拖拽式方便用户使用;规定化前台界面,屏蔽后台技术细节,避免低效的查询出现。
在目前的工作基础上规划构建基于Apache Kylin的大数据OLAP分析平台, 如下图所示:

《Kylin 大数据下的OLAP解决方案(原理篇)》

最后还将继续调研和分析新的存储引擎和构建引擎来满足更多的业务需求。


推荐阅读
  • 如何构建更好的数据立方体系统(Cube)
    看到了kylin关于cube的设计,难以抑制的觉得这部分设计得太巧妙了,确实比我们的产品要好上很多,不得不学习一下! ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • 本文介绍了Python语言程序设计中文件和数据格式化的操作,包括使用np.savetext保存文本文件,对文本文件和二进制文件进行统一的操作步骤,以及使用Numpy模块进行数据可视化编程的指南。同时还提供了一些关于Python的测试题。 ... [详细]
  • ElasticSerach初探第一篇认识ES+环境搭建+简单MySQL数据同步+SpringBoot整合ES
    一、认识ElasticSearch是一个基于Lucene的开源搜索引擎,通过简单的RESTfulAPI来隐藏Lucene的复杂性。全文搜索,分析系统&# ... [详细]
  • {moduleinfo:{card_count:[{count_phone:1,count:1}],search_count:[{count_phone:4 ... [详细]
  • 我们在之前的文章中已经初步介绍了Cloudera。hadoop基础----hadoop实战(零)-----hadoop的平台版本选择从版本选择这篇文章中我们了解到除了hadoop官方版本外很多 ... [详细]
  • hive的本质是hadoop客户端通过写sql转换成MapReduce提交给yarn、hdfs执行hive的优点操作接口采用类sql语法提供快速开发能力避免了去写MapReduce ... [详细]
  • 【PPT 下载】这杯网红茶饮,到底赢在哪里?
    【PPT 下载】这杯网红茶饮,到底赢在哪里? ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
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社区 版权所有