2016-12-16 13:48:52 brucexia 阅读数 1378
  • Kylin大数据实战学习教程

    本课程为专题课,通过全面讲解Kylin架构原理、分布式集群搭建以及项目案例,让你快速掌握Kylin实时大数据BI技术,从而解决海量数据多维指标动态计算耗时问题、复杂条件筛选问题以及跨月、季度、年等大时间区间查询问题。

    980 人正在学习 去看看 易水


Kyligence联合创始人兼CEO,Apache Kylin项目管理委员会主席(PMC Chair)韩卿

武汉市云升科技发展有限公司董事长,《智慧城市—大数据、物联网和云计算之应用》作者杨正洪

万达网络科技集团大数据中心副总经理,《Spark高级数据分析》中文版译者龚少成

数据架构师,IT脱口秀(清风那个吹)创始人,《开源大数据分析引擎Impala实战》作者贾传青

等等业内专家联合推荐


Apache Kylin是一个开源的分布式分析引擎,提供Hadoop之上的SQL查询接口及多维分析(OLAP)能力以支持超大规模数据,最初由eBay公司开发并贡献至开源社区。它能在亚秒内查询巨大的Hive表。

本书分为21章,详细讲解Apache Kylin概念、安装、配置、部署,让读者对Apache Kylin构建大数据分析平台有一个感性认识。同时,本书从应用角度,结合Dome和实例介绍了用于多维分析的Cube算法的创建、配置与优化。最后还介绍了Kyligence公司发布KAP大数据分析平台,对读者有极大的参考价值。

本书适合大数据技术初学者、大数据分析人员、大数据架构师等,也适合用于高等院校和培训学校相关专业师生教学参考。


第一部分  Apache Kylin基础部分

第1章  Apache Kylin前世今生 3

1.1  Apache Kylin的背景 3

1.2  Apache Kylin的应用场景 3

1.3  Apache Kylin的发展历程 4

第2章  Apache Kylin前奏 7

2.1  事实表和维表 7

2.2  星型模型和雪花型模型 7

2.2.1  星型模型 7

2.2.2  雪花型模型 8

2.2.3  星型模型示例 8

2.3  OLAP 9

2.3.1  OLAP分类 9

2.3.2  OLAP的基本操作 10

2.4  数据立方体(Data Cube) 11

第3章  Apache Kylin 工作原理和体系架构 12

3.1  Kylin工作原理 12

3.2  Kylin体系架构 13

3.3  Kylin中的核心部分:Cube构建 15

3.4  Kylin的SQL查询 16

3.5  Kylin的特性和生态圈 16

 

第4章  搭建CDH大数据平台 18

4.1  系统环境和安装包 19

4.1.1  系统环境 19

4.1.2  安装包的下载 20

4.2  准备工作:系统环境搭建 21

4.2.1  网络配置(CDH集群所有节点) 21

4.2.2  打通SSH,设置ssh无密码登录(所有节点) 21

4.3  正式安装CDH:准备工作 29

4.4  正式安装CDH5:安装配置 30

4.4.1  CDH5的安装配置 30

4.4.2  对Hive、HBase执行简单操作 39

第5章  使用Kylin构建企业大数据分析平台的4种部署方式 41

5.1  Kylin部署的架构 41

5.2  Kylin的四种典型部署方式 42

第6章  单独为Kylin部署HBase集群 44

第7章  部署Kylin集群环境 58

7.1  部署Kylin的先决条件 58

7.2  部署Kylin集群环境 61

7.3  为Kylin集群搭建负载均衡器 70

7.3.1  搭建Nginx环境 70

7.3.2  配置Nginx实现Kylin的负载均衡 73

第二部分  Apache Kylin 进阶部分

第8章  Demo案例实战 77

8.1  Sample Cube案例描述 77

8.2  Sample Cube案例实战 78

8.2.1  准备数据 78

8.2.2  构建Cube 81

第9章  多维分析的Cube创建实战 89

9.1  Cube模型 89

9.2  创建Cube的流程 90

9.2.1  步骤一:Hive中事实表,以及多张维表的处理 90

9.2.2  步骤二:Kylin中建立项目(Project) 95

9.2.3  步骤三:Kylin中建立数据源(Data Source) 95

9.2.4  步骤四:Kylin中建立数据模型(Model) 98

9.2.5  步骤五:Kylin中建立Cube 104

9.2.6  步骤六:Build Cube 114

9.2.7  步骤七:查询Cube 118

第10章  Build Cube的来龙去脉 120

10.1  流程分析 120

10.2  小结 134

第三部分  Apache Kylin 高级部分

第11章  Cube优化 137

第12章  备份Kylin的Metadata 142

12.1  Kylin的元数据 142

12.2  备份元数据 143

12.3  恢复元数据 146

第13章  使用Hive视图 147

13.1  使用Hive视图 147

13.2  使用视图实战 149

第14章  Kylin的垃圾清理 153

14.1  清理元数据 153

14.2  清理存储器数据 154

第15章  JDBC访问方式 157

第16章  通过RESTful访问Kylin 161

第17章  Kylin版本之间升级 179

17.1  从1.5.2升级到最新版本1.5.3 179

17.2  从1.5.1升级到1.5.2版本 180

17.3  从Kylin 1.5.2.1升级到Kylin 1.5.3实战 181

17.4  补充内容 187

第18章  大数据可视化实践 189

18.1  可视化工具简述 189

18.2  安装Kylin ODBC驱动 190

18.3  通过Excel访问Kylin 192

18.4  通过Power BI访问Kylin 194

18.4.1  安装配置Power BI 194

18.4.2  实战操作 198

18.5  通过Tableau访问Kylin 199

18.6  Kylin Mondrian Saiku 205

18.7  实战演练:通过Saiku访问Kylin 211

18.7.1  第一个Schema例子:myproject_pvuv_cube的演示 211

18.7.2  第二个Schema例子:kylin_sales_cube的演示 219

18.7.3  Saiku使用的一些问题 223

18.8  通过Apache Zepplin访问Kylin 229

18.9  通过Kylin的“Insight”查询 232

第19章  使用Streaming Table 构建准实时Cube 236

第20章  快速数据立方算法 251

20.1  快速数据立方算法概述 251

20.2  快速数据立方算法优点和缺点 253

20.3  获取Fast Cubing算法的优势 254

第四部分  Apache Kylin的扩展部分

第21章  大数据智能分析平台KAP 257

21.1  大数据智能分析平台KAP概述 257

21.2  KAP的安装部署 259



 

2017-07-11 19:22:30 u010454030 阅读数 458
  • Kylin大数据实战学习教程

    本课程为专题课,通过全面讲解Kylin架构原理、分布式集群搭建以及项目案例,让你快速掌握Kylin实时大数据BI技术,从而解决海量数据多维指标动态计算耗时问题、复杂条件筛选问题以及跨月、季度、年等大时间区间查询问题。

    980 人正在学习 去看看 易水

image

前面的文章介绍了Apache Kylin的安装及数据仓库里面的星型和雪花模型的概念,这篇文章我们来看下,如何构建一个kylin的cube进行查询。这里不得不吐槽一下Kylin的资料,少之又少出现问题网上基本找不到解决方案,所以想要学习kylin,建议大家买一本书系统的学习一下,这里推荐一本入门的书《基于Apache kylin构建大数据分析平台》,介绍的还可以。

下面来看下如何构建一个cube:

首先,我们要明白kylin的数据源主要来自Hive里面的各种表,如果想要进行测试,那么首先我们要在hive中有自己的表,注意,表的类型基本有两种,一种是事实表,一种是维度表,kylin使用的是星型模型,通常一个事实表会关联多个维度表,表的数据有了,下面就是通过kylin的ui界面来完成整个流程。除此之外keylin还支持从kafka构建流式表,由于使用场景比较少,这里就不讨论这个了。

下面通过一张图看下整个构建cube的操作流程:

image

(1) 登录7070端口下面的kylin的web管理页面,默认的用户名是KYLIN密码是ADMIN

image

(2)点击左上角的加号小按钮,新建一个工程

image

(3)选择这个工程,然后点击model面板,并点击Data Source面板,选择配置hive数据源,并加载需要用到的表同步到kylin里面 image

image

(4)点击Models,开始设计model,这个步骤主要是基础加工,配置一个事实表和多个维表以及他们的关联条件,和需要统计的维度和度量 image

(5)设计cube image

image(6)构建cube image

(7)查看cule的构建进度 image

(8)最后查询cule数据 image

至此一整个的cuble构建流程完事,整体步骤还是比较多的,当然里面有一些步骤并没有说的那么详细,此外设计cuble的步骤有一些高级配置,对优化查询有着比较重要的作用,这块现在还没太深入,这个demo只是让我们有一个整体的认识,如果对高级的设计感兴趣的朋友可以看kylin的官网文档。

Kylin的本质是基于空间换时间的策略来实现亚秒级的查询,本身只是一个Server,充分利用了Hadoop+Hive来把结果集数据预构建到Hbase里来优化提高查询效率。所以想要使用Kylin必须保证你的Hadoop,Hive,Hbase已经安装,并且能正常使用。

构建cube的本质,其实就是把各种可能用到的查询,聚合,统计提前预计算好,然后按规则写入hbase,这样在查询的时候,基于rowkey的查询响应速度非常快,而且随着数据量的增大,查询响应时间基本是个常量,虽然查询很快,但是离线使用MapReduce来预构建cube的过程确实非常之慢,另外一个缺点是单kylin的server并发非常低,根据我们的测试也就40左右,大家可能有疑问,hbase本身支持的并发是非常强大的为什么到了kylin这里就这么低,其实kylin server服务不仅仅只是查询hbase的结果返回给前端,大部分时候都需要在server的内存里做各种运算,比如分页,排序,聚合等,所以如果大并发量一旦瞬间上来可把kylin server所在的tomcat的jvm内存给耗尽,最终导致任务失败或者服务挂掉。所以kylin的定位是给产品或者运营使用的大数据OLAP查询引擎,如果并发量比较高的业务,使用kylin一直要提前测试好,根据并发情况多部署几个kylin server服务。

总结:

总体来说,对于一些字段数固定且不经常改变schema的大表数据,采用kylin来进行OLAP查询是非常适合的,性能也不错,但是如果scheam经常变换,统计的维度和度量也可能变换这种场景是不太适合用kylin来解决的,可以尝试ES或者SOLR来分析,最后需要注意的事kylin的并发支持并不太好,非常高并发的查询服务,一定要严格测试后,多部署几个kylin server且做好读写分离,提交任务的server集群和查询server集群分开部署。



2019-01-18 13:42:17 a_drjiaoda 阅读数 1644
  • Kylin大数据实战学习教程

    本课程为专题课,通过全面讲解Kylin架构原理、分布式集群搭建以及项目案例,让你快速掌握Kylin实时大数据BI技术,从而解决海量数据多维指标动态计算耗时问题、复杂条件筛选问题以及跨月、季度、年等大时间区间查询问题。

    980 人正在学习 去看看 易水

《Kylin2.5.0安装部署及样例sample.sh》一文中,我们搭建了kylin2.5.0版本的运行环境,并且简单演示了一下官方的Sample Cube的示例,这样从宏观上对kylin的运行流程有了一个整体的认识。那么,这篇文章我们将继续从创建一个完整的cube到执行sql语句,对其中的每一步都做一个详细的描述。本文的业务背景来自于蒋守壮老师的《基于Apache Kylin构建大数据分析平台》一书。

在进入正题之前,先简单介绍一下本例的业务背景:创建一个网站流量的Cube,用于统计常用的PV(Page View)和UV(Unique Visitor)等指标,包含一个事实表(web_access_fact_tab1),字段为访问日期、cookieid、regionid、cityid、siteid、OS、pv(2018-12-01|GB56THSJ1J7V2MDAB1|G03|G0301|Mac OS|2)【有需要的同学可以下方评论,拿事实表的数据】;两个维度表region_tb1,字段为regionid、regionname(G01|北京);city_tb1,字段为regionid、cityid、cityname(G01|G0101|朝阳区)。三张表组成一个星型模型,即一张事实表和多张维度表,通过主外键关联起来。顺便加一句,很多时候我们可能会涉及到多张事实表,而kylin又支持星型模型,因此需要现在Hive中进行预处理,来产生一张比较大的事实表。

###Start Your Shows ###

首先我们需要了解,kylin中多为分析Cube的建立主要包括以下步骤:

  • 对Hive中事实表,以及多张维度表的处理;
  • 在Kylin中建立新的Project;
  • Kylin中同步数据源(Load DataSource);
  • Kylin中建立数据模型;
  • 建立Cube;
  • Build Cube;
  • 查询Cube。

一、在Hive中处理事实表、维度表

1、在Hive创建Database kylin_flat_db,创建成功后再创建我们需要的事实表结构,代码如下

hive> create table kylin_flat_db.web_access_fact_tb1
( 
day date, cookid string, regionid string, cityid string, 
siteid string, os string, pv bigint
) row format delimited 
fields terminated by '|' 
stored as textfile;

2、使用 load data local inpath语句将我们提前准备好的kylin事实表数据源导入到实时表web_access_fact_tb1;

hive> load data local inpath '/usr/kylin/fact_data.txt' 
into table web_access_fact_tb1;

3、创建region维度表和city维度表,建表语句见如下代码。

hive> create table kylin_flat_db.region_tb1
    > ( regionid string, regionname string )
    > row format delimited
    > fields terminated by '|' stored as textfile;

hive> create table kylin_flat_db.city_tb1
    > ( regionid string, cityid string, cityname string )
    > row format delimited
    > fields terminated by '|' stored as textfile;

4、再使用加载语句,将本地两个文件内容加载到相应的维度表中。

二、在Kylin中建立项目(Project)

在Model页面点击 “+” 新建一个项目,输入project name  ===》  myproject_pvuv

三、建立数据源,Load DataSource。

选择我们刚刚创建的项目后单击 Data Source ,如下图所示,有三个图标来选择加载数据的方式。1、第一个图标为:Load Hive Table,手动输入需要加载的Hive列表,表之间用逗号分隔,确保输入的是之前在Hive中已经创建的表。

2、第二个图标是Load Hive Table From Tree,单击kylin_flat_db数据库后会列出该库下面所有的表,单击选中需要同步的表即可。

3、第三个图标:Add Streaming Table。添加实时数据流的表,格式必须是Json格式,在本版本的Kylin中有基于Kakfa定义的Streaming Table,从而完成准实时Cube的创建。

四、Kylin中建立数据模型(Model)

1、kylin中建立数据模型,选中New Model,在弹出如下的对话框里,输入Model名称myproject_pvuv_model,点击Next

2、在Data Model里,主要就是用来选择事实表和维度表,并使用left join 或者 inner join 将其关联起来,点击Add Lookup table,可如下,选择相应的表及维度。注意:星型模型,只有一个事实表。

配置完成后,如下图所示:

3、Dimensions,主要是选择各个表的维度,这里我们选择能用到的维度

4、Measures,选择需要度量指标的字段,本例中使用cookid和PV

5、setting,设置Cube增量刷新的分区字段,字段类型可以为Date、String、Varchar等。如果分区字段为空,则每次默认为全量构建cube(不推荐此种做法)。另外,我们还可以从Hive源数据表中过滤数据,这里不行mysql需要指定where关键字,直接写过滤条件就可以,本例中为输出pv>0的数据。

6、最后,我们保存本次创建的Model

7、查看已经创建好的模型,这里有三种方式查看,分别为Grid(表格)、Visualization(可视化)、JSON(JSON格式)、如下图。

五、重点:建立cube

1、选择之前创建好的Model,填写Cube名称pvuv_cube,如果需要邮件提醒cube事件的相关信息,还能够设置邮箱列表以及发送的事件级别。

2、Dimensions,这里可以使用“add dimensions”手动添加,如下面所示,我们选择了需要展示的维度,并修改了Name。此外这里面需要提及到Type里面的两种类型normal和derived,norma是最常见的类型,与所有其他的dimension组合构成Cuboid,derived从有衍生维度的查找表获取维度,这里只是简单介绍,内容远远不止这些。

点击Actions的编辑图标,可以对Dimension的Name进行修改,比如将本来的英文名称改为中文显示。

3、Measures为度量指标的设计。这里我们对pv进行sum汇总计算,对cookid进行count distinct去重过滤统计个数。

4、Refresh setting,即Cube刷新设置,这里主要用来设计增量Cube合并信息,默认每隔7天就进行merge增量的segments(每一个segment都会对应着一个物理的cube,做过增量刷新的应该会知道),每隔28天就merge前面7天合并segments。默认即可,如果有需要,也可在页面进行手动合并。这里的Partition Start Date:是Cube增量刷新的开始时间,这跟你业务数据产生第一天关联。

5、Advanced Setting,这是kylin的高级配置页面,首先是Aggravation Groups(聚合组),这部分没有截图,保持默认的内容不变即可,简单的介绍一下Aggravation Groups,这是一个将维度进行分组,已达到降低维度组合数目的手段。不同分组的维度之间组成的Cuboid数量会大大降低。那么在本例中维度组合从2的(m+n+k)最多能降低到2的m次方+2的n次方+2的k次方。维度组的设置就是为了让不出现在一个查询中的两个维度不计算Cuboid(可通过划分到两个不同的维度组中),这其实就相当于把一个cube的树结构划分成多个不同的树,可以在不降低查询性能的情况下减少Cuboid的计算量。

Hbase rowkey,下图的内容即是对Hbase Rowkey进行设计,默认Rowkey是由维度的值进行组合的,这里也是使用默认值。后面属性Encoding值为dict,就是Dictionary方式表示要为这个维度建立字典树。这在build cube的步骤中会用到。

6、列出创建Cube的统计信息,如果没有问题,单机Save,并在弹出的页面点击Yes,即可完成整个Cube的创建。

六、Build Cube

在我们的cube创建完成之后,就要开始Build了,这里我们选择增量构建方式,所谓的增量构建方式就是指从某个时间段开始到某个时间段结束,下次重新build 同一个cube时,会以上个结束时间点作为开始时间。

跳转到Monitor界面,可以查看到Build cube的详细过程,在界面的弹出窗口可以查看到构建cube的每个具体步骤,等到progress到达100%时,就代表此cube构建完成,Monitor中的Job状态显示为Finished,用户可以继续下一步操作。

此时,回去Model可看到pvuv_cube的状态以及显示为Ready。这里面的Actions有很多操作,简单介绍一下。1 Drop,删除此cube(常规下不推荐操作);2 Edit,如果发现cube设计有问题,可以选择Edit修改;3 Build, 执行构建Cube操作,如果是增量构建,需要指定开始和结束时间;4 Refresh,对某个已经构建过的Cube Segment,重新从数据源抽取数据并构建,从而获得更新;5 Merge,对于增量Cube已经设置分区字段,这样Cube就可以进行多次Build,每一次Build就会生成一个segment并且对应一个物理的cube。这些segment的时间区间是连续并且不重合,merge就是将其合并,减少Cube的存储空间。

七、查询Cube

在Insight页面来验证Cube构建的结果是否正常,尝试执行下述SQL语句:

select  regionname, cityname, sum(pv), count(distinct cookid)
from WEB_ACCESS_FACT_TB1 a
left join CITY_TB1 b
on a.cityid = b.cityid
left join REGION_TB1 c
on c.regionid = a.regionid
group by regionname, cityname;

在kylin中执行效果如下图,其执行时间为0.15s

接下来,我们在hive里面执行相同SQL进行验证,可以很直观的看到hive花费了将近43s,夸张的比较一下,hive的花费的时间将近kylin的287倍。

此外,kylin还提供了一些简单的可视化,而且是非常简单

到此为止,整个Cube的设计、创建、构建、查询等步骤都有一一介绍完毕。

2018-08-14 12:41:19 c929833623lvcha 阅读数 289
  • Kylin大数据实战学习教程

    本课程为专题课,通过全面讲解Kylin架构原理、分布式集群搭建以及项目案例,让你快速掌握Kylin实时大数据BI技术,从而解决海量数据多维指标动态计算耗时问题、复杂条件筛选问题以及跨月、季度、年等大时间区间查询问题。

    980 人正在学习 去看看 易水

    最近在工作中用到了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构建过程是一个子任务一次串行执行的过程,这些子任务又被分为四个阶段。

第一阶段:创建平表。

这一阶段的主要任务是预计算连接运算符,把事实表和维表连接为一张大表,也称为平表。这部分工作可通过调用数据源接口来完成,因为数据源一般有现成的计算表连接方法,高效且方便,没有必要在计算引擎中重复实现。

第二阶段:创建字典。

创建字典由三个子任务完成,由MR引擎完成,分别是抽取列值、创建字典和保存统计信息。是否使用字典是构建引擎的选择,使用字典的好处是有很好的数据压缩率,可降低存储空间,同时也提升存储读取的速度。缺点是构建字典需要较多的内存资源,创建维度基数超过千万的容易造成内存溢出。

第三阶段:构建Cube。

其中包含两种构建cube的算法,分别是分层构建和快速构建。对于不同的数据分布来说它们各有优劣,区别主要在于数据通过网络洗牌的策略不同。两种算法的子任务将全部被加入工作流计划中,在执行时会根据源数据的统计信息自动选择一种算法,未被选择的算法的子任务将被自动跳过。在构建cube的最后还将调用存储引擎的接口,存储引擎负责将计算完的cube放入引擎。

第四阶段:更新元数据和清理。

最后阶段,cube已经构建完毕,MR引擎将首先添加子任务更新cube元数据,然后分别调用数据源接口和存储引擎接口对临时数据进行清理。

3.

IMRInput

这是BatchCubingJobBuilder2对数据源的要求,所有希望接入MRBatchCubingEngine2的数据源都必须实现该接口。

·

getTableInputFormat

方法返回一个IMRTableInputFormat对象,用以帮助MR任务从数据源中读取指定的关系表,为了适应MR编程接口,其中又有两个方法,configureJob在启动MR任务前被调用,负责配置所需的InputFormat,连接数据源中的关系表。由于不同的InputFormat所读入的对象类型各不相同,为了使得构建引擎能够统一处理,因此又引入了parseMapperInput方法,对Mapper的每一行输入都会调用该方法一次,该方法的输入是Mapper的输入,具体类型取决于InputFormat,输出为统一的字符串数组,每列为一个元素。整体表示关系表中的一行。这样Mapper救能遍历数据源中的表了。

·

getBatchCubingInputSide

方法返回一个IMRBatchCubingInputSide对象,参与创建一个CubeSegment的构建工作流,它内部包含三个方法,addStepPhase1_CreateFlatTable()方法由构建引擎调用,要求数据源在工作流中添加步骤完成平表的创建;getFlatTableInputFormat()方法帮助MR任务读取之前创建的平表;addStepPhase4_Cleanup()是进行清理收尾,清除已经没用的平表和其它临时对象,这三个方法将由构建引擎依次调用。

4.

IMROutput2

这是BatchCubingJobBuilder2对存储引擎的要求,所有希望接入BatchCubingJobBuilder2的存储都必须实现该接口。

IMRBatchCubingOutputSide2代表存储引擎配合构建引擎创建工作流计划,该接口的内容如下:

·

addStepPhase2_BuildDictionary

:由构建引擎在字典创建后调用。存储引擎可以借此机会在工作流中添加步骤完成存储端的初始化或准备工作。

·

addStepPhase3_BuildCube

:由构建引擎在Cube计算完毕之后调用,通知存储引擎保存CubeSegment的内容。每个构建引擎计算Cube的方法和结果的存储格式可能都会有所不同。存储引擎必须依照数据接口的协议读取CubeSegment的内容,并加以保存。

·

addStepPhase4_Cleanup

:由构建引擎在最后清理阶段调用,给存储引擎清理临时垃圾和回收资源的机会。

(二)数据源Hive

Hive是kylin的默认数据源,由于数据源的实现依赖构建引擎对输入接口的定义,因此本节的具体内容只适用于MR引擎。

数据源

HiveSource

首先要实现

ISource

接口。

 

 

HiveSource实现了ISource接口中的方法。adaptToBuildEngine()只能适配IMRInput,返回HiveMRInput实例。另一个方法createReadableTable()返回一个ReadableTable对象,提供读取一张hive表的能力。

HiveMRInput

HiveMRInput实现了IMRInput接口,实现了它的两个方法。

一是HiveTableInputFormat实现了IMRTableInputFormat接口,它主要使用了HCatInputFormat作为MapReduce的输入格式,用通用的方式读取所有类型的Hive表。Mapper输入对象为DefaultHCatRecord,统一转换为String[]后交由构建引擎处理。

二是BatchCubingInputSide实现了IMRBatchCubingInputSide接口。主要实现了在构建的第一阶段创建平表的步骤。首先用count(*)查询获取Hive平表的总行数,然后用第二句HQL创建Hive平表,同时添加参数根据总行数分配Reducer数目。

 

(三)存储引擎HBase

存储引擎

HBaseStorage

实现了

IStorage

接口。

 

·

createQuery

方法,返回指定IRealization(数据索引实现)的一个查询对象。因为HBase存储是为Cube定制的,所以只支持Cube类型的数据索引。具体的IStorageQuery实现应根据存储引擎的版本而有所不同。

·

adaptToBuildEngine

方法,适配IMROutput2的输出接口。

HBaseMROutput2

观察IMRBatchCubingOutputSide2的实现。它在两个时间点参与Cube构建的工作流。一是在字典创建之后(Cube构造之前),在addStepPhase2_BuildDictionary()中添加了“创建HTable”这一步,估算最终CubeSegment的大小,并以此来切分HTable Regions,创建HTable。

第二个插入点是在Cube计算完毕之后,由构建引擎调用addStepPhase3_BuildCube()。这里要将Cube保存为HTable,实现分为“转换HFile”和“批量导入到HTable”两步。因为直接插入HTable比较缓慢,为了最快速地将数据导入到HTable,采取了Bulk Load的方法。先用一轮MapReduce将Cube数据转换为HBase的存储文件格式HFile,然后就可以直接将HFile导入空的HTable中,完成数据导入。

最后一个插入点是addStepPhase4_Cleanup()是空实现,对于HBase存储来说没有需要清理的资源。

 

五、CubingJob的构建过程

在Kylin构建CubeSegment的过程中,计算引擎居于主导地位,通过它来协调数据源和存储引擎。

在网页上向Kylin服务端发送构建新的CubeSegment的请求后,通过controller层来到service层,进入JobService类中的submitJob方法,方法内部再调用submitJobInternal方法,在build、merge和refresh的时候,通过

EngineFactory.

createBatchCubingJob

(newSeg

,

submitter)

返回一个job实例,从这里可以看出,CubingJob的构建入口是由计算引擎提供的,即默认的计算引擎MRBatchCubingEngine2。

 

Kylin所支持的所有计算引擎,都会在EngineFactory中注册,并保存在batchEngine中,可以通过配置文件kylin.properties选择计算引擎,目前Kylin支持的计算引擎有:

MRBatchCubingEngine2实现了createBatchCubingJob方法,方法内调用了BatchCubingJobBuild2的build方法。

在new的初始化过程中,super(newSegment,submitter)就是执行父类的构造方法,进行了一些属性的初始化赋值,其中的inputSide和outputSide就上上文提到的数据源和存储引擎实例,通过计算引擎的协调来进行CubingJob的构建。

数据源inputSide实例获取:

以上即为数据源实例获取过程的代码展现,BatchCubingJobBuilder2初始化的时候,调用MRUtil的getBatchCubingInputSide方法,它最终调用的其实还是MRBatchCubingEngine2这个计算引擎的getJoinedFlatTableDesc方法,它返回了一个IJoinedFlatTableDesc实例,这个对象就是对数据源表信息的封装。获得了这个flatDesc实例之后,就要来获取inputSide实例,与获取计算引擎代码类似,目前kylin中支持的数据源有:

Kylin默认的数据源是序号为0的HiveSource,所以最后调用的是HiveSource的adaptToBuildEngine,根据传入的IMRInput.class接口,最终返回得到HiveMRInput的实例,最后再通过它的getBatchCubingInputSide的方法获取inputSide的实例。

存储引擎outputSide实例获取:

以上即为存储引擎实例获取的代码展现,BatchCubingJobBuilder2初始化的时候,调用MRUtil的getBatchCubingOutputSide方法,方法内先调用了StorageFactory类的createEngineAdapter方法,方法内又调用实现了Storage接口的HBaseStorage类的adaptToBuildEngine方法,最后返回了HBaseMROutput2Transition实例,然后在通过它的getBatchCubingOutputSide方法就可以获取到outputSide的实例。目前kylin中支持的数据源有:

kylin默认的存储引擎是HBase。

——————————————————————————————————

通过构造函数,数据源、计算引擎和数据存储三个模块已经关联到一起了,上文介绍到的MRBatchCubingEngine2的方法中,在new出了一个BatchCubingJobBuild2实例后,接着就调用了build方法,最后返回了一个CubingJob实例。build方法逻辑如下:

 

方法的内容就是构建一个CubeSegment的步骤,依次顺序的加入到CubingJob的任务list中。

从第一行开始,调用了CubingJob的createBuildJob方法,里面又调用了initCubingJob方法。

initCubingJob方法就是获取到cube相关的一些配置信息进行初始化,它是根据cube的名字去查询所在的project,如果不同的project下创建了相同名字的cube,那返回的就会是一个List,然后看配置文件中是否开启了允许cube重名,如不允许则直接抛出异常,如果允许就在设置projectName时取返回List中的第一个元素,那么这里就可能导致projectName设置错误,所以最好保证cube的name是全局唯一的。

在CubingJob初始化之后,会获取cuboidRootPath,获取逻辑如下:

经过一连串的调用拼装,最终获取的路径格式如下:

hdfs:///kylin/kylin_metadata/kylin-jobId/cubeName/cuboid

接下来就是三大引擎相互协作,构建CubeSegment的过程,整个过程大致分为创建hive平表、创建字典、构建Cube和更新元数据和清理这四个步骤。

第一步和第四步是由数据源来实现的,具体是在HiveMRInput类实现了IMRInput接口的getBatchCubingInputSide方法中,它返回了一个BatchCubingInputSide实例,在这个类中完成了具体工作;第二步是由计算引擎实现的,依靠JobBuilderSupport类中的方法完成;第三步是由计算引擎和存储引擎共同完成的,包括构建cube和存储到HBase;第四步是由数据源和存储引擎分别完成的;我们按步骤对代码进行分析。

首先是第一步创建hive平表调用了HiveMRInput类中的静态内部类BatchCubingInputSide中的addStepPhase1_CreateFlatTable方法。

先获取cubeName、cubeConfig、hive命令(USE faltTableDatabase)三个变量。

 

接下来的方法就是抽取变量,进行hive命令的拼接,完成以下步骤:

一是从hive表中,将所需字段从事实表和维表中提取出来,构建一个宽表;

二是将上一步得到的宽表,按照某个字段进行重新分配,如果没有指定字段,则随机,目的是产生多个差不多大小的文件,作为后续构建任务的输入,防止数据倾斜。

三是将hive中的视图物化。

——————————————————————————————————

创建平表命令例子:

hive -e "USE default;

DROP TABLE IF EXISTS kylin_intermediate_taconfirm_kylin_15all_ddacfb18_3d2e_4e1b_8975_f0871183418d;

CREATE EXTERNAL TABLE IF NOT EXISTS kylin_intermediate_taconfirm_kylin_15all_ddacfb18_3d2e_4e1b_8975_f0871183418d

(

TACONFIRM_BUSINESSCODE string

,TACONFIRM_FUNDCODE string

,TACONFIRM_SHARETYPE string

,TACONFIRM_NETCODE string

,TACONFIRM_CURRENCYTYPE string

,TACONFIRM_CODEOFTARGETFUND string

,TACONFIRM_TARGETSHARETYPE string

,TACONFIRM_TARGETBRANCHCODE string

,TACONFIRM_RETURNCODE string

,TACONFIRM_DEFDIVIDENDMETHOD string

,TACONFIRM_FROZENCAUSE string

,TACONFIRM_TAINTERNALCODE string

,TACONFIRM_C_PROVICE string

,TAPROVINCE_PROVINCENAME string

,TASHARETYPE_SHARETYPENAME string

)

STORED AS SEQUENCEFILE

LOCATION 'hdfs://qtbj-sj-cdh-name:8020/kylin/kylin_metadata/kylin-4c5d4bb4-791f-4ec3-b3d7-89780adc3f58/kylin_intermediate_taconfirm_kylin_15all_ddacfb18_3d2e_4e1b_8975_f0871183418d';

ALTER TABLE kylin_intermediate_taconfirm_kylin_15all_ddacfb18_3d2e_4e1b_8975_f0871183418d SET TBLPROPERTIES('auto.purge'='true');

INSERT OVERWRITE TABLE kylin_intermediate_taconfirm_kylin_15all_ddacfb18_3d2e_4e1b_8975_f0871183418d SELECT

TACONFIRM.BUSINESSCODE as TACONFIRM_BUSINESSCODE

,TACONFIRM.FUNDCODE as TACONFIRM_FUNDCODE

,TACONFIRM.SHARETYPE as TACONFIRM_SHARETYPE

,TACONFIRM.NETCODE as TACONFIRM_NETCODE

,TACONFIRM.CURRENCYTYPE as TACONFIRM_CURRENCYTYPE

,TACONFIRM.CODEOFTARGETFUND as TACONFIRM_CODEOFTARGETFUND

,TACONFIRM.TARGETSHARETYPE as TACONFIRM_TARGETSHARETYPE

,TACONFIRM.TARGETBRANCHCODE as TACONFIRM_TARGETBRANCHCODE

,TACONFIRM.RETURNCODE as TACONFIRM_RETURNCODE

,TACONFIRM.DEFDIVIDENDMETHOD as TACONFIRM_DEFDIVIDENDMETHOD

,TACONFIRM.FROZENCAUSE as TACONFIRM_FROZENCAUSE

,TACONFIRM.TAINTERNALCODE as TACONFIRM_TAINTERNALCODE

,TACONFIRM.C_PROVICE as TACONFIRM_C_PROVICE

,TAPROVINCE.PROVINCENAME as TAPROVINCE_PROVINCENAME

,TASHARETYPE.SHARETYPENAME as TASHARETYPE_SHARETYPENAME

FROM DEFAULT.TACONFIRM as TACONFIRM

INNER JOIN DEFAULT.TAPROVINCE as TAPROVINCE

ON TACONFIRM.C_PROVICE = TAPROVINCE.C_PROVICE

INNER JOIN DEFAULT.TASHARETYPE as TASHARETYPE

ON TACONFIRM.SHARETYPE = TASHARETYPE.SHARETYPE

WHERE 1=1;

" --hiveconf hive.merge.mapredfiles=false --hiveconf hive.auto.convert.join=true --hiveconf dfs.replication=2 --hiveconf hive.exec.compress.output=true --hiveconf hive.auto.convert.join.noconditionaltask=true --hiveconf mapreduce.job.split.metainfo.maxsize=-1 --hiveconf hive.merge.mapfiles=false --hiveconf hive.auto.convert.join.noconditionaltask.size=100000000 --hiveconf hive.stats.autogather=true

——————————————————————————————————

文件再分配和视图物化命令例子:

hive -e "USE default;

 

set mapreduce.job.reduces=3;

 

set hive.merge.mapredfiles=false;

 

INSERT OVERWRITE TABLE kylin_intermediate_taconfirm_kylin_15all_ddacfb18_3d2e_4e1b_8975_f0871183418d SELECT * FROM kylin_intermediate_taconfirm_kylin_15all_ddacfb18_3d2e_4e1b_8975_f0871183418d DISTRIBUTE BY RAND();

 

" --hiveconf hive.merge.mapredfiles=false --hiveconf hive.auto.convert.join=true --hiveconf dfs.replication=2 --hiveconf hive.exec.compress.output=true --hiveconf hive.auto.convert.join.noconditionaltask=true --hiveconf mapreduce.job.split.metainfo.maxsize=-1 --hiveconf hive.merge.mapfiles=false --hiveconf hive.auto.convert.join.noconditionaltask.size=100000000 --hiveconf hive.stats.autogather=true

——————————————————————————————————

 

创建字典由三个子任务完成,分别是抽取列值、创建字典和保存统计信息,由MR引擎完成,所以直接在build方法中add到任务list中。是否使用字典是构建引擎的选择,使用字典的好处是有很好的数据压缩率,可降低存储空间,同时也提升存储读取的速度。缺点是构建字典需要较多的内存资源,创建维度基数超过千万的容易造成内存溢出。在这个过程最后,还要创建HTable,这属于存储引擎的任务,所以是在HBaseMROutput2Transition实例中完成的。

——————————————————————————————————

抽取列值步骤参数例子:

-conf /usr/local/apps/apache-kylin-2.3.1-bin/conf/kylin_job_conf.xml -cubename Taconfirm_kylin_15all -output hdfs://qtbj-sj-cdh-name:8020/kylin/kylin_metadata/kylin-4c5d4bb4-791f-4ec3-b3d7-89780adc3f58/Taconfirm_kylin_15all/fact_distinct_columns -segmentid ddacfb18-3d2e-4e1b-8975-f0871183418d -statisticsoutput hdfs://qtbj-sj-cdh-name:8020/kylin/kylin_metadata/kylin-4c5d4bb4-791f-4ec3-b3d7-89780adc3f58/Taconfirm_kylin_15all/fact_distinct_columns/statistics -statisticssamplingpercent 100 -jobname Kylin_Fact_Distinct_Columns_Taconfirm_kylin_15all_Step -cubingJobId 4c5d4bb4-791f-4ec3-b3d7-89780adc3f58

——————————————————————————————————

构建维度字典步骤参数例子 :

-cubename Taconfirm_kylin_15all -segmentid ddacfb18-3d2e-4e1b-8975-f0871183418d -input hdfs://qtbj-sj-cdh-name:8020/kylin/kylin_metadata/kylin-4c5d4bb4-791f-4ec3-b3d7-89780adc3f58/Taconfirm_kylin_15all/fact_distinct_columns -dictPath hdfs://qtbj-sj-cdh-name:8020/kylin/kylin_metadata/kylin-4c5d4bb4-791f-4ec3-b3d7-89780adc3f58/Taconfirm_kylin_15all/dict

——————————————————————————————————

创建HTable步骤参数例子:

-cubename Taconfirm_kylin_15all -segmentid ddacfb18-3d2e-4e1b-8975-f0871183418d -partitions hdfs://qtbj-sj-cdh-name:8020/kylin/kylin_metadata/kylin-4c5d4bb4-791f-4ec3-b3d7-89780adc3f58/Taconfirm_kylin_15all/rowkey_stats/part-r-00000 -cuboidMode CURRENT

——————————————————————————————————

 

构建Cube属于计算引擎的任务,就是根据准备好的数据,依次产生cuboid的数据,在这里调用了两种构建方法,分别是分层构建和快速构建,但最终只会选择一种构建方法,分层构建首先调用createBaseCuboidStep方法,生成Base Cuboid数据文件,然后进入for循环,调用createNDimensionCuboidStep方法,根据Base Cuboid计算N层Cuboid数据。

在Cuboid的数据都产生好之后,还需要放到存储层中,所以接下来调用outputSide实例的addStepPhase3_BuildCube方法,HBaseMROutput2Transition类中的addStepPhase3_BuildCube方法主要有两步,一是createConvertCuboidToHfileStep方法,将计算引擎产生的cuboid数据转换成HBase要求的HFile格式,二是createBulkLoadStep方法,即把HFIle数据加载到HBase中。

——————————————————————————————————

构建Base Cuboid步骤参数例子:

-conf /usr/local/apps/kylin/conf/kylin_job_conf.xml -cubename kylin_sales_cube -segmentid 392634bd-4964-428c-a905-9bbf28884452 -input FLAT_TABLE -output hdfs://qtbj-sj-cdh-name:8020/kylin/kylin_metadata/kylin-6f3c2a9e-7283-4d87-9487-a5ebaffef811/kylin_sales_cube/cuboid/level_base_cuboid -jobname Kylin_Base_Cuboid_Builder_kylin_sales_cube -level 0 -cubingJobId 6f3c2a9e-7283-4d87-9487-a5ebaffef811

——————————————————————————————————

构建N层Cuboid步骤参数例子:

-conf /usr/local/apps/kylin/conf/kylin_job_conf.xml -cubename kylin_sales_cube -segmentid 392634bd-4964-428c-a905-9bbf28884452 -input hdfs://qtbj-sj-cdh-name:8020/kylin/kylin_metadata/kylin-6f3c2a9e-7283-4d87-9487-a5ebaffef811/kylin_sales_cube/cuboid/level_1_cuboid -output hdfs://qtbj-sj-cdh-name:8020/kylin/kylin_metadata/kylin-6f3c2a9e-7283-4d87-9487-a5ebaffef811/kylin_sales_cube/cuboid/level_2_cuboid -jobname Kylin_ND-Cuboid_Builder_kylin_sales_cube_Step -level 2 -cubingJobId 6f3c2a9e-7283-4d87-9487-a5ebaffef811

——————————————————————————————————

转换HFile格式步骤参数例子:

-conf /usr/local/apps/kylin/conf/kylin_job_conf.xml -cubename kylin_sales_cube -partitions hdfs://qtbj-sj-cdh-name:8020/kylin/kylin_metadata/kylin-6f3c2a9e-7283-4d87-9487-a5ebaffef811/kylin_sales_cube/rowkey_stats/part-r-00000_hfile -input hdfs://qtbj-sj-cdh-name:8020/kylin/kylin_metadata/kylin-6f3c2a9e-7283-4d87-9487-a5ebaffef811/kylin_sales_cube/cuboid/* -output hdfs://qtbj-sj-cdh-name:8020/kylin/kylin_metadata/kylin-6f3c2a9e-7283-4d87-9487-a5ebaffef811/kylin_sales_cube/hfile -htablename KYLIN_O2SYZPV449 -jobname Kylin_HFile_Generator_kylin_sales_cube_Step

——————————————————————————————————

加载HFile到HBase步骤参数例子:

-input hdfs://qtbj-sj-cdh-name:8020/kylin/kylin_metadata/kylin-6f3c2a9e-7283-4d87-9487-a5ebaffef811/kylin_sales_cube/hfile -htablename KYLIN_O2SYZPV449 -cubename kylin_sales_cube

——————————————————————————————————

最后一步就是一些收尾工作,包括更新Cube元数据信息,调用inputSide和outputSide实例进行中间临时数据的清理工作。

完成所有步骤之后,就回到了JobService的submitJob方法中,在得到CubingJob的实例后,会执行以上代码。这里做的是将CubingJob的信息物化到HBase的kylin_metadata表中,并没有真正的提交执行。

真正执行CubingJob的地方是在DefaultScheduler,它里面有一个线程会每隔一分钟,就去HBase的kylin_metadata表中扫一遍所有的CubingJob,然后将需要执行的job,提交到线程池执行。

kylin中任务的构建和执行是异步的。单个kylin节点有query、job和all三种角色,query只提供查询服务,job只提供真正的构建服务,all则兼具前两者功能。实际操作中kylin的三种角色节点都可以进行CubingJob的构建,但只有all和job模式的节点可以通过DefaultScheduler进行调度执行。

 

2019-11-28 23:05:16 a790439710 阅读数 6
  • Kylin大数据实战学习教程

    本课程为专题课,通过全面讲解Kylin架构原理、分布式集群搭建以及项目案例,让你快速掌握Kylin实时大数据BI技术,从而解决海量数据多维指标动态计算耗时问题、复杂条件筛选问题以及跨月、季度、年等大时间区间查询问题。

    980 人正在学习 去看看 易水

上一章中讲了怎么创建cube,最后演示了一个cube怎么执行的,这一章来说说kylin到底是怎么来构建cube的。

点击我们的cube的最右边的箭头,页面右边展示了整个cube构建的详细步骤,查看每个步骤的log,显示详细构建过程。

 

 

1.构建中间表。

拿第二章的例子来说,就是构建由员工和部门组成的宽表。日志如下:

2.将中间表的数据均匀分配到不同的文件。

因为后面的程序是从中间表读取并运行mr程序的,如果你的中间表数据不均匀会造成后续的mr程序数据倾斜,降低效率。所以非常有必要将数据均匀分配。

我们来看看kylin到底是怎么均匀分配的。首先它会计算表中总共有多少行数据(total input rows),然后它默认每个文件1000000行数据(一百万行数据差不多不会超过hdfs一个块大小,也就是128M),然后计算有多少个文件(多少个reduce),total input rows/1000000。我们这里只有1个文件。然后设定reduce任务的个数,用distribute by重新将这些数据分配到不同的文件中。

3.创建维度字典表。

比如job,可能有很多值,去重后,每个值按照0到N,一一映射保存到各个维度表中,这样做便于以后查询效率高,下面你就能感受到这种设计的巧妙之处了。

job     value                        hiredate        value                                    dname      value

java      0                            2019-10-01      0                                        partA           0

c++       1                           2019-05-01      1                                         partB          1

python   2

4.多维度构建cube。

我这里为了省时就只写三个维度了,数据量也只写了4条。*代表无数据,也就是全体的意思,比如第二行表示了2019-05-01入职的C++的所有开发员工的薪水是30000。第三行代表了所有python员工的工资是200000。从一维到多维构建所有的情况,总共有2^n-1种情况,n表示维度。

job            hiredate         dname      sal

java          2019-10-01    partA        10000

c++          2019-05-01        *            30000

python     *                        *            200000

*                    *                partB        70000

5.Hbase K-V映射。

按照步骤3,4一一构建映射。rowkey是由维度id+维度值组成的。比如第一行   java,2019-10-01,partA,10000这条数据,每一维都有数据,所以每一维都记1,就是111,然后对照步骤3,维度值是000,结果就是111000。再举个例子,比如第二行,c++ ,2019-05-01, * , 30000。只有前面两维有数据,所以是110,对照步骤3,维度值就是11,结果就是11011(注意,维度值是0就省略掉)。最终步骤4构建如下所示。(为了方便大家看,rowkey中写了‘+’,其实是没有‘+’)现在看看,数据全部都是数字存储,是不是简便了很多了。等会查询的时候你也会发现查询的效率也很高。

RowKey          value

111+000         10000

110+11           30000

100+2             200000

001+1             70000

6.将cube data转成HFile格式并导入HBase。

步骤5的结果实际上是以sequence格式保存在hive中,现在将hive中结果导入HBase中。

 

Kylin构建Cube优化

阅读数 683

Kylin 源码分析

阅读数 50

没有更多推荐了,返回首页