【翻译笔记】Hadoop分布式文件系统

摘要

Hadoop分布式文件系统(HDFS)设计用来可靠的存储超大数据集,同时以高速带宽将数据集传输给用户应用。html

在一个超大集群中,数以千计的服务器直接接触存储器和执行用户应用任务。经过许多服务器的分布式存储和计算,资源随需求增加的时候仍然能够保持经济性。node

咱们解释了HDFS架构,同时介绍了咱们在雅虎使用HDFS去管理25PB企业数据的经验。web

一、介绍和相关工做

Hadoop一个重要特色是将数据和计算能力划分为小部分,经过许多(数千)主机运行,这些主机并行计算获得他们的结果。一个Hadoop集群经过简单增长商用服务器的数量来扩展其计算能力,存储能力和IO带宽。apache

1.一、与其余分布式系统的异同点

相同点编程

HDFS分别存储文件系统元数据和应用程序数据。与在其余分布式文件系统中相同,好比PVFS2】【14】,Lustre7】和GFS5】【8】,缓存

HDFS在一个专门的服务器存储元数据,这个服务器被称为名称节点。应用程序数据存储在其余被称为数据结点的服务器上。服务器

不一样点网络

HDFS中的数据节点并不使用数据保护机制好比RAID(独立磁盘冗余阵列),以确保数据持久性。多线程

相反。好比GFS,其文件内容在多个数据节点是重复的以确保可靠性架构

这个策略不只仅能够确保数据持久性,还有额外的优势:数据变形带宽加倍,并且本地计算的时候服务器有更多机会靠近所须要的数据。

1.二、Mark(本文虽是论文笔记,但此处仍是乱入一些有助于理解的内容

资料

【1】Hadoop快速入门(http://hadoop.apache.org/docs/r1.0.4/cn/quickstart.html

【2】Hadoop分布式文件系统:架构和设计(http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_design.html

【3】从Hadoop框架与MapReduce模式中谈海量数据处理(含淘宝技术架构)

备注

一、这篇文档目的是帮助你快速完成单机上的Hadoop安装与使用以便你对

Hadoop分布式文件系统(HDFS)和Map-Reduce框架有所体会,好比在HDFS

上运行示例程序或简单做业等。

二、【此文与本文彻底契合

Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity

hardware)上的分布式文件系统。

它和现有的分布式文件系统有不少共同点。但同时,它和其余的分布式文件系

统的区别也是很明显的。

HDFS是一个高度容错性的系统,适合部署在廉价的机器上。HDFS能提供高吞

吐量的数据访问,很是适合大规模数据集上的应用。【与本文相互印证

三、想读懂此文,读者必须先要明确如下几点,以做为阅读后续内容的基础知识储备:

3.1 MapReduce是一种模式。

3.2 Hadoop是一种框架。

3.3 Hadoop是一个实现了mapreduce模式的开源的分布式并行编程框架。

 


因此,你如今,知道了什么是mapreduce,什么是hadoop,以及这二者之间最简单的联系,而本文的主旨便是,一句话归纳:在hadoop的框架上采起mapreduce的模式处理海量数据。下面,我们能够依次深刻学习和了解mapreduce和hadoop这两个东西了。【回顾基础】

Mapreduce模式

mapreduce是一种云计算的核心计算模式,一种分布式运算技术,也是简化的分布式编程模式,它主要用于解决问题的程序开发模型,也是开发人员拆解问题的方法。

以下图所示,mapreduce模式的主要思想是将自动分割要执行的问题(例如程序)拆解成map(映射)和reduce(化简)的方式,流程图以下图1所示:

 在数据被分割后经过Map 函数的程序将数据映射成不一样的区块,分配给计算机机群处理达到分布式运算的效果,在经过Reduce 函数的程序将结果汇整,从而输出开发者须要的结果。

MapReduce致力于解决大规模数据处理的问题,所以在设计之初就考虑了数据的局部性原理,利用局部性原理将整个问题分而治之。

MapReduce集群由普通PC机构成,为无共享式架构。在处理以前,将数据集分布至各个节点。处理时,每一个节点就近读取本地存储的数据处理(map),将处理后的数据进行合并(combine)、排序(shuffle and sort)后再分发(至reduce节点),避免了大量数据的传输,提升了处理效率。【相互印证

无共享式架构的另外一个好处是配合复制(replication)策略,集群能够具备良好的容错性,一部分节点的down机对集群的正常工做不会形成影响。【相互印证

二、架构

2.一、Mark(资料【2】--HDFS架构图解)

Namenode 和 Datanode

HDFS采用master/slave架构。一个HDFS集群是由一个Namenode和必定数目的Datanodes组成。

Namenode是一个中心服务器,负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。

集群中的Datanode通常是一个节点一个,负责管理它所在节点上的存储。

HDFS暴露了文件系统的名字空间,用户可以以文件的形式在上面存储数据。从内部看,一个文件其实被分红一个或多个数据块,这些块存储在一组Datanode上。

Namenode执行文件系统的名字空间操做,好比打开、关闭、重命名文件或目录。它也负责肯定数据块到具体Datanode节点的映射。Datanode负责处理文件系统客户端的读写请求。在Namenode的统一调度下进行数据块的建立、删除和复制。

HDFS 架构

 文件系统的名字空间 (namespace)

HDFS支持传统的层次型文件组织结构。用户或者应用程序能够建立目录,而后将文件保存在这些目录里。文件系统名字空间的层次结构和大多数现有的文件系统相似:用户能够建立、删除、移动或重命名文件。当前,HDFS不支持用户磁盘配额和访问权限控制,也不支持硬连接和软连接。可是HDFS架构并不妨碍实现这些特性。

Namenode负责维护文件系统的名字空间,任何对文件系统名字空间或属性的修改都将被Namenode记录下来。应用程序能够设置HDFS保存的文件的副本数目。文件副本的数目称为文件的副本系数,这个信息也是由Namenode保存的。

【中断了几天没翻译都忘啦,今日发现一个讲的很好的网站(Hadoop学习笔记一  简要介绍)】

文中对上面那张HDFS Architecture的解释:

从上面的图中能够看出,Namenode,Datanode,Client之间的通讯都是创建在TCP/IP的基础之上的。

当Client要执行一个写入的操做的时候,命令不是立刻就发送到Namenode,Client首先在本机上临时文件夹中缓存这些数据,当临时文件夹中的数据块达到了设定的Block的值(默认是64M)时,Client便会通知Namenode,Namenode便响应Client的RPC请求,将文件名插入文件系统层次中而且在Datanode中找到一块存放该数据的block,同时将该Datanode及对应的数据块信息告诉Client,Client便这些本地临时文件夹中的数据块写入指定的数据节点。
      HDFS采起了副本策略,其目的是为了提升系统的可靠性,可用性。HDFS的副本放置策略是三个副本,一个放在本节点上,一个放在同一机架中的另外一个节点上,还有一个副本放在另外一个不一样的机架中的一个节点上。当前版本的hadoop0.12.0中尚未实现,可是正在进行中,相信不久就能够出来了。

&关于MapReduce的内容,建议看看孟岩的这篇MapReduce:The Free Lunch Is Not Over!【又发现一个大牛博客,但不怎么更新了】

2.二、本章归纳

分别介绍7个部分的详情

NameNode、DataNode、HDFS Client、Image与Journal、CheckpointNode、BackupNode和升级文件系统快照zz

2.2.一、NameNode

HDFS名字空间是一个由文件和目录组成的层次性结构。

当HDFS Client想读取文件时,必须与NameNode联系以获取组成该文件的blocks的位置信息,而后选择一个离它最近的DataNode去读取block内容。在写数据时,client向NameNode发送请求,让它指定应该由哪三个DataNodes来保存该block的三个副本。以后客户端就会以pipeline的模式将数据写入到DataNodes。

每个集群有一个独立的NameNode。每一个集群包含数千DataNode和数万HDFS客户端。同时每一个数据节点能够多线程的执行多个应用任务。

HDFS会将整个名字空间保存在内存中。由inode数据及每一个文件包含的全部blocks列表组成的名字系统元数据叫作image。保存在本机本地文件系统中的该image的一个持久化记录称为一个checkpointNameNode也会将称为journal的针对该image的修改日志保存到本机本地文件系统中。为了提升持久性,能够在其余服务器上保存checkpoint和journal的多个副本。

2.2.二、DataNode

DataNode中的每一个block副本由本机本地文件系统中的两个文件组成。第一个文件包含数据自己,第二个文件是该block的元数据包括该block数据的校验和及该block的世代戳(generation stamp)。

在每一个DataNode启动时,它会链接到NameNode执行一个握手。握手的目的是为了验证名字空间ID及DataNode的软件版本。若是其中只要有一个没法与NameNode匹配,那么DataNode会自动关闭。……名字空间ID是在文件系统建立时分配给它的实例编号。……容许一个新初始化的而且没有任何名字空间ID的DataNode加入到集群中,它会接受集群的名字空间ID。……在正常状况下,DataNode会向NameNode发送心跳信息以证明它本身正在运行以及它所持有的block副本是可用的。默认的心跳周期是3秒钟。【很像计算机网络中的内容】……NameNode每秒能够处理数千个心跳请求而不会影响到其余的NameNode操做。

2.2.三、HDFS Client

当一个应用程序读取一个文件时,HDFS client首先向NameNode询问持有组成该文件的blocks的DataNodes列表。而后直接联系某个DataNode请求对于它所须要的block的传输。当client进行写的时候,它会首先让NameNode选定持有该文件的第一个block的那些DataNodes。客户端会把这些节点组织成一个pipeline,而后发送数据。当第一个block写出后,客户端会继续请求选定持有下一个block的新的DataNodes。新的pipeline会被创建起来,客户端开始发送该文件后面的那些数据。每次选定的DataNodes多是不一样的。

一个HDFS客户端经过向NameNode传输path建立一个新文件。对于该文件的每一个block,NameNode返回持有它的副本的那些DataNodes列表。客户端而后将数据经过pipeline的形式传送给选定的DataNodes,DataNodes最终会再联系NameNode对block各副本的建立状况进行确认。

2.2.四、Image与Journal

名字空间image是表明应用数据的目录和文件组织方式的文件系统元数据。写入到磁盘中的image的持久化记录称为checkpoint{!image在内存中,checkpoint则是在磁盘中}。

2.2.五、CheckpointNode

HDFS中的NameNode,除了能够担任客户端请求服务者这一首要角色外,还能够担任其余的一些角色好比CheckpointNode或者是BackupNode。节点能够在启动时设置它的角色。

CheckpointNode会周期性地合并现有的checkpoint和journal,建立一个新的checkpoint和一个空的journal。CheckpointNode一般运行在与NameNode不一样的一个节点上,由于它须要与NameNode等同的内存空间。它会从NameNode下载当前的checkpoint和journal文件,而后在本地对它们进行合并,而后将新的checkpoint返回给NameNode。

2.2.六、BackupNode

BackupNode是HDFS最近引入的一个feature。与CheckpointNode相似,BackupNode可以建立周期性的checkpoints,可是除此以外它还在内存中维护了一个文件系统名字空间的最新映像,该映像会一直与NameNode状态保持同步。

2.2.七、升级,文件系统快照

在软件升级期间,由软件bug或者人为失误致使的系统崩溃几率会上升。在HDFS中建立快照的目的是为了最小化系统升级期间对存储的数据的潜在威胁。

三、文件I/O操做和复制管理

3.一、文件读操做与写操做

若是没有错误发生,块的构建就会通过像图2那样的三个阶段。图2展现了一个具备三个DataNodes的流水线及5个pakctes的block。图中,粗线表明了数据包,虚线表明了确认消息,细线表明了用于创建和关闭流水线的控制消息。竖线表明了客户端及3个DataNodes的活动,时间流向是自上而下的。

从t0到t1是流水线创建阶段,t1到t2是数据流阶段,t1表明了第一个数据包被发送的时间点,t2表明了针对最后一个数据包的确认信息的接收时间点。在这里,在第二个包传输时有一个hflush操做。hflush操做标识是与数据打包在一块的,而不是独立的一个操做。最后,t2到t3是针对该block的pipeline关闭阶段。

3.二、Block放置

对于一个大规模集群来讲,将全部节点用一种扁平的拓扑结构链接起来或许是不实际的。更经常使用的作法是经过多用机柜来布置全部结点。机柜内的全部节点共享一个交换机,机柜之间的交换则是经过一个或者多个核心交换机。不一样机柜的两个节点的通讯会通过多用交换机。大多数状况下,同一个机柜的节点之间网络带宽比不一样机柜的两节点之间网络带宽要高。图3解释了一个有两个机柜的集群,每一个机柜包含三个结点。

 

3.三、副本管理

···

3.四、平衡者

3.五、block扫描

3.六、下线

3.七、跨集群数据拷贝

四、在雅虎中的实践

 Yahoo!从2004年开始基于分布式文件系统的MapReduce的相关研究。Apache Hadoop项目在2006年成立。在那年年末,Yahoo!已经将Hadoop投入到内部使用,同时有一个用于开发的300个节点的集群。从那时起,HDFS已经成为Yahoo!后台架构的不可或缺的一部分。

五、展望

···

占位