数据仓库和数据库非常相似,两者都是通过基于数据模型的数据库软件来组织和管理数据。然而,数据库更侧重于业务事务处理(OLTP)和数据分析数据仓库(OLAP)。
在大数据的建立与应用中,数据库模型有很大的不同。数据仓库强调数据分析的效率、复杂查询的速度、数据之间的相关性分析,因此数据仓库喜欢在数据库模型中使用多维模型来提高数据分析的效率。在产品实现级别,数据仓库倾向于使用列存储,诸如BO和Brio这样的专业软件公司也在线分析和处理工具的前端市场占有一席之地。
(一)数据仓库的基本结构
数据仓库用于构建面向分析的集成数据环境,为企业提供决策支持。事实上,数据仓库本身并不“生成”任何数据,也不需要“消耗”任何数据。数据来自外部,对外部应用程序开放。因此,数据仓库的基本结构主要包括数据的输入和流出过程,可以分为源数据、数据仓库、数据应用三层。
(二)数据仓库的实现步骤
1.确定用户需求
根据终端用户的需求,对存储在数据仓库中的数据进行建模。通过数据模型,可以得到完整、清晰的企业描述信息。该数据模型是面向主题的,同时为多个面向应用的数据源的集成提供了统一的标准。数据仓库的数据模型一般包括企业的每个主题域、主题域之间的关系、描述主题的代码和属性组。
2.设计和建立数据库
设计和构建数据库是成功创建数据仓库的关键步骤,因为所涉及的数据来自各种数据源,并被合并到一个单一的逻辑模型中。与OLTP系统不同,OLTP系统以高度规范化的形式存储数据,数据仓库以非正式的形式存储数据,以提高查询性能。数据仓库通常使用星型和雪花模式来存储数据,作为OLAP工具管理的聚合基础,以便尽快响应复杂的查询。
星型通过使用包含主题的事实表和包含不规则事实描述的多维表来执行典型的决策支持。一旦创建了事实表,就可以使用OLAP工具预先计算常用的访问信息。星型模式是一种关系型数据库结构,在模式的中间是一个事实表,包围着一个辅助表,数据在事实表中维护,维度数据在维度表中维护。每个维度表都通过关键字直接与事实表相关联。维度是组织数据仓库的分类信息,如时间、地理位置、组织等。维度用于层次结构,如父层和子层。例如,地理位置维度可以包含国家、城市等数据。因此,在这个维度表中,维度由所有国家、所有城市组成。
为了支持这种层次结构,有必要在维度表中包含每个成员与高维度之间的关系。维度关键字是查询中心事实表数据的唯一标识符。维度关键字(与主键一样)将维度表连接到事实表中。该结构可以方便地构造复杂的查询语句,支持决策支持挖掘分析。事实表包含描述业务特定事件的数据,如银行或产品销售。事实表还包含所有数据总数,例如每个区域的每月销售额。通常,不允许修改事实表中的数据,只需添加新数据。维度表包含用于引用事实表中存储的数据,例如产品描述、客户名称和地址、供应商信息等。将特征信息与特定事件分离,可以减少事实表中扫描的数据量,从而提高查询性能。维度表包含的数据不像事实表那样多,维度数据可以更改,例如客户的地址或电话号码。
通过减少需要从磁盘读取的数据量,星型设计有助于提高查询性能。通过分析较小维度表中的数据,查询获取维度键,从而可以在中心事实表中对其进行索引,从而减少扫描数据行。
当将OLTP数据库模式转换为星型模式时,所涉及的步骤如下:
(1)确定事实表和维度表;
(2)设计概况介绍;
(3)设计尺寸表;
(4)实现数据库设计。
3.提取和加载数据
从操作系统中提取数据并将其加载到数据仓库中,这随着复杂性的变化而变化。如果数据源中的数据与将出现在数据仓库中的数据直接关联,则处理过程很简单。这个过程也可能很复杂,例如,来自数据源的数据驻留在多个异构系统中,在加载数据之前需要进行大量的格式化和修改。
(1)核实数据
在从OLTP系统中提取数据之前,必须确保数据是完全有效的,并由业务分析师确定数据源是否有效。对数据的任何更改都应在操作系统中更改,而不是在数据仓库中更改。验证数据耗费时间,并通过编写存储过程来检查数据的域完整性,从而实现过程的自动化。然而,手工验证数据也是必要的。如果发现无效数据,则应尽一切努力查找错误的原因并加以纠正。
(2)迁移数据
从操作系统迁移数据通常是通过在将数据复制到数据仓库之前将数据复制到中间数据库来完成的。如果需要净化数据,就必须将数据复制到中间数据库中。请注意,应该在OLTP系统的低活动级别上复制数据,否则它将降低系统性能。此外,如果数据仓库由来自多个相关业务系统的数据组成,则确保在系统同步时发生数据迁移。如果操作系统不同步,数据仓库中的数据可能会导致意外错误。
(3)数据净化
数据净化是为了使数据一致。在多个操作系统中可能存在相同的数据,例如一个名为acompany的公司,它可以编写为ACO、A、acompany等。如果这些名称不一致,则在查询时将该公司视为多个不同的公司。如果数据仓库中的数据生成一致的信息,则公司名称必须完全相同。
(4)转换数据
在数据迁移过程中,为了适应数据仓库的设计,往往需要将业务数据转换成单独的格式。例如,将所有字母字符转换为大写字母。
(三)分布式数据仓库Hive
Hive是一个基于Hadoop的数据仓库基础设施。它为提取、转换和加载(ETL)提供了一系列工具。它是一种在Hadoop中存储、查询和分析大型数据的机制。Hive定义了一个名为HQL的简单SQL类,它允许熟悉SQL的用户查询数据。该语言还允许熟悉Map Reduce的开发人员开发自定义映射器和还原器,以处理内置映射器和还原器无法完成的复杂分析。
1.用户界面
有三个主要的用户界面:CLI、Client和WUI。其中最常见的是CLI、CLI同时启动一个Hive副本。客户端是Hive的客户端,用户连接到Hive Server。启动客户端模式时,需要指示Hive Server所在的节点,并在该节点启动Hive Server。WUI通过浏览器访问Hive。
2.数据存储
Hive将元数据存储在数据库中,如My SQU、Derby。Hive中的元数据包括表的名称、表及其属性的列和分区、表的属性(表是否外部表等)、表数据所在的目录等等。
3.解释器、编译器和优化器
解释器、编译器和优化器从词法分析、语法分析、编译、优化和查询规划等方面完成HQL语句的生成。生成的轮询计划存储在HDFS中,然后由Map Reduce调用执行。
4.Hadoop
Hive的数据存储在HDFS中,大多数查询由Map Reduce完成(包括*查询,如select*From tbl不生成Map Reduce任务)。
(四)数据仓库的SQL分析
大数据产业已经掌握了收集和记录大量数据的能力,但基于这些数据的基本预测和决策仍然是一个挑战,这就要求使用简单、易用的数据分析工具进行数据分析。Apache Hive是一种大数据分析工具。利用SQL对分布式存储系统进行大规模数据的查找和写入,有助于数据仓库中数据的查找和更新。
下面由执行Hive的DDL操作语句和SQL操作语句描述特定的数据仓库操作。
1.DDL(数据定义language)方案
数据定义语言用于定义具体的数据表,包括创建、修改、删除表等操作。
首先创建hive表:
hive>CREATE TABLE pokes(foo INT,bar STRING);
该语句创建了一个hive表pokes,该表包括两列,分别是整型的foo列和string类型的bar列。
hive>CREA TETABLE invites(foo INT,bar STRING)PARTITIONED BY(ds STRING);
该语句创建一个hive表invites,该表包括两列,分别是整型的foo列和string类型的bar列,以及一个分区列,即类型为string的ds列。其中分区列是一个虚拟的列,并不是数据本身。(www.xing528.com)
hive>SHOW TABLES;
该语句列出所有的表。
hive>SHOW TABLES1.*s*;
该语句列出所有表的名字以“s”结尾的表。模式匹配遵循Java的正确表达式规则
hive>DESCRIBE invites;
该语句显示表invites中的所有列信息。
hive>ALTER TABLE events RENAME TO 3koobecaf;
该语句修改表events的名字为3koobecaf。
2.SQI.查询操作
Hive SQL查询操作语句用于分析具体的数据仓库中的表数据内容。
(1)SELECT语句和过滤操作
hive>SELECTa.foo FROM invites a WHEREa.ds=‘2008-08-15’;
该语句表示从表invites中输出所有行分区为“2008-08-15”的列信息。査询结果信息输出到终端console。
(2)INSERT语句操作
hive>INSERT OVERWRITE DIHECT0RY/tmp/hdfs_out’SELECTa.FROM invites aWHEREa.ds=2008-08-15;
该语句表示从表invites中选择分区为“2008-08-15”的所有列信息并同时写入HDFS目录“/tmp/hdfs_out”中。
(五)ALICloud Max Compute数据仓库案例
下面是如何构建一个Max Compute数据仓库,来构建一个Web站点的大量日志的例子。
首先,使用Fluemd服务(类似的服务还包括Kafka、LogHUb、DataX等)收集这些日志,这样可以轻松地创建任务,以便按时读取每个服务器上的日志文件。用户只需配置服务器上日志的路径,Fluemd就可以将日志存储在Max-Compute的Table Store中。
创建的Table Store表需要根据Fluentd定义的字段编写。默认的四个字段如下:
(1)内容表示日志内容;
(2)DS代表天空,由Fluentd自动生成;
(3)HH为1小时,由Fluentd自动生成;
(4)mm表示分钟,由Fluentd自动生成。
可以看到,只有真正受控制的内容和字段是由Fluentd自动生成的。Max Compute本身提供了Fluentd的所有功能接口,调用接口很简单,但是配置环境很复杂。如果业务需要对数据进行深入分析和挖掘,用户将不得不自己配置环境。
分区必须考虑这一点,因为Max Compute查询最多只能显示5000条数据,因此无法通过开发套件(DataIDE)在线检查大量数据。您还需要使用分区字段在本地导出数据,并且分区越大,可以导出的数据就越多,因此正确设置分区非常重要。
然后通过Max Compute数据中心服务(DHS,俗称数据中心服务)上传数据。
数据中心服务提供SDK,但Java支持通过SDK进行实时上传。由于数据中心服务接口不需要创建Max Compute任务(Task),所以它非常快速,并为具有更高QPS(Query Per Second)和更大吞吐量的服务提供数据存储支持。数据中心上的数据只能存储7天,然后删除并保存到Max Compute的表中,最后再删除。当然,也可以调用接口来异步地将数据中心中的数据同步到Max Compute的表中。
如果服务本身直接使用SDK(而非Java服务),则在成本之间存在权衡。
在实际项目中使用Max Compute有四种常见方案。
(1)使用Fluentd上传数据。适用于简单的数据存储。
(2)利用PyODPS上传数据。它适用于更复杂的数据存储。
(3)使用Fluentd和PyODPS上传数据。它适用于需要对数据进行大量分析的场景。
(4)利用数据中心上传数据。它适用于需要实时同步数据的业务场景。
让我们以PyODPS为例,说明如何将数据传递给Max Compute Table。
1.封装Max Compute连接
这使得用户可以随时、随地使用Max Compute的功能,只要在代码中调用“ODPS=()dpsConnect().GetIntense()”即可。
2.创建Max Compute Table
创建Max Compute Table,存储大量日志。
以下是需要特别注意的几点。
(1)Max Compute表只支持添加数据,不支持删除和修改数据。如果要删除脏数据,只能先将整个表备份到B,然后删除表A,创建新的表A,最后在处理表B的备份信息后重新导入表A。
(2)分区信息可以创建很多次,但是在导入、导出和执行一些特殊查询时应该随身携带。例如,如果分区字段为“a/B/C/d”,则在最终导出数据时必须指定“a/B/C/d”的内容。只指定“AGB”或“A.C”不是这种情况。所以用户在设置分区字段时要谨慎,要设置的尽可能少,这种通过电量来设置的数据,建议每个分区存储约20 000块数据。
(3)描述:大量日志文件通过程序存储在服务器上。该文件名则每天按日期生成。
这里有两件事要注意。
(1)Max Compute应该是面向数据的,首先要进行分区、存储数据、下载数据,以在数据操作之前设置分区。
(2)在Nginx中获得的IP参数可以伪造,不能直接使用。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。