第3 章 等同于大数据的Hadoop
在本章中,我们为读者们介绍:
Hadoop 的核心理念是什么?
Hadoop 的核心基础框架上包含哪些组件?
Hadoop 的生态系统中还有哪些有用的组件?
Spark 有什么用?
Spark 和Hadoop 系统有什么关联?
Hadoop 可以处理结构化数据,同时也可以很好地处理非结构化或者半结构化数据。在今天,Hadoop 已经成为存储、处理和分析大数据的标准平台。 当人们说要搭建大数据平台时,很多时候默认的就是搭建Hadoop 平台。
本章介绍的是Hadoop 核心系统上的各个组件,以及系统上相关的其他各种组件。由于本书的重点在于Hadoop 技术的实际应用,而不是讲解Hadoop 技术,所以因篇幅关系,我们并不会在本章中描述所有的Hadoop 组件。
在本章的最后,我们会为读者介绍Spark 系统。
3.1 Hadoop 理念
标准的Hadoop 系统存储的数据是NoSQL 模式的。关于NoSQL 模式,我们会在第6章专门讲述。用一句话来说,其实Hadoop 可以存储以下任何类型的内容。
(1) 结构化数据;
(2) 半结构化数据,比如日志文档;
(3) 完全没有结构的内容,比如文本文件;
(4) 二进制内容,比如音频、视频等。
Hadoop 系统有以下特点,如图3-1 所示。
(1) 可靠性高。
(2) 可扩展性好。
(3) 性价比高。
(4) 灵活。
图3-1 Hadoop 系统的特性
3.2 Hadoop 核心基础架构
Hadoop 系统上有很多不同的组件,在本节中我们讨论的是对Hadoop 起到重要作用的核心组件。
3.2.1 Namenode 和Datanode
Namenode 又称为MasterNode,主节点; Datanode 又称为SlaveNode,从属节点。合在一起,Namenode 和Datanode 之间有Master 和Slave 的关系,或者说从属关系①。对于Namenode 和Datanode 节点还有各种不同的说法,比如“管理节点”和“工作节点”等,都说明数据节点是不可以脱离主节点单独存在的。
在Datanode 上,有一个后台的同名进程(Datanode),用以管理数据节点上所有的数据块。通过这个进程,数据节点会定期和主节点通信,汇报本地数据的状况。
在Hadoop 系统进行设计的时候,对数据节点作了以下的假设。
(1) 数据节点主要用来作存储,额外的开销越小越好;
(2) 对于普通的硬盘来说,任何硬盘都可能会失败;
(3) 文件和数据块的任何一个副本都是完全一致的。
因为数据节点上采用的一般是普通硬盘,那么每块硬盘失效的概率大概是每年4%~5%。如果我们的系统上有100 个数据节点,而每一个数据节点都有12 块硬盘,那么平均每周都会需要更换至少一块硬盘。
正是因为这些假设,默认Hadoop 系统上每个文件和数据块都有三个副本,而当中间任何的一个副本出现问题的时候,系统都会把对文件和数据块的访问切换到其他的副本上,并会重新设置使得文件和数据块都保持有三个副本。
对于Hadoop 的用户来说,他们并不需要了解数据存储的细节,也不需要知道文件的各个数据块是存储在哪些数据节点上的,他们只需要对文件进行操作,对应的拆分和多个副本的存储是由系统自动完成的。
和Datanode 一样,Namenode 节点上也有一个同名的后台进程(Namenode),而所有的文件匹配信息则保存在一个名为fsimage 的文件中,所有新的操作修改保存在一个名为edits的文件中。edits 文件中的内容会定期写入fsimage 文件中。
把fsimage 和edits 文件中的信息综合起来,我们就可以知道所有的数据文件和对应的数据块的具体位置,而这些信息都会保存在Namenode 节点的内存中。
主节点和数据节点之间的通信协议如下。
① 在计算机领域,Master 和Slave 是常用的关系词,用来表示主导和跟随的状态。在数据库领域、网络节点上都经常用到。
(1) 每隔3s,数据节点都会发送心跳(heartbeat)信息①给Namenode 节点,所以Namenode永远都会实时知道哪些数据节点是在线的;
(2) 每隔6h,数据节点会发送完整的数据块报告给Namenode,所以Namenode 会知道系统上各个文件和相关数据块的准确位置。
这里的3s 和6h 都可以配置,这两个数值是默认值。
文件和数据存储在数据节点的信息是保存在主节点上的,所以对于众多数据节点来说,主节点就像是一个指挥中心或者地址黄页。换句话说,只有主节点才能准确指引用户对每个文件的访问。
那么Namenode 节点一旦失效该怎么办?我们会在第13 章中专门讨论Namenode 节点的高可用性问题。
最后我们来看一下文件是如何写入系统中的,如图3-2 所示。
图3-2 在Hadoop 系统上创建文件的流程
图3-2 中提到的“合约”是Namenode 上的一个小工具,确保文件和副本能够被安全创建。因为在一个Hadoop 系统上只有Namenode 节点才知道数据文件是如何存储的,所以所有的读请求都是发送给Namenode 节点,由它来进行分配的。