1.3.2 Hadoop生态系统
Hadoop是一个由Apache软件基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序,充分利用集群的威力进行高速运算和存储。Hadoop实现了一个分布式文件系统(Distributed File System),其中一个组件是HDFS。HDFS有高容错的特点,并且用来部署在低廉的(low-cost)硬件上;它提供高吞吐量(high throughput)来访问应用程序的数据,适合有着超大数据集(large data set)的应用程序;HDFS放宽了对POSIX的要求,允许以流的形式访问(streaming access)文件系统中的数据。Hadoop框架最核心的设计是HDFS和MapReduce。HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算。综上所述,Hadoop的特点如下。
1)Hadoop是一个分布式系统基础架构。
2)Hadoop主要解决海量数据的存储和海量数据的分析计算问题。
3)广义上来说,Hadoop通常是指一个更广泛的概念——Hadoop生态系统。
下面简要介绍Hadoop生态系统。经过多年的发展,Hadoop生态系统不断完善,目前已包括多个子项目,除了核心的HDFS和MapReduce外,还包括ZooKeeper、HBase、Hive、Pig、Mahout、Sqoop、Flume、YARN、Oozie、Storm、Kafka、Ambari等功能组件,同时,在面向在线业务时也常加入Spark组件。Hadoop生态系统的组件组成如图1-1所示。
图1-1 Hadoop生态系统
(1)HDFS
Hadoop分布式文件系统(HDFS)是Hadoop项目的两大核心之一,是针对谷歌文件系统(Google-File System, GFS)的开源实现。HDFS具有处理超大数据、流式处理、可以运行在廉价商用服务器上等优点。HDFS在设计之初就是要运行在廉价的大型服务器集群上,因此在设计上就把硬件故障作为一种常态来考虑,可以在部分硬件发生故障的情况下仍然能够保证文件系统的整体可用性和可靠性。
HDFS放宽了一部分POSIX约束,从而实现以流的形式访问文件系统中的数据。HDFS在访问应用程序数据时,具有很高的吞吐率,因此对于超大数据集的应用程序而言,选择HDFS作为底层数据存储是较好的选择。
(2)HBase
HBase类似于关系型数据库,数据放在文件中,而文件放在HDFS中。因此,HBase是基于HDFS的NoSQL数据库,具有延迟低、实时性高的特点。
(3)MapReduce
Hadoop MapReduce是针对谷歌MapReduce的开源实现。MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算,它将复杂的、运行于大规模集群上的并行计算过程高度抽象到了两个函数——Map和Reduce上,并且允许用户在不了解分布式系统底层细节的情况下开发并行应用程序,并将其运行于廉价的计算机集群上,从而完成海量数据的处理。通俗地说,MapReduce的核心思想就是“分而治之”。
(4)Hive
Hive用于分类管理文件和数据,对这些文件和数据可以通过很友好的接口,提供类似于SQL语言的HiveQL查询语言来分析和管理文件与数据。实质上,Hive底层会经历一个转换的过程。执行HiveQL查询语言时,Hive会提供一个引擎,先将其转换成MapReduce再去执行。
Hive使得DBA可以很快地转到大数据的挖掘和分析中去。
(5)Pig
Pig是一种数据流语言和运行环境,适合用在Hadoop和MapReduce平台来查询大型半结构化数据集。虽然MapReduce应用程序的编写不是十分复杂,但也需要一定的开发经验。Pig的出现大大简化了Hadoop常见的工作任务,它在MapReduce的基础上创建了更简单的过程语言抽象,为Hadoop应用程序提供了一种更加接近结构化査询语言的接口。
(6)Mahout
Mahout是Apache软件基金会旗下的一个开源项目,提供了一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序。Mahout包括聚类、分类、推荐过滤、频繁子项挖掘等的实现。此外,通过使用Apache Hadoop库,Mahout可以有效地扩展到云中。
(7)ZooKeeper
ZooKeeper是针对谷歌Chubby的一个开源实现,是高效和可靠的协同工作系统,提供分布式锁之类的基本服务,用于构建分布式应用,减轻分布式应用程序所承担的协调任务。
(8)Flume
Flume是Cloudera提供的一个高可用、高可靠、分布式的海量日志采集、聚合和传输的系统。Flume支持在日志系统中定制各类数据发送方,用于数据收集;同时,还提供对数据进行简单处理并写到各种数据接收方的能力。
(9)Sqoop
Sqoop是SQL to Hadoop的缩写,主要用来在Hadoop和关系数据库之间交换数据。通过Sqoop可以方便地将数据从MySQL、Oracle、PostgreSQL等关系数据库中导入Hadoop(可以导入HDFS、HBase或Hive),或者将数据从Hadoop导出到关系数据库,使得传统关系数据库和Hadoop之间的数据迁移变得非常方便。Sqoop主要通过JDBC(Java Database Connectivity)与关系数据库进行交互,理论上,支持JDBC的关系数据库都可以使Sqoop和Hadoop进行数据交互。Sqoop是专门为大数据集设计的,支持增量更新,可以将新记录添加到最近一次导出的数据源上,或者指定上次修改的时间戳。
(10)Ambari
Apache Ambari是一种基于Web的工具,支持Apache Hadoop集群的安装、部署、配置和管理。Ambari目前已支持大多数Hadoop组件,包括HDFS、MapReduce、Hive、Pig、HBase、ZooKeeper、Sqoop等。
(11)YARN
YARN是集群资源管理系统,对整个集群中每台机器的资源进行管理,对每个服务、每个作业(Job)、每个应用进行调度。
(12)Oozie
Oozie起源于雅虎,主要用于管理、组织Hadoop工作流。Oozie的工作流必须是一个有向无环图(Directed Acyclic Graph, DAG),实际上Oozie就相当于Hadoop的一个客户端,当用户需要执行多个关联的MapReduce任务时,只需将MapReduce执行顺序写入workflow.xml,再使用Oozie提交本次任务,Oozie就会托管此任务流。
(13)Storm
Storm是一个分布式实时大数据处理系统。Storm用于在容错和水平可扩展方法中处理大量数据,是一个流数据框架,具有较高的摄取率。
(14)Kafka
Kafka最初由Linkedin公司开发,是一个分布式、支持分区、多副本、多订阅者、基于ZooKeeper协调的分布式日志系统(也可以当作MQ系统),常可以用于Web/Nginx日志、访问日志、消息服务等。LinkedIn于2010年将其贡献给Apache基金会,Kafka也就成为顶级开源项目。
(15)Spark
Apache Spark是专为大规模数据处理而设计的快速通用的计算引擎。Spark是UC Berkeley AMP lab(加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行计算框架,Spark拥有Hadoop MapReduce的优点;不同的是,Spark中的Job中间输出结果可以保存在内存中,从而不再需要读写HDFS。因此,Spark更适用于数据挖掘与机器学习等需要迭代的MapReduce算法。
Spark是一种与Hadoop相似的开源集群计算环境,但两者还存在一些不同之处,这些有用的不同之处使得Spark在某些工作负载方面表现得更加优越,即Spark启用了内存分布数据集,除了能够提供交互式查询外,还可以优化迭代工作负载。