1.2 代表性大数据技术
大数据技术的发展步伐很快,不断有新的技术涌现,这里着重介绍几种目前市场上具有代表性的一些大数据技术,包括Hadoop、Spark、Flink、Beam等。
1.2.1 Hadoop
Hadoop是Apache软件基金会旗下的一个开源分布式计算平台,为用户提供了系统底层细节透明的分布式计算架构。Hadoop是基于Java语言开发的,具有很好的跨平台特性,并且可以部署在廉价的计算机集群中。Hadoop的核心是分布式文件系统(Hadoop Distributed File System,HDFS)和MapReduce。借助于Hadoop,程序员可以轻松地编写分布式并行程序,将其运行在廉价的计算机集群上,完成海量数据的存储与计算。经过多年的发展,Hadoop生态系统不断完善和成熟,目前已经包含多个子项目(见图1-1)。除了核心的HDFS和MapReduce以外,Hadoop生态系统还包括YARN、Zookeeper、HBase、Hive、Pig、Mahout、Sqoop、Flume、Ambari等功能组件。
图1-1 Hadoop生态系统
这里简要介绍一下这些组件的功能,要了解Hadoop的更多细节内容,可以访问本教材官网,学习《大数据技术原理与应用》在线视频的内容。
1. HDFS
Hadoop分布式文件系统HDFS是针对谷歌分布式文件系统(Google File System,GFS)的开源实现,它是Hadoop两大核心组成部分之一,提供了在廉价服务器集群中进行大规模分布式文件存储的能力。HDFS具有很好的容错能力,并且兼容廉价的硬件设备,因此,可以以较低的成本利用现有机器实现大流量和大数据量的读写。
HDFS采用了主从(Master/Slave)结构模型,一个HDFS集群包括一个名称节点和若干个数据节点(见图1-2)。名称节点作为中心服务器,负责管理文件系统的命名空间及客户端对文件的访问。集群中的数据节点一般是一个节点运行一个数据节点进程,负责处理文件系统客户端的读/写请求,在名称节点的统一调度下进行数据块的创建、删除和复制等操作。
图1-2 HDFS的体系结构
用户在使用HDFS时,仍然可以像在普通文件系统中那样,使用文件名去存储和访问文件。实际上,在系统内部,一个文件会被切分成若干个数据块,这些数据块被分布存储到若干个数据节点上。当客户端需要访问一个文件时,首先把文件名发送给名称节点,名称节点根据文件名找到对应的数据块(一个文件可能包括多个数据块),再根据每个数据块信息找到实际存储各个数据块的数据节点的位置,并把数据节点位置发送给客户端,最后,客户端直接访问这些数据节点获取数据。在整个访问过程中,名称节点并不参与数据的传输。这种设计方式,使得一个文件的数据能够在不同的数据节点上实现并发访问,大大提高了数据的访问速度。
2. MapReduce
MapReduce是一种分布式并行编程模型,用于大规模数据集(大于1TB)的并行运算,它将复杂的、运行于大规模集群上的并行计算过程高度抽象到两个函数:Map和Reduce。MapReduce极大方便了分布式编程工作,编程人员在不会分布式并行编程的情况下,也可以很容易将自己的程序运行在分布式系统上,完成海量数据集的计算。
在MapReduce中(见图1-3),一个存储在分布式文件系统中的大规模数据集,会被切分成许多独立的小数据块,这些小数据块可以被多个Map任务并行处理。MapReduce框架会为每个Map任务输入一个数据子集,Map任务生成的结果会继续作为Reduce任务的输入,最终由Reduce任务输出最后结果,并写入分布式文件系统。
图1-3 MapReduce的工作流程
MapReduce设计的一个理念就是“计算向数据靠拢”,而不是“数据向计算靠拢”,因为移动数据需要大量的网络传输开销,尤其是在大规模数据环境下,这种开销尤为惊人,所以,移动计算要比移动数据更加经济。本着这个理念,在一个集群中,只要有可能,MapReduce框架就会将Map程序就近地在HDFS数据所在的节点运行,即将计算节点和存储节点放在一起运行,从而减少了节点间的数据移动开销。
3. YARN
YARN是负责集群资源调度管理的组件。YARN的目标就是实现“一个集群多个框架”,即在一个集群上部署一个统一的资源调度管理框架YARN,在YARN之上可以部署其他各种计算框架(见图1-4),比如MapReduce、Tez、Storm、Giraph、Spark、OpenMPI等,由YARN为这些计算框架提供统一的资源调度管理服务(包括CPU、内存等资源),并且能够根据各种计算框架的负载需求,调整各自占用的资源,实现集群资源共享和资源弹性收缩。通过这种方式,可以实现一个集群上的不同应用负载混搭,有效提高了集群的利用率,同时,不同计算框架可以共享底层存储,在一个集群上集成多个数据集,使用多个计算框架来访问这些数据集,从而避免了数据集跨集群移动,最后,这种部署方式也大大降低了企业运维成本。目前,可以运行在YARN之上的计算框架包括离线批处理框架MapReduce、内存计算框架Spark、流计算框架Storm和DAG计算框架Tez等。和YARN一样提供类似功能的其他资源管理调度框架还包括Mesos、Torca、Corona、Borg等。
图1-4 在YARN上部署各种计算框架
4. HBase
HBase是针对谷歌BigTable的开源实现,是一个高可靠、高性能、面向列、可伸缩的分布式数据库,主要用来存储非结构化和半结构化的松散数据。HBase可以支持超大规模数据存储,它可以通过水平扩展的方式,利用廉价计算机集群处理由超过10亿行元素和数百万列元素组成的数据表。
图1-5描述了Hadoop生态系统中HBase与其他部分的关系。HBase利用MapReduce来处理HBase中的海量数据,实现高性能计算;利用Zookeeper作为协同服务,实现稳定服务和失败恢复;使用HDFS作为高可靠的底层存储,利用廉价集群提供海量数据存储能力,当然,HBase也可以在单机模式下使用,直接使用本地文件系统而不用HDFS作为底层数据存储方式,不过,为了提高数据可靠性和系统的健壮性,发挥HBase处理大量数据等功能,一般都使用HDFS作为HBase的底层数据存储方式。此外,为了方便在HBase上进行数据处理,Sqoop为HBase提供了高效、便捷的RDBMS数据导入功能,Pig和Hive为HBase提供了高层语言支持。
图1-5 Hadoop生态系统中HBase与其他部分的关系
5. Hive
Hive是一个基于Hadoop的数据仓库工具,可以用于对存储在Hadoop文件中的数据集进行数据整理、特殊查询和分析处理。Hive的学习门槛比较低,因为它提供了类似于关系数据库SQL语言的查询语言——HiveQL,可以通过HiveQL语句快速实现简单的MapReduce统计,Hive自身可以自动将HiveQL语句快速转换成MapReduce任务进行运行,而不必开发专门的MapReduce应用程序,因而十分适合数据仓库的统计分析。
6. Flume
Flume是Cloudera公司开发的一个高可用的、高可靠的、分布式的海量日志采集、聚合和传输系统。Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接收方的能力。
7. Sqoop
Sqoop是SQL-to-Hadoop的缩写,主要用来在Hadoop和关系数据库之间交换数据,可以改进数据的互操作性。通过Sqoop,可以方便地将数据从MySQL、Oracle、PostgreSQL等关系数据库中导入Hadoop(比如导入到HDFS、HBase或Hive中),或者将数据从Hadoop导出到关系数据库,使得传统关系数据库和Hadoop之间的数据迁移变得非常方便。
1.2.2 Spark
1. Spark简介
Spark最初诞生于美国加州大学伯克利分校的AMP实验室,是一个可应用于大规模数据处理的快速、通用引擎,如今是Apache软件基金会下的顶级开源项目之一。Spark最初的设计目标是使数据分析更快——不仅运行速度快,也要能快速、容易地编写程序。为了使程序运行更快,Spark提供了内存计算和基于DAG的任务调度执行机制,减少了迭代计算时的I/O开销;而为了使编写程序更为容易,Spark使用简练、优雅的Scala语言编写,基于Scala提供了交互式的编程体验。同时,Spark支持Scala、Java、Python、R等多种编程语言。
Spark的设计遵循“一个软件栈满足不同应用场景”的理念,逐渐形成了一套完整的生态系统,既能够提供内存计算框架,也可以支持SQL即席查询(Spark SQL)、流式计算(Spark Streaming)、机器学习(MLlib)和图计算(GraphX)等。Spark可以部署在资源管理器YARN之上,提供一站式的大数据解决方案。因此,Spark所提供的生态系统同时支持批处理、交互式查询和流数据处理。
2. Spark与Hadoop的对比
Hadoop虽然已成为大数据技术的事实标准,但其本身还存在诸多缺陷,最主要的缺陷是MapReduce计算模型延迟过高,无法胜任实时、快速计算的需求,因而只适用于离线批处理的应用场景。总体而言,Hadoop中的MapReduce计算框架主要存在以下缺点:
• 表达能力有限。计算都必须要转化成Map和Reduce两个操作,但这并不适合所有的情况,难以描述复杂的数据处理过程;
• 磁盘I/O开销大。每次执行时都需要从磁盘读取数据,并且在计算完成后需要将中间结果写入到磁盘中,I/O开销较大;
• 延迟高。一次计算可能需要分解成一系列按顺序执行的MapReduce任务,任务之间的衔接由于涉及I/O开销,会产生较高延迟。而且,在前一个任务执行完成之前,其他任务无法开始,因此,难以胜任复杂、多阶段的计算任务。
Spark在借鉴MapReduce优点的同时,很好地解决了MapReduce所面临的问题。相比于MapReduce,Spark主要具有如下优点:
• Spark的计算模式也属于MapReduce,但不局限于Map和Reduce操作,还提供了多种数据集操作类型,编程模型比MapReduce更灵活;
• Spark提供了内存计算,中间结果直接放到内存中,带来了更高的迭代运算效率;
• Spark基于DAG的任务调度执行机制,要优于MapReduce的迭代执行机制。
如图1-6所示,对比Hadoop MapReduce与Spark的执行流程,可以看到,Spark最大的特点就是将计算数据、中间结果都存储在内存中,大大减少了I/O开销,因而,Spark更适合于迭代运算比较多的数据挖掘与机器学习运算。
图1-6 Hadoop MapReduce与Spark的执行流程对比
使用Hadoop MapReduce进行迭代计算非常耗资源,因为每次迭代都需要从磁盘中写入、读取中间数据,I/O开销大。而Spark将数据载入内存后,之后的迭代计算都可以直接使用内存中的中间结果作运算,避免了从磁盘中频繁读取数据。如图1-7所示,Hadoop与Spark在执行逻辑斯蒂回归(Logistic Regression)时所需的时间相差巨大。
图1-7 Hadoop与Spark执行逻辑斯蒂回归的时间对比
在实际进行开发时,使用Hadoop需要编写不少相对底层的代码,不够高效。相对而言,Spark提供了多种高层次、简洁的API,通常情况下,对于实现相同功能的应用程序,Spark的代码量要比Hadoop少很多。更重要的是,Spark提供了实时交互式编程反馈,可以方便地验证、调整算法。
近年来,大数据机器学习和数据挖掘的并行化算法研究,成为大数据领域一个较为重要的研究热点。在Spark崛起之前,学术界和业界普遍关注的是Hadoop平台上的并行化算法设计。但是,MapReduce的网络和磁盘读写开销大,难以高效地实现需要大量迭代计算的机器学习并行化算法。因此,近年来国内外的研究重点开始转向到如何在Spark平台上实现各种机器学习和数据挖掘的并行化算法设计。为了方便一般应用领域的数据分析人员,使用熟悉的R语言在Spark平台上完成数据分析,Spark提供了一个称为Spark R的编程接口,使得一般应用领域的数据分析人员,可以在R语言的环境里方便地使用Spark的并行化编程接口和强大计算能力。
3. Spark与Hadoop的统一部署
Spark正以其结构一体化、功能多元化的优势,逐渐成为当今大数据领域最热门的大数据计算平台。目前,越来越多的企业放弃MapReduce,转而使用Spark开发企业应用。但是,需要指出的是,Spark作为计算框架,只是取代了Hadoop生态系统中的计算框架MapReduce,而Hadoop中的其他组件依然在企业大数据系统中发挥着重要的作用。比如,企业依然需要依赖Hadoop分布式文件系统HDFS和分布式数据库HBase,来实现不同类型数据的存储和管理,并借助于YARN实现集群资源的管理和调度。因此,在许多企业实际应用中,Hadoop和Spark的统一部署是一种比较现实合理的选择。由于MapReduce、Storm和Spark等,都可以运行在资源管理框架YARN之上,因此,可以在YARN之上统一部署各个计算框架(见图1-8)。这些不同的计算框架统一运行在YARN中,具有以下几个优点:
• 计算资源按需伸缩;
• 不用负载应用混搭,集群利用率高;
• 共享底层存储,避免数据跨集群迁移。
图1-8 Hadoop和Spark的统一部署
1.2.3 Flink
Flink是Apache软件基金会的顶级项目之一,是一个针对流数据和批数据的分布式计算框架,设计思想主要来源于Hadoop、MPP数据库、流计算系统等。Flink主要是由Java代码实现的,目前主要还是依靠开源社区的贡献而发展。Flink所要处理的主要场景是流数据,批数据只是流数据的一个特例而已,也就是说,Flink会把所有任务当成流来处理。Flink可以支持本地的快速迭代以及一些环形的迭代任务。
Flink以层级式系统形式组建其软件栈(见图1-9),不同层的栈建立在其下层基础上。具体而言,Flink的典型特性如下:
• 提供了面向流处理的DataStream API和面向批处理的DataSet API。DataSet API支持Java、Scala和Python,DataStream API支持Java和Scala;
• 提供了多种候选部署方案,比如本地模式(Local)、集群模式(Cluster)和云模式(Cloud)。对于集群模式而言,可以采用独立模式(Standalone)或者YARN;
• 提供了一些类库,包括Table(处理逻辑表查询)、FlinkML(机器学习)、Gelly(图像处理)和CEP(复杂事件处理);
• 提供了较好的Hadoop兼容性,不仅可以支持YARN,还可以支持HDFS、HBase等数据源。
图1-9 Flink架构图
Flink和Spark一样,都是基于内存的计算框架,因此,都可以获得较好的实时计算性能。当全部运行在Hadoop YARN之上时,Flink的性能甚至还要略好于Spark,因为,Flink支持增量迭代,具有对迭代进行自动优化的功能。Flink和Spark都支持流计算,二者的区别在于,Flink是一行一行地处理数据,而Spark是基于RDD的小批量处理,所以,Spark在流式处理方面,不可避免地会增加一些延时,实时性没有Flink好。Flink的流计算性能和Storm差不多,可以支持毫秒级的响应,而Spark则只能支持秒级响应。总体而言,Flink和Spark都是非常优秀的基于内存的分布式计算框架,但是,Spark的市场影响力和社区活跃度明显超过Flink,这在一定程度上限制了Flink的发展空间。
1.2.4 Beam
Beam是由谷歌贡献的Apache顶级项目,是一个开源的统一的编程模型,开发者可以使用Beam SDK来创建数据处理管道,然后,这些程序可以在任何支持的执行引擎上运行,比如运行在Spark、Flink上。如图1-10所示,终端用户用Beam来实现自己所需的流计算功能,使用的终端语言可能是Python、Java等,Beam为每种语言提供了一个对应的SDK,用户可以使用相应的SDK创建数据处理管道,用户写出的程序可以被运行在各个Runner上,每个Runner都实现了从Beam管道到平台功能的映射。通过这种方式,Beam使用一套高层抽象的API屏蔽了多种计算引擎的区别,开发者只需要编写一套代码就可以运行在不同的计算引擎之上。
图1-10 Beam使用一套高层抽象的API屏蔽多种计算引擎的区别
Beam是2017年发布的Apache项目,由于诞生时间较短,目前市场接受度有限,尚未形成广泛影响力,是否能够最终获得市场认可,还有待时间的检验。