在大数据应用中,许多技术具有通用性,许多平台具有相似性。面对众多的应用场景,企业从零开始开发大数据应用或者建设大数据平台要面对许多的困难和疑惑。例如,往往目标定义不明确,不知道大数据能解决什么问题,更不知道如何实施平台的搭建。通常的做法是:软件选用较为成熟的、通用的开源分布式技术平台和工具;硬件的选择以满足中近期需求为准,要具备可扩展性、兼容性、稳定性、可伸缩性等特点。
为了更好地理解大数据应用开发方法,顺利实施大数据软件平台的搭建。首先需要理解分布式平台相关工具的基本原理、机制、适用性、扩展性、约束条件及优缺点,从而为后续的二次开发奠定基础。本节只对常用技术做简要介绍,了解其原理,从而增加对大数据平台内部结构的直观感受和理解。
Hadoop是由Apache基金会开发的分布式系统基础架构,实现了一个分布式文件系统HDFS(Hadoop Distributed File System) [10] 。HDFS具有高容错性、高传输率的特点,可以在用户能够接受的、廉价的硬件上部署超大数据集。在非特殊需求的应用中,Hadoop常用作大型集群上分布式应用的基础软件框架,为用户提供透明的分布式程序开发环境。图1.8是Hadoop的一种体系结构,其增加了Sqoop工具。
图1.8 Hadoop框架组成模块
Hadoop框架中核心设计分为:HDFS和MapReduce。HDFS采用主从架构,Java语言实现。在HDFS中,集群由一个Namenode节点负责管理文件的操作及数据节点Datanode。集群文件被分解为若干block,分别存储在不同Datanode节点中,并可以生成block的多个备份。Namenode存储HDFS的元数据(如用户读、写记录),多个Datanode分别部署在不同的机器上。图1.9展示HDFS的架构及读写过程。
图1.9 HDFS的架构及读取操作
MapReduce是一种并行运算编程模型,用于大规模数据集的并行分解和合并计算,用户不必熟悉分布式并行编程就可以在HDFS上运行程序 [10] 。MapReduce依照主从(Master/Slave)模式管理,Master负责调度和管理众多Slave。当任务到来时,Master将任务分解、映射(map)到各个Slave的Worker,分别计算结果,然后通过Reduce woker归约(reduce)、汇总到一起,如图1.10所示。
图1.10 MapReduce架构
第一代MapReduce模型会产生资源消耗,降低速度,不适合规模较大的集群,第二代模型Yarn弥补了MapReduce的缺陷 [11] ,架构如图1.11所示。Yarn用来统一协调分布式系统的资源,包括计算、内存和带宽等,由负责全局资源协调的Resource Manager和负责应用管理的Application Master构成。Resource Manager通过Node Manager管理每个节点的资源使用。用户向集群提交计算任务后,Resource Manager启动一个Application Master,协调各个节点的容器资源参与任务。Application Master监督整个执行过程,直到任务完成,释放容器(Container)资源。
图1.11 Yarn的基本架构
HBase(Hadoop database)是Apache 实现的一个开源的、分布式的、面向列、非关系数据库系统,类似于Gooogle的Big table [12] 。表1.1列出了比较关系。Hadoop由HDFS和MapReduce构成,HDFS是GFS的开源实现。
表1.1 分布式数据库比较
Facebook为Hadoop平台开发了Hive数据仓库应用,后来Apache软件基金会将Hive作为旗下的一个开源项目 [13] 。Hive可以将结构化的文件映射到数据库,提供了类似于SQL语言的HSQL查询功能。其将大多数的SQL语句转换为MapReduce任务运行,从而解决了传统SQL应用程序向Hadoop平台移植的问题。Hive用户包括Facebook、Amazon等。Hive具有传统数据仓库的一些特点,如表1.2所示。
表1.2 Hive的一些特性
最近,Facebook推出了新一代数据查询引擎Presto,可对250PB以上的数据进行快速地交互式分析。由于是在内存中运行,所以效率比Hive高7倍。Hive架构如图1.12所示。Thrift服务器提供了一种适合多语言环境开发的平台。
图1.12 Hive的架构
Spark是加州大学伯克利分校AMP 实验室开发的,类似于Hadoop MapReduce的通用并行计算框架 [14] 。不同点在于Spark将作业的输出和结果保存在内存中,不再需要读写HDFS。这对于数据挖掘与机器学习算法具有更好的适应性。Spark架构如图1.13所示。Spark与Hadoop可以并存,兼容许多集群管理器。
图1.13 Spark的架构
Spark建立在抽象的RDD(Resilient Distributed Datasets)之上,而RDD是一种分布式数据结构,记录了数据分区的信息。RDD包含了迭代算法、关系查询、MapReduce、流处理四种模型,提供对数据集的连接、分组、约简等操作。
Hadoop的优势在于海量数据的批处理,但不擅长流数据的处理。Storm是一个建立在分布式系统之上的可靠的数据流处理系统 [15] 。Storm集群分为主从节点,主节点运行唯一的一个Nimbus守护进程,负责分发代码、分配任务、监控故障。Supervisor运行在工作节点,监控Worker的状态。Zookeeper记录着任务运行状态和心跳。
Sqoop是Apache提供的、基于Java语言的免费开源工具。现代企业一般都会建立以关系数据库为基础的企业管理系统。Sqoop是关系型数据库与分布式数据库之间的桥梁,在Hive或者Hbase上与关系数据库管理系统(RDBMS)之间实现数据自由转换 [16] 。在实现的过程中,Sqoop参考元数据描述,定义Java类描述关系表的结构,并使用此类实现与MapReduce作业的交互,进而实现数据的逐条导入导出。
在分布式系统中,许多客户端向服务器集群提交访问请求,使服务器与客户端、服务器之间的协同工作成为一件繁琐的任务 [17] 。Zookeeper通过paxos算法解决了这个问题,为分布式平台提供了集中化服务,包括配置信息维护、域名服务、分布式同步、组服务。Zookeeper的CS结构如图1.14所示。当客户端请求读取操作时,某个服务器及时响应并反馈结果。当客户端发起写入请求时,接受请求的服务器将消息发送给集群中的Leader服务器,Leader随后将消息传递给其他各个节点服务器。若收到消息的、并且同意写入的服务器数量达到指定数量时,写入系统即可完成。否则,不能完成该操作。
集群中的服务器有三种角色:Leader、Follower、Observer。在初始状态,集群通过paxos算法选举出Leader,Follower连接Leader并确定同步点。Leader通知Follower当前系统已经处于最新状态,Leader可以接受用户请求。Observer服务器扩充集群的性能,也可以接受用户请求,但是不参与Leader主导的投票过程。
图1.14 Zookeeper的服务器/客户端架构
网络平台每天会产生大量的日志数据,当前有多种处理这些数据的开源系统,包括Linkedin公司的Kafka,Facebook公司的Scribe,Apache的Chukwa和Cloudera公司的Flume。这些系统建立了从日志信息到存储系统和分析系统的桥梁,适用于离线和在线数据分析,具有可扩展性、高容错性。日志记录的数据主要有两类:用户的活动痕迹和网站的运营状态。前者包括用户的访问的页面及内容、页面访问量和查询等;后者记录了运行状态的服务器的物理参数。LinkedIn公司开发的发布订阅消息系统——Kafka具有分布式、实时、高吞吐率、可水平扩展等特点 [18] 。目前,Kafka已经集成到许多Hadoop大数据工具之中。
数据仓库是大数据分析的重要组成部分,不仅用于存储相关数据,还提供数据的联机在线分析和关联分析 [19] 。在内容上,数据仓库的主体是数据立方,描述了某些方面的综合情况。在数据立方上可以实现数据的切片、切块、下钻、上卷等操作,从某些维度上观察数据分布、关联情况。数据仓库建立了一种逻辑模型,基本架构如图1.15所示。该架构适合相对静态、更新不频繁的数据。首先,根据元数据的定义,异质、多源的数据经过ETL过程整合到数据仓库中,根据需要构造数据集市。然后,在数据仓库中进行统计分析、数据挖掘产生知识,以可视化界面、报表方式展现给用户,提供用户查询、打印、交互等功能。数据仓库让人们从不同角度观察、聚合数据,研判目标的实际状况、发展趋势、相互联系,还能完成多维分析、报表生成,建立综合查询和可视化交互功能。但是,它不提供复杂的数据挖掘功能,不具备智能决策能力。因此,数据仓库的主题选择非常重要,是经营者关注的重点。
图1.15 数据仓库基本架构
在传统数据仓库中,数据立方通过多维数据模型实现。多维数据分析模型根据主题(如超市用户的购买情况)选择合适的事实表、维度表(如时间)及其各级粒度表(如年或者月)构造而来。目前有三种基本模型:星型模型、雪花型模型、事实星座模型。星型模型以事实表为中心,维度表为分支构成了一个星型的结构。在星型模型的某些维度上继续增加新的维度连接即构成了雪花型模型。事实星座由两个以上事实表为核心的星型模型构成,且事实表具有共享维表。这三种模型同样适用于大数据应用。图1.16描述了一种雪花型模型,描述了工业产品的相关因素。若将“检测指标表”去除,则表示星型模型。
数据仓库研究历史数据,一般不适合实时、动态数据分析。然而,在航空工业领域存在三类典型的数据:历史生产和经营数据、高精度实时数据和多品种小批量数据。具体为:一、历史生产和经营数据。采用传统模型的改进方案设计逻辑模型、多维数据模型。在大数据平台中可以采用SQL数据库或者大数据仓库。二、高精度实时数据。需要构建高效、实时数据仓库框架,定义数据更新策略。由于实时数据量可能很大、传输速率很高,可靠性、稳定性、处理速度会要求很高。有些数据精度高,如发动机监控数据,对数据仓库的管理、备份和数据交换提出了更高的要求。三、多品种小批量数据。在企业生产过程中,社会需求拉动了生产,产生了计划、物料、机加、装配、检验、仓储过程,以及能源管理、员工管理、工具管理、数据管理等环节,每个部分都会产生大量的经营数据。与互联网企业、面向大众的企业不同,航空企业的产品具有批量小、品种多的特点,因而数据的种类、参数多,而数量少的特点。可以建立集成多个数据集市的数据仓库模型,每个数据集市反映了当前环节的分配、汇总、执行、完成等情况,并建立各个数据集市之间的共享、连通机制,以反映各部门之间的协作性、时序性。数据仓库的输入和输出要根据每个环节的需求而定,以便反映物料的管理、生产的进度、工序的安排、质量的检验、故障的排查、人员的需求,以及它们之间的关联性。图1.17展示了一种数据仓库模型。生产的各个过程所产生的数据会记录在各种形式的资料中,主要是在操作型数据库中。集中的数据仓库部署了各个业务环节的数据集市,方便各个部门使用。数据集市之间存在时序关系。经过简单分析后的数据传递给各种应用系统。
图1.16 关于商品生产的雪花型模型
图1.17 工业生产数据仓库基本架构