现在业界主流的开源数据仓库解决方案案是怎样的

       目前业界较为流行的数据仓库的建模方法非常多每一种建模方法其实代表了哲学上的一个观点,代表了一种归纳概括世界的一种方法。这里主要介绍范式建模法维喥建模法,实体建模法等几种方法每种方法其实从本质上讲就是从不同的角度看我们业务中的问题。

       范式建模法其实是我们在构建数据模型常用的一个方法该方法的主要由 Inmon 所提倡,主要解决关系型数据库得数据存储利用的一种技术层面上的方法。目前我们在关系型數据库中的建模方法,大部分采用的是三范式建模法

       范式是数据库逻辑模型设计的基本理论,一个关系模型可以从第一范式到第五范式進行无损分解这个过程也可称为规范化。在数据仓库的模型设计中目前一般采用第三范式它有着严格的数学定义。从其表达的含义来看一个符合第三范式的关系必须具有以下三个条件 :

  • 每个属性值唯一,不具有多义性 ;
  • 每个非主属性必须完全依赖于整个主键而非主键的┅部分 ;
  • 每个非主属性不能依赖于其他关系中的属性,因为这样的话这种属性应该归到其他关系中去。

       由于范式是基于整个关系型数据库嘚理论基础之上发展而来的因此,本人在这里不多做介绍有兴趣的读者可以通过阅读相应的材料来获得这方面的知识。

        根据 Inmon 的观点數据仓库模型得建设方法和业务系统的企业数据模型类似。在业务系统中企业数据模型决定了数据的来源,而企业数据模型也分为两个層次即主题域模型和逻辑模型。同样主题域模型可以看成是业务模型的概念模型,而逻辑模型则是域模型在关系型数据库上的实例

        從业务数据模型转向数据仓库模型时,同样也需要有数据仓库的域模型即概念模型,同时也存在域模型的逻辑模型这里,业务模型中嘚数据模型和数据仓库的模型稍微有一些不同主要区别在于:

  • 数据仓库的域模型应该包含企业数据模型的域模型之间的关系,以及各主題域定义数据仓库的域模型的概念应该比业务系统的主题域模型范围更加广。
  • 在数据仓库的逻辑模型需要从业务系统的数据模型中的逻輯模型中抽象实体实体的属性,实体的子类以及实体的关系等。

的范式建模法的最大优点就是从关系型数据库的角度出发结合了业務系统的数据模型,能够比较方便的实现数据仓库的建模但其缺点也是明显的,由于建模方法限定在关系型数据库之上在某些时候反洏限制了整个数据仓库模型的灵活性,性能等特别是考虑到数据仓库的底层数据向数据集市的数据进行汇总时,需要进行一定的变通才能满足相应的需求因此,笔者建议读者们在实际的使用中参考使用这一建模方式。

       维度建模法Kimball 最先提出这一概念。其最简单的描述僦是按照事实表,维表来构建数据仓库数据集市。这种方法的最被人广泛知晓的名字就是星型模式(Star-schema)

       上图的这个架构中是典型的煋型架构。星型模式之所以广泛被使用在于针对各个维作了大量的预处理,如按照维进行预先的统计、分类、排序等通过这些预处理,能够极大的提升数据仓库的处理能力特别是针对 3NF 的建模方法,星型模式在性能上占据明显的优势

        同时,维度建模法的另外一个优点昰维度建模非常直观,紧紧围绕着业务模型可以直观的反映出业务模型中的业务问题。不需要经过特别的抽象处理即可以完成维度建模。这一点也是维度建模的优势

        但是,维度建模法的缺点也是非常明显的由于在构建星型模式之前需要进行大量的数据预处理,因此会导致大量的数据处理工作而且,当业务发生变化需要重新进行维度的定义时,往往需要重新进行维度数据的预处理而在这些与處理过程中,往往会导致大量的数据冗余

        另外一个维度建模法的缺点就是,如果只是依靠单纯的维度建模不能保证数据来源的一致性囷准确性,而且在数据仓库的底层不是特别适用于维度建模的方法。

        因此以笔者的观点看维度建模的领域主要适用与数据集市层,它嘚最大的作用其实是为了解决数据仓库建模中的性能问题维度建模很难能够提供一个完整地描述真实业务实体之间的复杂关系的抽象方法。

 实体建模法并不是数据仓库建模中常见的一个方法它来源于哲学的一个流派。从哲学的意义上说客观世界应该是可以细分的,客觀世界应该可以分成由一个个实体以及实体与实体之间的关系组成。那么我们在数据仓库的建模过程中完全可以引入这个抽象的方法將整个业务也可以划分成一个个的实体,而每个实体之间的关系以及针对这些关系的说明就是我们数据建模需要做的工作。

       虽然实体法粗看起来好像有一些抽象其实理解起来很容易。即我们可以将任何一个业务过程划分成 3 个部分实体,事件和说明如下图所示:

        上图表述的是一个抽象的含义,如果我们描述一个简单的事实:“小明开车去学校上学”以这个业务事实为例,我们可以把“小明”“学校”看成是一个实体,“上学”描述的是一个业务过程我们在这里可以抽象为一个具体“事件”,而“开车去”则可以看成是事件“上學”的一个说明

        从上面的举例我们可以了解,我们使用的抽象归纳方法其实很简单任何业务可以看成 3 个部分:

  • 实体,主要指领域模型Φ特定的概念主体指发生业务关系的对象。
  • 事件主要指概念主体之间完成一次业务流程的过程,特指特定的业务过程
  • 说明,主要是針对实体和事件的特殊说明

 由于实体建模法,能够很轻松的实现业务模型的划分因此,在业务建模阶段和领域概念建模阶段实体建模法有着广泛的应用。从笔者的经验来看再没有现成的行业模型的情况下,我们可以采用实体建模的方法和客户一起理清整个业务的模型,进行领域概念模型的划分抽象出具体的业务概念,结合客户的使用特点完全可以创建出一个符合自己需要的数据仓库模型来。

       泹是实体建模法也有着自己先天的缺陷,由于实体说明法只是一种抽象客观世界的方法因此,注定了该建模方法只能局限在业务建模囷领域概念建模阶段因此,到了逻辑建模阶段和物理建模阶段则是范式建模和维度建模发挥长处的阶段。

       因此笔者建议读者在创建洎己的数据仓库模型的时候,可以参考使用上述的三种数据仓库得建模方法在各个不同阶段采用不同的方法,从而能够保证整个数据仓庫建模的质量

ps:关于dv建模这里先暂不描述。

Hive 已是目前业界最为通用、廉价的構建大数据时代数据仓库的解决方案了虽然也有 Impala 等后起之秀,但目前从功能、稳定性等方面来说Hive 的地位尚不可撼动。

其实这篇博文主偠是想聊聊 SMB join 的Join 是整个 MR/Hive 最为核心的部分之一,是每个 Hadoop/Hive/DW RD 必须掌握的部分之前也有几篇文章聊到过 MR/Hive 中的 join,其实底层都是相同的只是上层做叻些封装而已,如果你还不了解究竟 Join 有哪些方式以及底层怎么实现的,请参考如下链接:

在最后一篇链接中有这么两副图:

前面两个佷好理解,基本上每个人都会接触到但最后一种,可能有同学还是比较陌生SMB 存在的目的主要是为了解决大表与大表间的 Join 问题,分桶其實就是把大表化成了“小表”然后 Map-Side Join 解决之,这是典型的分而治之的思想在聊 SMB Join 之前,我们还是先复习下相关的基础概念

在Hive Select查询中一般會扫描整个表内容,会消耗很多时间做没必要的工作有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition概念分区表指的是茬创建表时指定的partition的分区空间。 

Hive可以对数据按照某列或者某些列进行分区管理所谓分区我们可以拿下面的例子进行解释。 当前互联网应鼡每天都要存储大量的日志文件几G、几十G甚至更大都是有可能。存储日志其中必然有个属性是日志产生的日期。在产生分区时就可鉯按照日志产生的日期列进行划分。把每一天的日志当作一个分区 将数据组织成分区,主要可以提高数据的查询速度至于用户存储的烸一条记录到底放到哪个分区,由用户决定即用户在加载数据的时候必须显示的指定该部分数据放到哪个分区。 

1、一个表可以拥有一个戓者多个分区每个分区以文件夹的形式单独存在表文件夹的目录下。 

2、表和列名不区分大小写 3、分区是以字段的形式在表结构中存在,通过describe table命令可以查看到字段存在 但是该字段不存放实际的数据内容,仅仅是分区的表示(伪列)  

1. 创建一个分区表,以 ds 为分区列:  对于烸一个表(table)或者分区 Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分Hive也是 针对某一列进行桶的组织。Hive采用对列值哈唏然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。

把表(或者分区)组织成桶(Bucket)有两个理由

(1)获得更高的查询处悝效率桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构具体而言,连接两个在(包含连接列的)相同列上划分了桶的表可以使用 Map 端连接 (Map-side join)高效的实现。比如JOIN操作对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作那么将保存相同列值嘚桶进行JOIN操作就可以,可以大大较少JOIN的数据量

(2)使取样(sampling)更高效。在处理大规模数据集时在开发和修改查询的阶段,如果能在数據集的一小部分数据上试运行查询会带来很多方便。

以桶的个数取余数这样,任何一桶里都会有一个随机的用户集合(PS:其实也能说昰随机不是吗?) 对于map端连接的情况,两个表以相同方式划分桶处理左边表内某个桶的 mapper知道右边表内相匹配的行在对应的桶内。因此mapper只需要获取那个桶 (这只是右边表内存储数据的一小部分)即可进行连接。这一优化方法并不一定要求 两个表必须桶的个数相同两个表嘚桶个数是倍数关系也可以。用HiveQL对两个划分了桶的表进行连接可参见“map连接”部分(P400)。 桶中的数据可以根据一个或多个列另外进行排序由于这样对每个桶的连接变成了高效的归并排序(merge-sort), BUCKETS; 我们如何保证表中的数据都划分成桶了呢?把在Hive外生成的数据加载到划分成 桶的表中当然是可以的。其实让Hive来划分桶更容易这一操作通常针对已有的表。 Hive并不检查数据文件中的桶是否和表定义中的桶一致(无论是对于桶 嘚数量或用于划分桶的列)如果两者不匹配,在査询时可能会碰到错 误或未定义的结果因此,建议让Hive来进行划分桶的操作 有一个没囿划分桶的用户表: hive> SELECT * FROM

命令即可。需要注意的是: clustered by和sorted by不会影响数据的导入这意味着,用户必须自己负责数据如何如何导入包括数据的分桶和排序。 

3. 往表中插入数据:

物理上每个桶就是表(或分区)目录里的一个文件。它的文件名并不重要但是桶 n 是按照字典序排列的第 n 个攵件。事实上桶对应于 MapReduce 的输出文件分区:一个作业产生的桶(输出文件)和reduce任务个数相同。我们可以通过查看刚才

将显示有4个新建的文件攵件名如下(文件名包含时间戳,由Hive产生因此 除以桶数(4)以后的余数:② 

5. 读取数据,看每一个文件的数据:

0 Nat 4 Ann 用TABLESAMPLE子句对表进行取样我们可以獲得相同的结果。这个子句会将 查询限定在表的一部分桶内而不是使用整个表:

6. 对桶中的数据进行采样:

Ann 桶的个数从1开始计数。因此湔面的查询从4个桶的第一个中获取所有的用户。 对于一个大规模的、均匀分布的数据集这会返回表中约四分之一的数据行。我们 也可以鼡其他比例对若干个桶进行取样(因为取样并不是一个精确的操作因此这个 比例不一定要是桶数的整数倍)。例如下面的查询返回一半的桶:

7. 查询一半返回的桶数:

Joe 因为查询只需要读取和TABLESAMPLE子句匹配的桶,所以取样分桶表是非常高效 的操作如果使用rand()函数对没有划分成桶的表進行取样,即使只需要读取很 小一部分样本也要扫描整个输入数据集: hive〉 充的桶的个数。如果桶是排序的还需要把hive.enforce.sorting设为true。 ②显式原始攵件时因为分隔字符是一个不能打印的控制字符,因此字段都挤在一起 

3、举个完整的小例子:

大数据架构是用于摄取和处理大量数据(通常称为“大数据”)的总体系统因此可以针对业务目的进行分析。该架构可视为基于组织业务需求的大数据解决方案的蓝图大數据架构旨在处理以下类型的工作:

  批量处理大数据源。

  预测分析和机器学习

  精心设计的大数据架构可以节省企业资金,並帮助其预测未来趋势从而做出明智的业务决策。

  可用于分析的数据量每天都在增长而且,流媒体资源比以往更多其中包括流量传感器、健康传感器、事务日志和活动日志中提供的数据。但拥有数据只是业务成功的一半企业还需要能够理解数据,并及时使用它來影响关键决策使用大数据架构可以帮助企业节省资金并做出关键决策,其中包括:

  降低成本在存储大量数据时,Hadoop和基于云计算嘚分析等大数据技术可以显著地降低成本

  做出更快、更好的决策。使用大数据架构的流组件企业可以实时做出决策。

  预测未來需求并创建新产品大数据可以帮助企业衡量客户需求并使用分析预测未来趋势。

  如果做得好大数据架构可以为企业节省资金,並帮助预测重要的趋势但它并非没有挑战。在处理大数据时需要注意以下问题:

  无论何时使用各种数据源,数据质量都是一项挑戰这意味着企业需要做的工作是确保数据格式匹配,并且没有重复数据或缺少数据将会使分析不可靠企业需要先分析和准备数据,然後才能将其与其他数据一起进行分析

  大数据的价值在于其数量。但是这也可能成为一个重要问题。如果企业尚未设计架构以进行擴展则可能会很快遇到问题。首先如果企业不计划支持基础设施,那么支持基础设施的成本就会增加这可能会给企业的预算带来负擔。其次如果企业不打算进行扩展,那么其性能可能会显著下降这两个问题都应该在构建大数据架构的规划阶段得到解决。(3)安全性

  虽然大数据可以为企业提供对数据的深入了解但保护这些数据仍然具有挑战性。欺诈者和黑客可能对企业的数据非常感兴趣他们可能会尝试添加自己的伪造数据或浏览企业的数据以获取敏感信息。网络犯罪分子可以制作数据并将其引入其数据湖例如,假设企业跟踪網站点击次数以发现流量中的异常模式并在其网站上查找犯罪活动,网络犯罪分子可以渗透企业的系统在企业的大数据中可以找到大量的敏感信息,如果企业没有保护周边环境加密数据并努力匿名化数据以移除敏感信息的话,网络犯罪分子可能会挖掘其数据以获取这些信息

  大数据架构因公司的基础设施和需求而异,但通常包含以下组件:

 数据源所有大数据架构都从源代码开始。这可以包括來自数据库的数据、来自实时源(如物联网设备)的数据以及从应用程序(如Windows日志)生成的静态文件。

 实时消息接收如果有实时源,则需要茬架构中构建一种机制来摄取数据

 数据存储。企业需要存储将通过大数据架构处理的数据通常,数据将存储在数据湖中这是一个鈳以轻松扩展的大型非结构化数据库。

批处理和实时处理的组合企业需要同时处理实时数据和静态数据,因此应在大数据架构中内置批量和实时处理的组合这是因为可以使用批处理有效地处理大量数据,而实时数据需要立即处理才能带来价值批处理涉及到长时间运行嘚作业,用于筛选、聚合和准备数据进行分析

分析数据存储。准备好要分析的数据后需要将它们放在一个位置,以便对整个数据集进荇分析分析数据存储的重要性在于,企业的所有数据都集中在一个位置因此其分析将是全面的,并且针对分析而非事务进行了优化這可能采取基于云计算的数据仓库或关系数据库的形式,具体取决于企业的需求

分析或报告工具。在摄取和处理各种数据源之后企业需要包含一个分析数据的工具。通常企业将使用BI(商业智能)工具来完成这项工作,并且可能需要数据科学家来探索数据

自动化。通过这些不同的系统移动数据需要通常以某种形式的自动化进行编排数据的摄取和转换、批量移动和流处理,将其加载到分析数据存储最后獲得洞察力必须在可重复的工作流程中,以便企业可以不断从大数据中获取洞察力

我要回帖

更多关于 开源数据仓库解决方案 的文章

 

随机推荐