大数据采集、预处理与可视化(微课版)
上QQ阅读APP看书,第一时间看更新

1.3 大数据系统简介

大数据行业经过最近几年的跨越式发展,产生了一系列与之相关的核心技术,形成了目前极为著名的Hadoop和Spark等大数据系统,这些系统的不断成熟和完善,促进了大数据时代的不断进步。

1.3.1 Hadoop生态系统

Hadoop是Apache软件基金会旗下的一款开源分布式计算平台,能够以可靠、高效、可伸缩的方式对大量数据进行分布式处理。利用Hadoop平台,用户可以在不了解分布式底层细节的情况下,开发分布式程序。Hadoop具有以下特性。

(1)高可靠性。Hadoop采用按位存储和处理数据的技术,能自动维护数据的多份副本,即使一份副本发生故障,其他副本也能够保证对外正常地提供服务。

(2)高可扩展性。Hadoop是在廉价、可用的计算机集群间分配数据并完成计算任务的,这些集群可以方便地扩展到数以千计的计算机节点中。

(3)高效性。Hadoop能够在节点之间动态地移动数据,并保证各个节点的动态平衡,因此处理速度非常快。

(4)高容错性。Hadoop采用冗余数据存储方式,能够自动保存数据的多份副本,保证在任务失败后能自动地重新部署计算任务。

(5)低成本。Hadoop采用廉价的计算机集群,成本比较低。普通用户也可以用个人计算机来搭建Hadoop运行环境。

(6)运行在Linux平台上。Hadoop是基于Java语言开发的,运行在Linux操作系统上。

(7)支持多种编程语言。Hadoop上的应用程序除了可以用Java语言编写,也可以使用其他语言编写,如C++等。

随着Hadoop生态系统的不断发展和完善,目前其已经包含了多个子项目,除了核心的HDFS和MapReduce之外,还包括YARN、HBase、Hive、Pig、Mahout、Sqoop、Flume、Ambari等,如图1-4所示。

图1-4 Hadoop生态系统

1.HDFS

Hadoop分布式文件系统(Hadoop Distributed File System,HDFS)用于控制管理每个计算机本地文件系统,从而构建一个逻辑上整体化的分布式文件系统,以此来提供可以扩展的分布式存储能力。HDFS支持流数据读取和处理超大规模文件,并能够运行在由廉价的普通计算机组成的集群上。

2.YARN

资源管理系统YARN(Yet Another Resource Negotiator)是一种新的Hadoop资源管理器,它是一个通用资源管理系统,可为上层应用提供统一的资源管理和调度。YARN的基本思想是将MapReduce中JobTracker的“资源管理”和“作业调度/监控”这两个功能分离,主要方法是创建一个全局的资源管理者和若干个针对应用程序的应用程序管理员。资源管理者控制整个集群并管理应用程序对基础计算资源的分配。应用程序管理员负责协调来自资源管理者的资源,并管理在YARN内运行的应用程序的每个实例。YARN的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处。

3.MapReduce

分布式并行计算框架MapReduce是一种处理海量数据的并行编程模型和计算框架,用于大规模数据集(通常大于1 TB)的并行运算。MapReduce的核心思想可以用“分而治之”来描述,主要包括Map和Reduce两项操作。Map负责“分”,即把复杂的任务分解为若干个“简单的任务”来处理,Reduce负责对Map阶段的结果进行汇总。一个大的MapReduce作业,首先会被拆分成许多个Map任务在多台机器上并行执行,每个Map任务通常运行在数据存储的节点上,这样,计算和数据就可以放在一起运行,不需要额外的数据传输开销。当Map任务结束后,会生成以<key,value>形式表示的许多中间结果。然后,这些中间结果会被分发到多个Reduce任务那里,Reduce任务会对中间结果进行汇总计算得到最后结果,并将其输出到分布式文件系统中。

4.HBase

分布式数据库HBase(Hadoop Database)是一个分布式的、面向列的开源数据库,一般采用HDFS作为其底层数据存储系统。HBase是针对BigTable的开源实现。HBase不同于一般的关系数据库,它在Hadoop之上提供了类似于BigTable的能力,是一个适合非结构化数据存储的数据库。HBase与传统关系数据库的重要区别在于:它是基于列的而不是基于行的存储模式。

5.Tez

分布式计算引擎Tez采用DAG(Directed Acyclic Graph,有向无环图)来组织MapReduce任务。它的核心思想是将Map任务和Reduce任务进一步拆分,再将若干小任务灵活重组,形成一个大的DAG作业,在数据处理过程中没有频繁地向HDFS写数据,直接向后继节点输出结果,从而提升了效率。

6.Hive

Hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转换和加载。它是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。Hive数据仓库工具提供了类似于关系数据库的结构化查询语言—HiveQL,能将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,并能将SQL语句转变成MapReduce任务来执行。

7.Pig

数据流处理工具Pig是一种数据流语言和运行环境,其采用类SQL的语法操作HDFS中的数据。Pig的脚本叫Pig Latin,它的语言类似于Shell脚本,可以嵌入Hadoop的Java程序中,从而实现简化代码的功能。同时,Pig也是一个数据分析引擎,它相当于一个翻译器,将Pig Latin语句翻译成MapReduce程序。Pig Latin语句是一种用于处理大规模数据的脚本语言,可完成排序(Order By)、过滤(Filter)、求和(Sum)、分组(Group By)、关联(Join)等操作,并且支持自定义函数。Pig的运行方式有Grunt Shell方式、脚本方式和嵌入式方式。

8.Mahout

数据挖掘算法库Mahout是Apache软件基金会旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便、快捷地创建智能应用程序。Mahout包含许多实现,如聚类、分类、推荐过滤、关联规则挖掘等。此外,通过使用Hadoop库,Mahout可以有效地扩展到云计算环境中。

9.Oozie

工作流调度系统Oozie是一个基于工作流引擎的开源框架,它能够提供对Pig和MapReduce的任务调度与协调。Oozie需要部署到Java Servlet容器中运行。Oozie集成了Hadoop的很多框架,如Java MapReduce、Streaming MapReduce、Pig、Hive、Sqoop等。一个Oozie Job也是一个MapReduce程序,是只有Map任务的程序,具有分布式可扩展的特性。

10.ZooKeeper

分布式协作服务ZooKeeper是一个开源的分布式应用程序协调服务,是Hadoop和HBase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括配置维护、域名服务、分布式同步、组服务等。ZooKeeper的目标是封装好复杂、易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。ZooKeeper提供了Java和C的接口,很容易编程接入。

11.Flume

日志收集工具Flume是一种高可用、高可靠、分布式、开源的海量日志采集、聚合和传输系统。Flume支持在日志系统中定制各类数据发送方,用于收集数据。同时,Flume将数据从产生、传输、处理并最终写入目标的过程抽象为数据流,在具体的数据流中,数据源支持在Flume中定制数据发送方,从而支持收集各种不同协议的数据。

12.Sqoop

数据库ETL (Extract Transformation Load,抽取、转换、加载)工具Sqoop是SQL-to-Hadoop的缩写,是用于在Hadoop与传统的关系数据库(如MySQL、Oracle、PostgreSQL等)之间进行数据传递的开源工具,可以将一个关系数据库中的数据导入Hadoop的HDFS中,也可以将HDFS的数据导出到关系数据库中。Sqoop是专门为大数据集设计的,支持增量更新,可以将新记录添加到最近一次导出的数据源中。

13.Ambari

安装部署工具Ambari是一种基于Web的配置管理工具,支持Hadoop集群的供应、管理和监控。Ambari已支持大多数Hadoop组件,包括HDFS、MapReduce、Hive、Pig、HBase、ZooKeeper、Sqoop等。此外,Ambari能够安装安全的(基于Kerberos)Hadoop集群,实现了对Hadoop安全的支持,提供了基于角色的用户认证、授权和审计功能,并为用户管理集成了LDAP(Lightweight Directory Access Protocol,轻量目录访问协议)和活动目录(Active Directory)。

除了上述这些组件,Hadoop还提供了Mesos(分布式资源管理器)、MLlib(机器学习库)、Kafka(分布式消息队列)等组件。

1.3.2 Spark生态系统

Apache Spark是专为大规模数据处理而设计的快速通用的分布式计算引擎。Spark是美国加州大学伯克利分校AMP实验室开发的类Hadoop MapReduce的通用并行计算框架。Spark拥有Hadoop MapReduce所具有的优点,但不同于MapReduce的是:Spark的中间输出结果可以保存在内存中,不再需要读写HDFS。因此,Spark能更好地用于数据挖掘与机器学习等需要迭代MapReduce的应用。

Spark是借鉴了MapReduce的实现发展而来的,继承了其分布式并行计算的优点,并改进了其对数据集频繁读写操作的缺点。Spark是用Scala语言实现的,它将Scala用作其应用程序框架。与Hadoop不同,Spark和Scala能够紧密集成,Scala可以像操作本地集合对象一样轻松地操作分布式数据集。Spark是对Hadoop的补充,通过Mesos的第三方集群框架,Spark可以在Hadoop文件系统中并行运行。Spark具有以下特点。

(1)速度快。与Hadoop的MapReduce相比,Spark基于内存的运算比Hadoop快100倍以上,而基于磁盘的运算也要快10倍以上。Spark实现了高效的DAG执行引擎,可以通过基于内存来高效地处理数据流。

(2)易用性。Spark支持Java、Python和Scala的API(Application Program Interface,应用程序接口),还提供了80多种高级算法,使用户可以快速构建不同的应用。此外,Spark支持交互式的Python和Scala的Shell,可以非常方便地在这些Shell中使用Spark集群来验证解决问题的方法,而不是像以前一样,需要打包、上传集群、验证等操作。

(3)通用性。Spark提供了大量的库,可用于批处理、交互式查询、实时流处理、机器学习和图计算等。开发者可在同一个应用程序中无缝组合使用这些库。

(4)可融合性。Spark除了其自带的独立集群管理器,还能够方便地与其他开源产品进行融合。例如,Spark可以使用Hadoop YARN以及Apache Mesos作为它的资源管理和调度器,并且可以处理所有Hadoop支持的数据,包括HDFS、HBase等。这对于已经部署Hadoop集群的用户特别重要,因为不需要做任何数据迁移就可以使用Spark强大的处理能力。

Spark的设计目的是快速解决流计算、图计算和机器学习等多种业务场景下的大数据问题,从而为业务发展提供决策支持。Spark的技术框架分为4层,即部署模式、数据存储、Spark核心和四大组件,如图1-5所示。

图1-5 Spark技术框架

1.部署模式

Spark支持多种部署模式,目前主要包括Local模式(本地模式)、Standalone模式(独立模式)、Spark on Mesos模式(Mesos集群模式)、Spark on YARN模式(YARN集群模式)和Cloud模式(云集群模式)。

(1)Local模式是Spark运行在单节点的模式,通常用于本地开发和测试。还分为Local单线程和Local-Cluster多线程两种。

(2)Standalone模式是典型的Master/Slaves模式,自带完整的服务,可单独部署到一个集群中,无须依赖任何其他资源管理系统。该模式是其他模式的基础。目前,Spark借助ZooKeeper,在该模式下完全解决了单点故障问题。

(3)Spark on YARN模式,运行在YARN资源管理器框架之上,与Hadoop进行统一部署,由YARN负责资源管理和调度,Spark负责任务调度和计算,分布式存储则依赖于HDFS。

(4)Spark on Mesos模式,这是很多公司采用的模式,也是官方推荐的模式。目前,Spark运行在Mesos上会比运行在YARN上更加灵活。在Spark on Mesos环境中,用户可选择“粗粒度模式”或“细粒度模式”两种调度模式之一运行自己的应用程序。

(5)Cloud模式,Spark支持多种分布式存储系统,包括HDFS和S3等。该模式可以更好地辅助中小企业使用云服务。

2.数据存储

Spark处理的数据通常被封装为弹性分布式数据集(Resilient Distributed Dataset,RDD),一般存储在内存中。Spark支持多种分布式存储系统,如HDFS、本地文件和HBase等。

Tachyon是以内存为中心的分布式文件系统,拥有高性能和容错能力,能够为集群框架(如Spark、MapReduce)提供可靠的内存级速度的文件共享服务。本质上,Tachyon是分布式的内存文件系统,它在减轻Spark内存压力的同时,也赋予了Spark内存快速读写大量数据的能力。

3.Spark核心

作为Spark生态系统的核心,Spark Core主要提供基于内存计算的功能,不仅包含Hadoop的计算模型MapReduce,还包含其他如reduceByKey、groupByKey、join等API。Spark将数据抽象为弹性分布式数据集,有效扩充了Spark编程模型,使得交互式查询、流处理、机器学习和图计算的应用无缝融合,极大地扩大了Spark的应用业务场景。

4.四大组件

在Spark Core基础上,Spark提供了一系列面向不同应用需求的组件,主要包括Spark SQL、Spark Streaming、MLlib和GraphX。

Spark SQL是操作结构化数据的组件,通过Spark SQL,用户可以使用SQL或者Hive版本的SQL(HQL)来查询多种数据源。Spark SQL支持多种数据源类型,如Hive表、Parquet以及JSON等。Spark SQL不仅为Spark提供了一个SQL接口,还支持开发者将SQL语句融入Spark应用程序的开发过程中。无论是使用Python、Java还是Scala,用户都可以在单个应用中同时进行SQL查询和复杂的数据分析。

Spark Streaming是针对实时数据进行流式计算的组件,允许程序像普通RDD一样处理实时数据。Spark Streaming提供了丰富的处理数据流的API,这些API与Spark Core中的基本操作相对应。从底层设计来看,Spark Streaming支持与Spark Core同级别的容错性、吞吐量和可伸缩性。

MLlib(Machine Learning library,机器学习库)是Spark提供的一个机器学习算法库,包含分类、回归分析、聚类、协同过滤等操作。MLlib还提供了模型评估、数据导入等额外的功能。

GraphX是Spark提供的面向控制图、并行图操作和计算的一组算法和工具的集合。GraphX提出了弹性分布式属性图的概念,并在此基础上实现了图视图与表视图的有机结合与统一。同时,其针对图数据处理提供了丰富的操作,包含提取子图操作、顶点属性操作、边属性操作等。GraphX还实现了与Pregel的结合,可以直接使用一些常用图算法,如三角形计数、PageRank等。

Hadoop与Spark的主要区别如表1-2所示。

表1-2 Hadoop与Spark的主要区别