About Hadoop

前言

我们知道,互联网近十年的数据增长是呈现爆炸增长的。大型互联网公司每天要处理的数据基本上都是TB级,甚至是PB级的。而为了存储处理这样海量的数据,传统的数据存储策略(关系型数据库)便陷入了瓶颈。不管是数据入库还是查询,使用传统的存储策略都设计到上亿条数据的便利查找操作,显然这使相当考验存储设备的性能的,也是相当耗时的。但我们知道,当代互联网是追求实时性、高用户体验的,这样的等待时间显然是不会被 认可的。

另外,在追求计算机性能的解决方案时,也必然意味着这样的计算机事极其昂贵、无法普及的,就像现在的超算中心一样,只能 是属于少数人的,大规模组织的。不利于小公司的发展,同样也不适应当代互联网的发展趋势。

而且,相比于互联网海量数据的增长速度,这样的一台高性能的机器,是否过不久还适合处理这样不断增长数据,还是一个问题呢。

于是,为适应这样的状况,有人就开始设计出了分布式系统,于是,Hadoop就出现了。

目录

1.Hadoop的介绍

2.Hadoop的两大组件

3.Hadoop的实现机制

1.Hadoop的介绍

Hadoop是一个分布式计算开源 软件框架。能在有大量廉价的硬件设备组成的集群上运行应用程序,存储处理海量级别数据。

Hadoop的核心组件有两个,分别是分布式存储、分布式文件管理系统HDFS(Hadoop Distributed File System),还有就是分布式计算框架MapReduce。

其实,Hadoop并不是一个原创的软件。因为在Hadoop之前已经有了很多的分布式框架,比如最著名的是Google的GFS、BigTable、MapReduce,Amason的 AWS、微软的Azure和IBM的蓝云。但是这些软件都是闭源的、商业性的。而这时,Hadoop的创建者Doug Cutting就出现了,应Yahoo!的邀请,他开始在Yahoo!带领团队,开发Apache基金会的顶尖项目Hadoop。应该所Hadoop就是个山寨货,他就是Doug Cutting根据Google的三大论文的思想开发出来的,那个分布式计算框架MapReduce与Google的一模一样,连名字都不带改的。但是这并不妨碍Hadoop成为现如今最有影响力的软件。毕竟,这就是开源的力量。

2.Hadoop的两大组件

2.1 HDFS

  • Namenode:名称节点,hdfs的管理程序。控制存储和IO交换。保存元数据。

  • Secondary NameNode :辅助名称节点。与NomeNode通讯,复制并合并元数据(比如文件命名空间镜像、修改日志),合并为一个文件,并检查文件大小,将就得修改存入本地磁盘,防止文件过大。更新到NameNode之中。这个过程可以简称为“快照”。当NameNode崩溃是,可手动切换成NameNode,代替NameNode完成工作。

  • dataNode:是数据存储节点。

至于HDFS上面的任务管理器,旧版本的有JobTracker、TaskTracker,而2.x版本之后,为了更便于资源管理,Hadoop便使用ResourceManager替代以上组件。但这里还是以旧版本为例吧。

  • JobTracker:运工作监控器。行在主服务器Master节点里面,就近运行。操作切割分配监控task。

以上便是Hadoop的基本存储架构。

HDFS典型的部署是在一个专门的机器 运行NameNode,集群中的其他机器各运行一个DataNode,当然,也可以在运行NameNode的机器上面运行DataNode,或者一个机器运行多个DataNode。一个集群只能有一个NameNode。

NameNode使用事务日志(EditLog)来记录HDFS元数据的变化,使用映射文件(FSImage)存储文件系统的命名空间,包含文件的映射、文件的属性信息等。事务日志和映射文件都存储在NameNode的本地文件系统之中。NameNode启动时,从磁盘中读取映射文件和事务日志,把事务日志的事务都应用到内存中的映射文件上,然后将新的元数据刷新到本地磁盘的新的映射文件上,这样可以截去旧的事务日志,这个过程称为检查点(CheckPoint)。HDFS还设有Secondary NameNode节点,他辅助NameNode处理映射文件和事务日志。NameNode启动的时候合并映射文件和事务日志,而Secondary NameNode周期性的从NameNode复制映射和事务日志到临时目录里面,合并成新的映射文件后再重新上传给NameNode,NameNode更新映射文件并处理事务日志,使得事务日志的大小始终控制在可配置的限度之下。

架构

架构

2.2 MapReduce

M/R就是Hadoop底下的并行计算模型。顾名思义,他就是有Map还有Reduce两个部分组成的 。Map是把一组数据一对一的映射成为另外的一组数据,Reduce是对一组数据进行归约,映射和归约分别有一个函数指定。具体的就交由大家在具体项目开发的时候在体会了,这样效果更佳哦。

3.Hadoop的实现机制

1.机柜意识

通常,大型的HDFS集群跨多个安装点(机柜)排列。一个安装点中的不同节点之间的网络流量通常比跨安装点的网络流量更加的高校。一个NameNode尽量将一个块的多个副本放在多个安装点上以提高容错能力。但是,要平衡容错能力与网络流量的话,HDFS就允许管理员决定一个节点属于哪个安装点,于是,每一个节点就都可以知道它的机柜ID,也就是说,具有了机柜意识。

NameNode可以通过DataNode的机柜ID识别它们的位置。

2.冗余备份

HDFS是一个大集群、跨机器、可靠存储的大型文件系统。每个文件都存储在一个个的数据块之中,默认数据块大小为64MB。同一个文件中除了最后一块以外的所有都是一样大的。文件的数据块通过复制备份来保证容错。当然,文件的数据块的大小和复制因子都是可以进行配置的。

HDFS的文件都是一次性写入的,并且都是严格限制任何时候都是一个写用户。DataNode使用本地文件系统来存储HDFS的数据,但是它对于HDFS的文件是一无所知的,只是使用一个个文件来存储HDFS的数据块。每当DataNode启动的时候,都会先进行一次对于本地文件系统的便利,得到一份关于HDFS数据块与本地额对应关系列表,并把这个列表报告发给NameNode。这表示块报告,块报告包含了DataNode上所有块的列表。

3.副本存放

HDFS集群一般运行在多个机架之上,不同的机架上机器的通信是通过交换机的。通常,机架内节点之间的带宽比跨机架节点之间的带宽大、更快,而这会影响HDFS的可靠性以及性能。而HDFS会通过机架感知(Rack-aware,NameNode可以确定每个机架的所属的ID)来改进平衡数据可靠性。

一般,当复制因子是3的时候,HDFS的数据块备份策略是,将两个副本放在同一个机架的不同节点上,最后一个副本放在另外的一个机架的节点上。这样就可以防止整个机架失效的时候数据丢失。

4.HDFS心跳

因为在这样的大型集群里面,宕机是一种常态。所以,NameNode与DataNode之间的连通性,随时有可能会失效。因此,每个DataNode都会主动向NameNode发送定期心跳信息,如果NameNode没有接收到对应的DataNode的心跳信息,就表明连通性丧失。然后,NameNode会将不能响应心跳信息的DataNode标记为“死DataNode”,并不再向他们发送请求,而存储在该DataNode节点上的数据将不再对那个节点的HDFS客户端可用,该节点将被从系统中有效的移除。如果一个DataNode的死导致数据库的复制因子降到最小值以下,NameNode将会启动附加复制,将复制因子带回正常阶段。

5.安全模式

HDFS启动是时,NameNode会进入一个特殊的模式,安全模式,此时不会出现数据块的复制。NameNode会受到个DataNode的心跳信息以及数据块报告。数据块报告中包含一个DataNode所拥有的数据块列表,每个数据块里面都有指定书目的副本。当某个NameNode登记的数据复制品达到最小数目(<=最小数目)时,数据块会被认为是安全的,安全复制。在一定百分比(可配置)的数据块被NameNode检测确定是安全登记之后,在登记(加上附加的30秒),NameNode会推出安全模式。当检测到副本数不足的数据块时,该数据块会被复制到其他的节点之上,以达到最小副本数。

6.数据完成性检测

从DataNode中获取的数据块可能会是损坏的。为此,HDSF客户端实现了对于HDFS文件内容的校验和检查(Checksum)。在HDFS文件被创建时,会计算每个数据块的检验和,并将检验和作为一个单独的隐藏文件保存在命名空间里面。当获取这个文件后,会检查各个DataNode取出的数据块和相应的校验和进行匹配。如若不匹配,则会选择其他副本的DataNode去数据块。

7.空间回收

当文件被删除是,文件会被移动到/trash目录下,只要还在这个目录之下,文件就可以被快速回复。文件在这个目录里面的时间是可以设置的,超过这个时间,系统就会把它从系统的命名空间之中删除。而文件的删除便会引起相应数据块的释放。

8.元数据磁盘失效

映射文件和事务日志是HDFS的核心数据结构。若果这些文件损坏,将会导致HDFS的不可用。当然,可以设置NameNode支持维护映射文件和事务日志的多个副本,任何映射文件或事务日志的修改都会同步到他的副本上。每次NameNode重启时,都会选择最新的一致性的映射文件和事务日志。

9.快照

快照支持存储某一个时间点的数据复制。利用这一特性可以将损坏的HDFS回滚到以前的某一个正常的时间点。

以上便是最近的一些心得,还请斧正。

作者

yalechen

发布于

2022-07-24

更新于

2022-07-24

许可协议

You need to set install_url to use ShareThis. Please set it in _config.yml.
You forgot to set the business or currency_code for Paypal. Please set it in _config.yml.

评论

You forgot to set the shortname for Disqus. Please set it in _config.yml.
You need to set client_id and slot_id to show this AD unit. Please set it in _config.yml.