2.3 大数据平台
主流的大数据平台有大数据批处理平台、大数据采集平台、流数据处理平台、内存计算平台、云计算平台和深度学习平台等。
2.3.1 大数据批处理平台
对于数据处理时间没有较高要求的大数据分析,通常可以采用大数据批处理平台。当前主流的大数据批处理平台是Hadoop。
Hadoop是一个由Apache基金会开发的分布式架构,由多台普通并且廉价的物理机器组合而成,可以对数据进行高效的处理[39]。Hadoop最初的架构设计来自GFS和Map/Reduce计算模型,因此Hadoop由HDFS和Map/Reduce计算模型组成。
(1)Hadoop分布式文件系统(HDFS)是运行在多个物理机器上的一种分布式文件系统。
(2)在分布式架构下,通过Map/Reduce计算模型,可以将多台物理机器联合处理共同的任务。
Hadoop分布式平台架构图如图2.7所示。Hadoop底层通常是由多个物理机器所构成的计算节点(Node);Node的上一层是HDFS,HDFS的主要任务是将每个Node整合到一起;HDFS的上一层是Map/Reduce,Map/Reduce可以把大型的任务分成多个不同的子任务,然后将这些子任务分配到不同的Node中处理;Hadoop的顶层提供了一套完整的分布式编程的接口(API),用户只需要调用API就可以实现相应的功能,无须考虑诸如物理机器宕机,以及各个Node如何协同工作等问题。
图2.7 Hadoop分布式平台架构图
HDFS作为一款开源的文件系统,具备较高容错性,可存储海量的数据,并且成本相对较低等优势。HDFS采用主从(Mater/Slave)结构,通常Mater上只运行一个NameNode,而在每个Slave上运行一个DataNode。HDFS还可以实现传统文件系统的层次结构。例如,可以在文件系统中进行文件创建、删除、复制、剪切和重命名等操作。HDFS的体系结构如图2.8所示。
图2.8 HDFS的体系结构
图2.8中给出了NameNode、DataNode和Client三个关键组成部分。
(1)NameNode负责文件空间的管理、数据的存储和相关参数的配置等。
(2)DataNode是文件存储的基本单元,当在Client和NameNode之间进行数据读写操作时,DataNode负责数据存储和定位的操作,并且定时地把存储列表发送给NameNode。
(3)Client通过NameNode和DataNode访问HDFS,Client提供了相关接口,用户无须知道具体业务流程便可以获取HDFS中的数据。
Map/Reduce是一种并行式的计算模型,Map表示映射操作,Reduce表示归约操作。通过Map()函数,可以把原有的键-值对(Key-Value)转换成新的键-值对;通过Reduce()函数,可以使所有映射的键-值对中的节点都共享相同的键值。
Map/Reduce计算模型的实现原理如图2.9所示。启动任务后,首先把输入的数据分割成为若干个小的数据块(分片,Split),在默认的情况下,数据块的大小是64 MB;然后对这些数据块进行映射操作,即执行Map()函数;接着对映射结果进行排序,并进行归约处理,即执行Reduce()函数;最后将归约的结果输出。每进行一次归约操作就会创建一个分区,这些分区可以由自定义的Partitioner(分区器)进行管理,默认的分区方式是采用Hash()函数形成哈希值来进行分区。在Map/Reduce计算模型中,输入和输出存放在分布式文件中,由HadoopHash管理执行的任务、监控节点的运行,并且使用心跳机制重启失败的任务。
图2.9 Map/Reduce计算模型的实现原理
2.3.2 大数据采集平台
在大数据的生命周期中,数据采集是必不可少的环节。目前,常用的数据采集工具有Apache的Nutch、Cloudera的Flume、Facebook的Scribe等。本节重点介绍Apache的大数据采集平台Nutch。
Nutch是采用Java编写的具有高可扩展性的搜索引擎,基于模块化的设计思想,具有跨平台的优点。利用Hadoop分布式平台,Nutch可以让多台物理机器并行进行数据采集,能满足每秒数百兆字节的采集速度,可保证系统的高性能。Nutch还支持插件开发机制,可以进行相关自定义的操作,完成二次接口的开发和系统的扩展[40]。Nutch为实现基于分布式的数据采集提供了可靠的平台。
Nutch的运行方式有两种:一种是基于分布式的数据采集方式,另一种是基于传统单机的采集方式。本节介绍的是Nutch的第一种运行方式,即在Hadoop分布式平台下多台物理机器并行进行数据采集。在Hadoop分布式平台下,Nutch采用HDFS,通过Hadoop的Map/Reduce计算模型来采集网页中与某个主题相关的数据,可在短时间内采集大量的数据。Nutch与Hadoop的关系如图2.10所示。
图2.10 Nutch与Hadoop的关系
Nutch的工作流程主要涉及两个方面,一方面是网页数据采集(采集模块),另一方面是对采集到的数据进行检索(检索模块),如图2.11所示。
图2.11 Nutch的工作流程
2.3.3 流数据处理平台
在对具有实时性、易失性、突发性、无序性和无限性等特征[41]的流式大数据进行计算时,离线的大数据批处理平台(如Hadoop)就不再适用,流数据处理平台应运而生。流数据处理平台摒弃了传统大数据批处理平台的模式(先存储数据后计算数据的模式),在数据产生初期就进行计算,使用可靠传输模式,不保存中间的计算结果。流数据处理平台不仅广泛应用于对数据分析实时性要求较高的场景,而且不断地融入了实时图像识别、人工智能等技术。目前,典型的流数据处理平台有Storm、Flink、Spark Streaming、Puma和S4等,本节重点介绍Storm。
Storm是一个分布式的、高容错的流数据处理平台。如果将Hadoop的工作机制看成一桶桶地搬运水,那么Storm就好像在已经安装好水管的前提下,只要打开水龙头就可以立即得到水,而且是源源不断的水[42]。
相比于Flink和Spark Streaming,Storm在大数据流式处理方面具有更好的性能;相比于Puma和S4,Storm的商用前景更为广阔。由于新特性的加入、更多库的支持,以及与其他开源项目的无缝融合,使得Storm逐渐成为业界的研究热点,被称为实时处理领域的Hadoop[43]。
Storm实现了一个如图2.12所示的数据流(Data Flow)模型[44],在这个模型中,数据持续不断地流经一个由很多转换实体构成的网络,一个数据流可以被抽象为Stream(流),Stream是无限多Tuple(元组)组成的序列。Tuple可以用标准数据类型(如int、float和byte数组)和用户自定义类型(需要额外的序列化代码)的数据结构来表示。每个Stream有一个唯一的ID,该ID可以用来构建网络拓扑中各个组件的数据源。
图2.12 数据流模型
Spout是Storm中Stream的来源,连接到了数据源(Data Source),将数据转化为一个个Tuple并发送出去。Bolt是流数据处理平台的核心功能,Topology中的所有计算都是在Bolt中实现的。Bolt不仅可以接收并计算Tuple,还可以订阅多个由Spout或者其他Bolt发送的数据流,用以构建复杂的数据流转换网络,该转换网络可以输出一个或者多个流。Topology是对Storm中实时计算逻辑上的封装,也就是说,Topology是由一系列通过数据流相互关联的Spout和Bolt组成的DAG(有向无环图)。
作为一个具有实时处理性能的计算框架,Storm本身具有很多可以满足实时计算的优点,主要的优点如下:
(1)容错性:主节点通过心跳机制来监控各个工作节点的状态,这些状态信息记录在ZooKeeper中,当节点出现故障问题时,可以重新启动。
(2)易用性:Storm的开发相对容易一些,只要按照开发规范就可以轻松地开发出适应性强的应用。Storm采用的简单开发模型,可以降低实时处理的复杂度;另外,Storm还支持多种开发语言,开发者可以采用Java、Python或者Ruby等语言进行开发。
(3)扩展性:依靠并行机制,Storm可以通过增加物理机器来提高运行速度、拓展计算容量。
(4)安全性:Storm采用Acker的机制,保证不会轻易丢失数据包,一旦任务失败就会重新处理。
(5)处理快:Storm采用ZeroMQ(一种轻量级消息内核)来进行通信处理,ZeroMQ具有并发性,可以保证数据处理速度。
2.3.4 内存计算平台
前文从大数据的时效性角度出发,介绍了大数据批处理平台Hadoop、大数据采集平台Nutch和流数据处理平台Storm。本节从大数据的内存计算和高并发角度出发,重点介绍内存计算平台Spark。
Spark是一个开源的分布式数据处理框架[45],最初在2009年由加利福尼亚大学伯克利分校的AMP实验室开发,在2013年捐赠给了Apache基金会,如今已经成为大数据处理领域热度最高的分布式计算平台之一。
近年来,随着开源社区对Spark的不断完善,将Spark和SQL查询分析引擎、流计算、图计算和分布式机器学习库集成在一起可构成综合性数据分析平台,称为BDAS(Berkeley Data Analysis Stack,伯克利数据分析栈)。BDAS的组成结构如图2.13所示[46]。Spark Core是Spark的底层计算引擎;HDFS和Yarn/Mesos不属于Spark,但为Spark提供了数据存储和集群资源调度的功能。
图2.13 BDAS的组成结构
1.Spark作业执行架构
Spark作业执行采用主从式架构,当Spark作业提交到集群中时,集群管理器(Cluster Manager)会在一台物理机器上启动Driver进程,Driver进程负责维护Spark作业的上下文(SparkContext)并对计算任务进行切分,然后向资源调度器申请资源并执行任务。Spark作业执行架构如图2.14所示。
在Driver进程中,首先Spark作业通过Shuffle过程被分成若干阶段(Stage),其次每个Stage被细分成若干个在不同数据上执行相同计算任务的Task,最后Driver进程在申请到的集群资源上启动Executor进程并执行Task。
图2.14 Spark作业执行架构
2.弹性分布式数据集
Spark将数据抽象成弹性分布式数据集(Resilient Distributed Dataset,RDD),并在RDD上定义表达各种计算逻辑的计算算子。从逻辑上来看,RDD可以被看成一个分布式的“数组”对象,这个“数组”按一定的分区策略(默认的是哈希分区)被分成一定数量分区,并散布在整个集群中,Spark可以对各个分区进行细粒度的控制。
在执行Spark任务时,开发者可以利用Cache算子将多次使用的中间计算结果缓存到内存中。在使用这些中间计算结果时,Spark会自动读取内存中缓存的数据,从而避免磁盘I/O的大量时间开销。这种缓存机制使得Spark在数据处理速度方面,比Map/Reduce有10~100倍的提升。
3.有向无环图执行计划
在Spark中,某个RDD和基于该RDD的计算结果之间存在父子关系,这种依赖关系会被Spark记录下来,用于计算的调度和容错。RDD之间的依赖关系分为两种:窄依赖和宽依赖。窄依赖是指父RDD的分区最多被一个子RDD的分区使用,宽依赖是指父RDD的分区可以被多个子RDD的分区使用。窄依赖和宽依赖的示意图如图2.15所示[46]。
图2.15 窄依赖和宽依赖的示意图
由于存在上述的依赖关系,Spark的作业可以看成一个以RDD为节点,以RDD之间的依赖关系为连边的有向无环图(Directed Acyclic Graph,DAG),Spark可以根据这个DAG追踪图中任意RDD的生成过程。
2.3.5 云计算平台
云计算通过互联网联合多台计算机,从而提供协同计算的服务,是一种新兴的网络服务模式[47]。云计算平台利用物理机器构成分布式集群,提供相应的数据存储、计算、软/硬件等服务,可以将用户的任务在不同的物理机器之间进行切换,从而有效提高系统资源的使用效率[48]。云计算的产生使得开发人员无须了解集群底层的实现过程就可以顺利地完成其应用的开发,极大地提高了开发效率。
云计算是利用并行处理技术来解决复杂且规模较大的应用问题的,它将资源看成一种可量化的服务,是虚拟化、并行处理和分布式处理等技术相互结合的产物[49]。云计算技术充分地利用了网络中的节点,实现了资源和服务的共享[50]。典型的云计算平台是OpenStack。云计算平台可部署众多的计算程序,通过虚拟化技术来扩展每个服务器节点的计算能力,对所有的资源进行整合,可提供超强的计算能力和存储能力。云计算平台的架构如图2.16所示。
图2.16 云计算平台的架构
(1)云客户端:作为进入云端的入口,云客户端的作用是与服务器集群进行交互,并为云端提供了交互的显示界面,可以完成资源的管理、服务的申请和服务器集群的部署等功能。
(2)服务目录:用户成功登录云计算平台后,可以得到相应的使用权限,此时云端服务器会自动创建一个供用户使用的目录,用户可以在这个目录中申请或使用相关的服务。
(3)管理系统:管理系统的作用是管理云计算平台中的各个功能模块,例如,为用户完成授权的操作、分配系统所需的资源,以及服务器集群的部署等。
(4)部署工具:部署工具的作用是辅助服务器集群的部署和资源的配置,此外还可以为用户生成相应的服务目录。
(5)资源监控:用于实时地监测云计算平台中不同资源的使用情况,当资源的使用出现问题时,云计算平台能够及时地进行调整,使云计算平台中资源处于负载均衡的状态。
(6)服务器集群:服务器集群是由管理系统的物理机器所搭建的集群,这些物理机器通过互相交换信息构成了一个云网络。服务器集群可以通过管理系统处理数以万计的用户服务请求,是云计算平台中真正负责计算和存储的关键部分。
2.3.6 深度学习平台
近年来,随着深度学习研究热潮的持续高涨,各种开源的深度学习平台也层出不穷,如TensorFlow、Caffe、Keras、CNTK、Torch7、MXNet、Leaf、Theano、DeepLearning4、Lasagne、Neon等,本节重点介绍TensorFlow。
TensorFlow[51]最初由Google的Google Brain Team研究人员和工程师开发,是一个使用数据流图进行数值计算的开源软件库。TensorFlow是由Tensor和Flow两部分组成的:Tensor指各种变量,用Tensor来统一变量是为了适应神经网络的开发,它可以代表变量、常量、占位符、稀疏矩阵,而且变量的维度可以是标量或者高阶矩阵;Flow指数据的流向,实际上就是代表对数据的各类操作,如运算、类型转化等。在TensorFlow中,运算的定义和执行是分开的,Google采用数据流图来形象地描述TensorFlow的运算过程。TensorFlow数据流图的示意图如图2.17所示[52],图中的节点和边描述运算的过程,节点表示相应的数学操作,边表示数据的流向。
图2.17 TensorFlow数据流图的示意图
与其他深度学习平台相比,TensorFlow具有以下优点:
(1)作为Google的重点开发项目,Google在TensorFlow上投入了大量精力和资金,以及技术的维护和支持。此外,TensorFlow形成了一个强大的社区,高涨的社区文化是TensorFlow能够快速迭代、不断完善的重要原因之一。
(2)TensorFlow的工作流程相对容易,API稳定、兼容性好。与Numpy的完美结合,使精通Python的用户可以很容易上手TensorFlow。目前,TensorFlow已经拥有了众多功能非常强大的API,而且API在运行时不需要等待编译。
(3)TensorFlow的设计理念为其带来了极强的灵活性,可以支持各种各样的深度学习模型。另外,TensorFlow也支持移动设备,具有极好的便携性。
(4)自TensorFlow发布以来,其开发团队花费了大量的时间和精力来提升它的效率。TensorFlow中的线性代数编译器,全方位地提升了TensorFlow的计算性能,可以在CPU、GPU、TPU、嵌入式设备等平台上快速完成训练和推理任务。