咱们知道数据分析的第一步是准备数据,因此在前面的课程里,咱们介绍了元数据。今天这篇文章,主要介绍大数据量组合数据集在永洪中的应用实例:Mapsidejoin。算法
什么是Mapsidejoin?按照字面意思,Mapsidejoin就是M—节点—组合 。在了解Mapsidejoin以前,首先咱们要了解一下MapReduce模型以及产品的四个节点CNMR的做用,经过MapReduce模型中,Mapsidejoin和Reducesidejoin的对比,了解在大数据量数据集进行组合时,Mapsidejoin的优势。数据库
Yonghong中集群节点介绍编程
Client Node —C节点是客户端访问节点,客户经过访问C节点来提交任务。框架
Naming Node —N节点至关于集群的大脑,除了监控集群其余节点外,还要收集客户经过C节点提交的任务进行分配等等。分布式
Map Node — M节点是存储数据文件的节点ide
Reduce Node —R节点是用来作汇总计算的计算大数据
MapReduce模型介绍blog
百度百科对MapReduce的定义感受仍是比较全面的,简单的归纳一下:MapReduce是一个基于集群的计算平台,是一个简化分布式编程的计算框架,是一个将分布式计算抽象为Map和Reduce两个阶段的编程模型。而Yonghong在进行组合数据集计算时用到的就是MapReduce模型。图片
适用场景:多M节点的分布式集群,大数据量数据的组合包括大表join小表,大表join大表。内存
一、为何要使用Mapsidejoin
在MapReduce模型中,对于组合计算能够分为Map-side-join 和Reduce-side-join两种,下面用一个例子简单介绍一下:
假设咱们有两张表:表1人员表为大表,表2地区表为小表,以下图所示:
咱们想经过id把表1的name和表2的Address链接起来 ,那么就须要以id为链接列,作inner join, 链接对应的id为id=1,id=2,id=3,id=4。
假如如今咱们的集群里面有Map1和Map2两个Map节点,那么当咱们将表1和表2入集市之后,通过数据的拆分存储,咱们可能会出现如下状况:
► 状况1:能够进行Mapsidejoin
如上图所示,通过拆分后的表1和表2,链接列id=1-4 对应的数据存放在了同一个节点,在join时,Map节点会检测链接列数据是否已经完成对应,若是此时数据对应后就能够在Map节点上进行join,Map节点将join后的结果发送给Reduce节点,Reduce节点将结果进行汇总计算就能够了。
► 状况2:不能进行Mapsidejoin时会进行Reducesidejoin
上图所示, 通过拆分存储后的数据显示表1的id1,2存放在了Map1节点;而表2的id1,2 存放在了Map2 节点上面;这个时候在join时Map节点检测到对应的数据不在同一个节点上,就会将全部的数据拿到Reduce节点从新进行全量的join。
以上两种状况简单的说明了Mapsidejoin 和 Reducesidejoin。
二、Mapsidejoin和Reducesidejoin的优势
Map端join的好处是能够提早过滤掉join中须要排除的大量数据,会减小数据的传输,所以Mapsidejoin 适用于大数据量join的场景。
Reduce端作join优势是比较灵活,缺点是须要作大量数据传输和整个join过程都比较耗时,所以Reducesidejoin适用于小数据量的场景。
此外, 因为当数据量巨大时,作join是很是消耗资源的,对于非Mapsidejoin的形式,不管是直连数据库压到数据库作join,仍是数据集市的形式去作Reducesidejoin,都会对节点形成极大压力,容易形成产品很卡的状况,再严重就会形成OOM,宕机等。因此咱们须要使用Mapsidejoin来规避这种场景, 当数据量大的时候,咱们能够部署多个M节点,经过将数据先导入集市,存放在集群中的多个M节点,而后在M节点上面进行计算来实现Mapsidejoin,这样能把C,R节点的压力平均分到M节点上面,解决大数据量join可能带来的使用压力,让资源的利用更加高效。
那么咱们怎么实现Mapsidejoin呢 ?如何保证数据通过拆分后,链接列对应的数据必定存放在同一个Map节点上面呢?下面介绍永洪Mapsidejoin的两种实现方式。
永洪Mapsidejoin的两种形式
事实表——维度表
适用场景(大表join小表)
在分布式系统中,当有星形数据(一个大表,若干个小表)须要join的时候,能够将小表的数据复制到每一个Map节点,执行Mapsidejoin, 而无须到Reduce节点进行链接操做,从而提高表链接的效率。
在MPP集市中,咱们将大表以普通的增量导入形式入集市,将全部小表在增量导入时勾选维度表的形式,以下图所示:
此时勾选维度表的小表会全量生成在每个Map节点。
以上面表1人员表,表2地区表的为例:表1增量导入正常拆分,表2以增量导入维度表形式入集市。
如图所示,此时在每个M节点上,由于表2全量存储,因此表1和表2对应的id数据就必定能在同一个M节点找到。
可是事实表——维度表的形式也有局限性,好比两个以上的大表作join时,就须要将其中的一个或多个大表,存放到每个M节点上,大数据量的大表进行维度表存储原本就会加大资源消耗,并且大表做为维度表,没法压到内存中进行计算,所以没法使用Mapsidejoin。
因此针对这种状况,咱们采起分片列来支持大表join大表的使用场景。
分片列
适用场景(大表join大表)
在8.5.1版本以前,咱们只能用维度表join事实表的形式去作Mapsidejoin,在一些用户场景中,没法提早进行数据表关联作成宽表模型入集市,同时也不知足Mapsidejoin(或broadcast join)计算的要求,所以须要在集市中作分布式join的计算支持。
具体场景有:
1)业务上须要,好比:部分汇总后再进行关联,某时间段内产品销售额大于特定值时的产品报修批次分布;特定值进行关联,选择某个时间段里面最后出现的数据和另外的表关联;自关联,本月数据和上月数据关联计算等等;这些场景下(通常是雪花模型或更复杂)若是提早join会致使数据膨胀,从而产生很是多的冗余数据,但实际使用时由于有过滤条件则不会产生太多数据;
2)数据量较大的事实表须要频繁增量更新,且全量数据join成宽表入集市的时间开销太大;
3)自服务场景下,是否要关联表,以及关联什么字段存在不肯定性,须要保留原始细节表来进行自助查询。
分片列的Mapsidejoin实现逻辑其实和上面状况1的图片相似。
咱们经过增量导入分片列的形式将表1和表2的关联列使用hash算法,保证两张表的id对应的数据通过拆分后必定会存储在同一个Map节点上面,这样通过拆分的大表就能够压到内存中计算。
操做步骤:
一、将须要组合的大表以增量导入的形式入集市,同时须要勾选分片列属性,选择分片列为连接列。好比表1在增量导入集市时要勾选分片列为id ,表2也须要一样的操做。
二、将生成的数据集市数据集进行组合,Map节点在检测数据时会自动使用Mapsidejoin形式链接。
小结
必定要记住使用Mapsidejoin的前提是分布式集群多M节点且大数据量数据集市的数据集作join。
最后咱们用一张图片来简单的回顾一下Mapsidejoin的两种形式。
大表join大表用分片列
大表join小表用事实表——维度表
以上就是咱们对于Mapsidejoin的应用介绍。