Kylin三大引擎和Cube构建源码解析


    最近在工作中用到了kylin,相关资料还不是很多,关于源码的更是少之又少,于是结合《kylin权威指南》、《基于Apache Kylin构建大数据分析平台》、相关技术博客和自己对部分源码的理解进行了整理。

一、工作原理
每一个Cube都可以设定自己的数据源、计算引擎和存储引擎,这些设定信息均保存在Cube的元数据中。在构建Cube时,首先由工厂类创建数据源、计算引擎和存储引擎对象。这三个对象独立创建,相互之间没有关联。

要把它们串联起来,使用的是适配器模式。计算引擎好比是一块主板,主控整个Cube的构建过程。它以数据源为输入,以存储为Cube的输出,因此也定义了IN和OUT两个接口。数据源和存储引擎则需要适配IN和OUT,提供相应的接口实现,把自己接入计算引擎,适配过程见下图。适配完成之后,数据源和存储引擎即可被计算引擎调用。三大引擎连通,就能协同完成Cube构建。

计算引擎只提出接口需求,每个接口都可以有多种实现,也就是能接入多种不同的数据源和存储。类似的,每个数据源和存储也可以实现多个接口,适配到多种不同的计算引擎上。三者之间是多对多的关系,可以任意组合,十分灵活。
二、三大主要接口
(一)数据源接口 ISource

· adaptToBuildEngine :适配指定的构建引擎接口。返回一个对象,实现指定的IN接口。该接口主要由计算引擎调用,要求数据源向计算引擎适配。如果数据源无法提供指定接口的实现,则适配失败,Cube构建将无法进行。
· createReadableTable :返回一个ReadableTable,用来顺序读取一个表。除了计算引擎之外,有时也会调用此方法顺序访问数据维表的内容,用来创建维度字典或维表快照。
(二)存储引擎接口 IStorage

· adaptToBuildEngine :适配指定的构建引擎接口。返回一个对象,实现指定的OUT接口。该接口主要由计算引擎调用,要求存储引擎向计算引擎适配。如果存储引擎无法提供指定接口的实现,则适配失败,Cube构建无法进行。
· createQuery :创建一个查询对象IStorageQuery,用来查询给定的IRealization。简单来说,就是返回一个能够查询指定Cube的对象。IRealization是在Cube之上的一个抽象。其主要的实现就是Cube,此外还有被称为Hybrid的联合Cube。
(三)计算引擎接口 IBatchCubingEngine

· createBatchCubingJob :返回一个工作流计划,用以构建指定的CubeSegment。这里的CubeSegment是一个刚完成初始化,但还不包含数据的CubeSegment。返回的DefaultChainedExecutable是一个工作流的描述对象。它将被保存并由工作流引擎在稍后调度执行,从而完成Cube的构建。
· createBatchMergeJob :返回一个工作流计划,用以合并指定的CubeSegment。这里的CubeSegment是一个待合并的CubeSegment,它的区间横跨了多个现有的CubeSegment。返回的工作流计划一样会在稍后被调度执行,执行的过程会将多个现有的CubeSegment合并为一个,从而降低Cube的碎片化成都。
· getSourceInterface :指明该计算引擎的IN接口。
· getStorageInterface :指明该计算引擎的OUT接口。
三、三大引擎互动过程
1.Rest API接收到构建(合并)CubeSegment的请求。
2.EngineFactory根据Cube元数据的定义,创建IBatchCubingEngine对象,并调用其上的createBatchCubingJob(或者createBatchMergeJob)方法。
3.IBatchCubingEngine根据Cube元数据的定义,通过SourceFactory和StorageFactory创建出相应的数据源ISource和存储IStorage对象。
4.IBatchCubingEngine调用ISource上的adaptToBuildEngine方法传入IN接口,要求数据源向自己适配。
5.IBatchCubingEngine调用IStorage上的adaptToBuildEngine方法,传入OUT接口,要求存储引擎向自己适配。
6.适配成功后,计算引擎协同数据源和存储引擎计划Cube构建的具体步骤,将结果以工作流的形式返回。
7.执行引擎将在稍后执行工作流,完成Cube构建。
四、Kylin默认三大引擎Hive+MapReduce+HBase的介绍和代码实现
(一)构建引擎MapReduce
每一个构建引擎必须实现接口 IBatchCubingEngine ,并在EngineFactory中注册实现类。只有这样才能在Cube元数据中引用该引擎,否则会在构建Cube时出现“找不到实现”的错误。
注册的方法是通过kylin.properties来完成的。在其中添加一行构建引擎的声明。比如:

EngineFactory在启动时会读取kylin.properties,默认引擎即为标号2的MRBatchCubingEngine2这个引擎。
1. MRBatchCubingEngine2

这是一个入口类,构建Cube的主要逻辑都封装在BatchCubingJobBuilder2和BatchMergeJobBuilder2中。其中的DefaultChainedExecutable,代表了一种可执行的对象,其中包含了很多子任务。它执行的过程就是一次串行执行每一个子任务,直到所有子任务都完成。kylin的构建比较复杂,要执行很多步骤,步骤之间有直接的依赖性和顺序性。DefaultChainedExecutable很好地抽象了这种连续依次执行的模型,可以用来表示Cube的构建的工作流。
另外,重要的输入输出接口也在这里进行声明。IMRInput是IN接口,由数据源适配实现;IMROutput2是OUT接口,由存储引擎适配实现。
2. BatchCubingJobBuilder2
BatchCubingJobBuilder2和BatchMergeJobBuilder2大同小异,这里以BatchCubingJobBuilder2为例。


BatchCubingJobBuilder2中的成员变量IMRBatchCubingInputSide inputSide和IMRBatchCubingOutputSide2 outputSide分别来自数据源接口IMRInput和存储接口IMROutput2,分别代表着输入和输出两端参与创建工作流。
BatchCubingJobBuilder2的主体函数build()中,整个Cube构建过程是一个子任务一次串行执行的过程,这些子任务又被分为四个阶段。
  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值