文章链接
Hadoop 是什么
Apache Hadoop是用 Java写的开源,可扩展、而且容错的数据处理框架。
- Hadoop 可以在普通硬件集群上高效处理大量数据集,
- Hadoop 不仅是一个存储系统,而且也是大数据的处理平台。
Hadoop 是来自 ASF(Apache Software Foundation)的开源工具,Hadoop 的源代码大部分来自 Yahoo、IBM、Facebook、Cloudera。Hadoop 为在多个集群节点上运行任务提供了高效的框架,它在多台机器上同时并行处理数据的能力。
Hadoop的思想源于 Google,Google 曾发表过两篇关于MapReduce编程模型和文件系统 GSF 的论文,这是这两篇论文成为 Hadoop 的思想源泉。Hadoop最初用于 Nutch 搜索引擎项目,该项目有Doug Cutting 带头开发,因此Doug Cutting也被称为Hadoop之父。之后不久,由于Hadoop越来越受欢迎,就变成了顶级项目。
Hadoop 与 Java 的关系
Hadoop是用 Java 写的一个开源框架,Java 是 Hadoop 基础开发语言,但这不妨碍你使用其他语言进行编码,包括 C、 C++、 Perl、 Python、ruby 等。但是使用Java语言将可以控制到 Hadoop 框架的最底层。
Hadoop 关键模块
Hadoop包含三个关键模块:
- Hadoop Distributed File System (HDFS):Hadoop 存储层
- Map-Reduce:Hadoop 的数据处理层
- YARN:Hadoop 资源管理层
Hadoop 特性
Hadoop 除了具有可缩放(我们可以动态添加更多节点),容错性(如果其中的一些节点宕掉,其他节点可以继续处理宕掉节点上的数据)之外,还有如下重要特征使其成为独一无二的大数据平台:
- 灵活存储各种类型的数据,包括结构化,半结构化甚至非结构数据。
- 擅长处理复杂数据。天生可缩放的架构可以在很多节点间均衡工作负载。Hadoop 文件系统消除了ETL(Extract、Transform、load 是将业务系统的数据经过抽取、清洗转换之后加载到数据仓库的过程)瓶颈。
- 扩展起来更经济。Hadoop 运行在普通硬件之上,成本较低,Hadoop 软件本身是开源的,不受一些供应商制约。
Hadoop 架构
Hadoop 如今已经成为非常流行的解决方案。Hadoop 在设计之初就考虑了各种问题,包括容错、处理大数据集、数据本地化、不同硬件和软件平台间的可移植性等等。在本节,我们将详细介绍Hadoop 架构。我们也会看到 Hadoop 架构图,方便我们更好地理解它。

主从模式
Hadoop工作在主从(Master – Slave)风格下,就是一个 Master 节点有 n 个 Slave 节点,而这个Slave 节点可能是100个。Master 节点管理、维护和监控Slave 节点,Slave 节点完成实际工作。在Hadoop 架构中,Master 节点可能需要部署在一个更高级配置的硬件上,而不是普通硬件。Slave 节点存储实际数据而Master 节点仅持有元数据,也就是存储关于数据的数据。下图就是一个Hadoop集群:

主节点存储元数据,而从节点存储实际数据。在集群中数据是分布式存储的。客户端可以连接到主节点执行任何任务。Hadoop包含3个主要的层,它们是:
- HDFS(Hadoop Distributed File System,Hadoop分布式文件系统)
- YARN
- MapReduce
HDFS
HDFS(Hadoop Distributed File System),Hadoop 分布式文件系统。它为 Hadoop 提供数据存储能力。HDFS 将数据切分成更小的单元(称为 Block 块),并且以分布式的方式进行存储。它有两个进程运行。一个在主节点上叫 NameNode,另外一个在从节点上叫 DataNode。
NameNode 和 DataNode
HDFS 具有主从架构。NameNode 进程运行在 Master 服务器上。它负责命名空间的管理以及控制客户端的文件访问。DataNode 进程运行在 Slave 节点。它负责存储实际的业务数据。在系统内部,文件被分割成一定数量的数据块,并且存储到一组 Slave 节点机器中。NameNode 管理文件系统命名空间的修改,一些类似打开、关闭和重命名文件和目录的行为。NameNode 也跟踪数据块到 DataNode的映射。DataNode 完成文件系统客户端请求的读写服务。DataNode 也响应 NameNode 的需求完成数据块的创建、删除和复制工作。

Java是 HDFS 的原生语言,因此,可以在装有 Java 环境的机器上部署 DataNode 和 NameNode。在典型的部署环境中,一个机器运行 NameNode,集群中的其他节点运行DataNode。NameNode 包含像数据块在 DataNode 上位置的元数据,并且在当 DataNode节点发生资源竞争时进行仲裁。
HDFS的数据块
数据块时计算机上的最小存储单元。它是为文件开辟的最小的连续存储。在 Hadoop 中,默认的数据块大小是128MB 或者 256MB。

你应该谨慎选择数据块大小。让我们拿一个 700MB 大小的文件做例子来解释这个问题。如果你的数据块大小是 128MB,那么 HDFS 会将这个文件分成 6 个数据块。5 个 128MB 的数据块和一个 60MB的数据块。如果数据块设置为 4KB 大小会发生怎样的情形呢?我们将有大量的数据块。这样,就意味着我们要建立大量的元数据,这对 NameNode 来说将是一个负担。因此,我们必须谨慎地决定 HDFS数据块的大小。
复制管理
为了提供容错性,HDFS 使用了复制技术。它建立几份数据块拷贝,并在不同的DataNode 间进行存储。复制因子决定了数据块的拷贝数量。复制因子的默认值是 3,当然你也可以配置成其他值。

上图描述了复制技术的工作情形。假设我们有一个 1GB 的文件,由于复制因子是 3,那么它实际需要 3GB 的存储空间。为了维持复制因子,NameNode 会从每个 DataNode 中收集数据块报告。只要一个数据块的数量低于或者高于复制因子,NameNode 就会添加或者删除相应的拷贝。
机架感知
一个机架会包含很多个 DataNode 机器,并且一个产品环境也会包含很多个这样的机架。HDFS 遵循机架感知算法在分布式环境中复制数据块。机架感知算法提供了低延迟和容错性。假设复制因子设置为 3,那么,机架感知算法会将第一份数据块放到本地机架上,会将另外 2 份拷贝放到一个不同的机架上。如果可能,在同一个机架上不会存储超过2个数据块。
MapReduce
MapReduce 是一个编程模型。该模型的设计目标就是能够并行处理海量数据,把这些数据的处理工作拆分成无依赖的任务集。MapReduce可以说是 Hadoop 的心脏,它将计算向数据迁移,如果相反,移动海量数据则是非常耗费成本的问题。该编程模型支持 Hadoop 集群中进行成百上千个服务节点的缩放。
Hadoop MapReduce 是运行在存储数据集节点的集群上,提供分布式处理海量数据的框架。由于数据在 HDFS 以分布式的形式存储,因此,它提供了 Map-Reduce 的方式来执行并行处理。
YARN
YARN-Yet Another Resource Negotiator(另一种资源协调者)是 Hadoop 的资源管理层。在多节点集群中,管理、定位、释放资源(CPU,内存,磁盘)变得异常复杂。Hadoop Yarn可以非常高效地管理这些资源。从任何应用程序过来的请求它均能从容应付。
在 Master 节点中,运行 YARN 的 ResourceManager 进程,而在slave节点中则运行NodeManager 进程。
Hadoop 进程
进程是运行在后台的服务程序,在Hadoop中通常维护着4个进程:
- NameNode:运行 Mater 节点负责HDFS任务
- DataNode:运行在 Slave 节点负责HDFS任务
- ResourceManager:运行 Master 节点,负责 Yarn 任务
- NodeManager:运行在 Slave 节点,负责 Yarn 任务

这 4 个进程完成 Hadoop 的功能,另外还有一些完成辅助功能的进程,比如:SecondaryNameNode、Standby NameNode、Job HistoryServer 等等。
Hadoop 工作流程
我们简述一下Hadoop工作过程:
- 将输入数据默认切分成 128MB 大小的数据块,然后复制到不同的节点。
- 一旦文件的所有数据块存储在 DataNode 上之后,用户就可以处理这些数据了。
- 接下来,Master 节点开始调度各节点上的程序执行用户提交的计算任务。
- 一旦所有节点完成数据处理则将结果写回 HDFS。
Hadoop 特性
Apache Hadoop 是最受欢迎也是最强大的大数据工具,它为我们提供了最可靠的持久层 ——HDFS,批处理引擎 MapReduce 以及资源管理层 YARN。本节我们将讨论 Hadoop 的重要特性。
开源
Apache Hadoop 是一个开源项目,这就意味着你可以根据你的业务需求修改你的代码。
分布式处理
由于数据以分布式的方式存储在集群的 HDFS 中,数据可以在集群节点间做到并行处理。
容错
这是 Hadoop 的一个非常重要的特性。在 Hadoop 集群中,每个数据块默认可以存储 3 份,而且你可以按照你的需求进行调整。如果任何节点发生故障,可以非常轻松地从其他节点上恢复此该节点上的数据。框架能够自动恢复节点故障或任务,这就是 Hadoop 的容错机制。
可靠性
由于在集群中存在数据的复制,即使机器故障,数据也会可靠存储。如果你的机器挂掉了,你的数据仍旧在 Hadoop 集群中可靠存储。
高可用
数据是高可用的,即使硬件出现故障,由于在集群中存在多份数据的拷贝,因此数据仍旧可以访问。如果机器或者硬件崩溃,数据也可以通过其他路径进行访问。
可扩展
Hadoop 具有很高的扩展性,因此,可以很容易向节点中添加新硬件。该特性也使 Hadoop 具有水平扩展的能力,也就是说可以在不停机的情况下动态地向集群中添加新的节点。
经济
由于 Hadoop 可以运行在普通硬件下,因此不需要昂贵的成本来建立集群。我们也不需要特殊的计算机。Hadoop 可以为我们节约大量的成本,你可以非常容易地按需添加更多节点。如果需求增长,你可以在不停机的情况下增加节点,而不需要事先进行周详的计划。
易用
不需要客户端去处理分布式计算,框架会为你做所有事情,因此 Hadoop 是非常易用的。
计算靠近数据
这是 Hadoop 独到之处, 是 Hadoop 可以轻松处理大数据。Hadoop 采取数据本地处理的原则,让计算靠近数据,而不是数据靠近计算。当一个客户端提交一个 MapReduce 算法,算法将在集群数据处执行,而不是将数据带到算法提交的位置然后进行处理。
Hadoop 设计原则
Hadoop的这些特性使它有别于其他数据管理系统。在学习如何使用Hadoop之前,我们有必要了解Hadoop的假设条件。
Hadoop 假设
Hadoop考虑了大型计算集群的情况,并假设如下情形:
- 硬件可能会故障(因为使用的是普通硬件)
- 分批处理数据,因此重点是大吞吐量而不是低延迟
- 运行在 HDFS 上的应用程序拥有大数据集。在 HDFS 中,典型的文件大小从 GB 到 TB。
- 数据需要一次写入多次读取
- 移动计算比移动数据更廉价
如何实现移动计算?
- 将待处理的数据存储在服务器集群的所有服务器上,主要使用HDFS分布式文件存储系统,将文件分成很多块(BLOCK),以块为单位将数据存储在集群的服务器上。
- 大数据引擎根据集群服务器不同的计算能力,在每台服务器上启动若干分布式任务执行进程,这些进程会等待引擎给他们分配执行任务。
- 使用大数据计算框架支持的模型进行编程,比如 Hadoop 的 MR 编程模型,或者 Spark 的RDD 编程模型。应用程序编写好以后将其打包。MapReduce 和 Spark 都是在 Java 环境中运行的,所以打包出来时是一个 jar 包。
- 用 Hadoop 或这 Spark 的启动命令执行这个应用程序的 jar 包。首先执行引擎会解析程序要处理的数据的输入路径。根据数据量的大小,将数据分成若干片(Split),每个数据片都分配一个任务执行进程去处理。
- 任务执行进程收到分配的任务后,检查自己是否有任务对应的程序包,如果没有就去下载,下载以后通过反射的方式加载程序。
- 加载程序后,任务执行程序根据分配的数据片的文件地址和数据在文件内的偏移量读取数据,并将数据输入给应用程序从而实现分布式服务器集群中的移动计算程序。
Hadoop 设计原则
1、系统应该自我管理而且自我修复
- 完全自动地绕过故障(容错机制)
- 能够侦测效率低下的节点,有预见性地冗余执行一些任务。
2、性能可以线性缩放
- 能够根据资源的改变动态收缩其处理能力(可缩放)
3、计算向数据移动
- 低延迟,低带宽(数据本地化)
4、代码简单,模块化而且可扩展(经济)