HDFS存储系统

  

HDFS存储系统

1、基本概念

一、NameNodehtml

  HDFS采用Master/Slave架构。namenode就是HDFS的Master架构。主要负责HDFS文件系统的管理工做,具体包括:名称空间(namespace)管理(如打开、关闭、重命名文件和目录、映射关系)、文件block管理。NameNode提供的是始终被动接收服务的server。一个文件被分红一个或多个Bolck,这些Block存储在DataNode集合里,NameNode就负责管理文件Block的全部元数据信息。node

  Secondary NameNode主要是定时对NameNode的数据snapshots进行备份,这样可尽可能下降NameNode崩溃以后致使数据丢失的风险。具体就是从namenode中得到fsimage和edits后把二者从新合并发给NameNode,这样,既能减轻NameNode的负担又能安全得备份,一旦HDFS的Master架构失效,就能够借助Secondary NameNode进行数据恢复。linux

  namenode管理着全部全部文件系统的元数据。这些元数据包括名称空间、访问控制信息、文件和Block的映射信息,以及当前Block的位置信息。还管理着系统范围内的活动。正则表达式

二、DataNodeshell

  用于存储并管理元数据。DataNode上存储了数据块ID和数据块内容,以及他们的映射关系。安全

三、客户端服务器

  访问HDFS的程序或HDFS shell命令均可以称为HDFS的客户端,在HDFS的客户端中至少须要指定HDFS集群配置中的NameNode地址以及端口号信息,或者经过配置HDFS的core-site.xml配置文件来指定。网络

2、HDFS的组成和架构

2.1 hdfs架构设计

  HDFS最重要的两个组件为:做为Master的NameNode和做为Slave的DataNode。NameNode负责管理文件系统的命名空间和客户端对文件的访问;DataNode是数据存储节点,全部的这些机器一般都是普通的运行linux的机器,运行着用户级别的服务进程。架构

 

图展现了HDFS的NameNode、DataNode以及客户端的存取访问关系。NameNode负责保存和管理全部的HDFS元数据,于是用户数据不须要经过namenode,也就是说文件数据的读写是直接在datanode上进行的。HDFS存储的文件被分割成固定大小的Block,在建立Block的时候,namenode服务器会给每一个block分配一个惟一不变的block标识。datanode服务器把block以linux文件的造成保存在本地磁盘上,而且根据指定的block标识和字节范围来读写块数据。处于可靠性的考虑,每一个块都会复制到多个datanode上。默认使用三个冗余备份。并发

HDFS客户端代码以库的形式被连接到客户程序中。客户端和namenode交互只获取元数据,全部的数据操做都是由客户端直接和datanode进行交互。

2.2 HDFS读文件数据流

图为HDFS读文件数据流的过程,具体的执行过程为:

  一、调用FileSystem的open()打开文件,见序号1:open

  二、DistributedFileSystem使用RPC调用NameNode,获得文件的数据块元数据信息,并返回FSDataInputStream给客户端,见序号2:get block locations

  三、HDFS客户端调用stream的read()函数开始读取数据,见序号3:read

  四、调用FSDATAInputStream直接从DataNode获取文件数据块,见序号四、5:read

  五、读完文件时,调用FSDATAInputStream的close函数,见序号6:close

2.3 HDFS写文件数据流

读文件时在多个数据块文件中选择一个就能够了,可是写数据文件时须要同时写道多个数据块文件中。

图为HDFS写文件数据流的过程,首先客户端调用create()来建立文件,而后DistributedFileSystem一样使用RPC调用namenode首先肯定文件是否不存在,以及客户端有建立文件的权限,而后建立文件。DistributedFileSystem返回DFSOutputStream,客户端用于写数据。客户端开始写入数据,DFSOutputStream将数据分红块,写入data queue。data queue由data streamer读取,并通知元数据节点分配数据节点,用来存储数据块(每块默认复制3块)。分配的数据节点放在pipeline里。data streamer将数据块写入pipeline中的第一个数据节点。第一个数据节点将数据块发送给第二个数据节点,第二个数据节点将数据发送给第三个数据节点。DFSOutputStream为发出去的数据块保存了ack queue,等待pipeline中的数据节点告知数据已经写入成功。

3、HDFS文件结构

一、namenode的存储目录中包含三个文件:

  edits、fsimage、fstime。都是二进制文件,能够经过Hadoop Writable对象就行序列化。

二、编辑日志(edit log)和文件系统映像(filesystem image)

  当客户端执行写操做时,首先namenode会在编辑日志中写下记录,并在内存中保存一个文件系统元数据,而且不断更新。

  fsimage文件是文件系统元数据的持久性检查点,和编辑日志不一样,它不会再每一个文件系统的写操做后进行更新。可是文件系统会出现编辑日志的不断增加状况。为了解决这个问题,引入了secondary namenode。它的任务就是为原namenode内存中的文件系统元数据产生检查点,是一个辅助namenode处理fsimage和编辑日志的节点,它从namenode中拷贝fsimage和编辑日志到临时目录并按期合并成一个新的fsimage,随后上传至namenode。具体的检查点的处理过程以下:

 

  一、secondary namenode首先请求原namenode进行edits的滚动,这样新的编辑操做就能进入一个新的文件中。

  二、secondary namenode经过http方式读取原namenode中的fsimage及edits。

  三、secondary namenode读取fsimage到内存中,而后执行edits中的每一个操做,并建立一个新的统一的fsimage文件。

  四、secondary namenode将新的fsimage发送到原namenode。

  五、原namenode用新的fsimage替换旧的,旧的edits文件用步骤1中的edits进行替换,同时系统会更新fsimage文件到文件的记录检查点时间。

4、HDFS核心设计

一、block的大小

block的大小是HDFS关键的设计参数之一,默认大小为64MB,选择较大的Block的优势:

  一、减小了客户端和NameNode通讯的需求。

  二、客户端可以对一个块进行屡次操做,这样就能够经过block服务器较长时间的TCP链接来减小网络负载。

  三、减小namenode节点须要保存的元数据的数量,从而很容易把全部元数据放在内存中。

固然选择较大的block也有必定的缺点,当文件太小时,数百个客户端并发请求访问会致使系统局部过载,解决这个问题能够经过自定义更大的HDFS的复制因子来解决。

二、数据复制

  HDFS中,每一个文件存储成block序列,除了最后一个block,全部的block都是一样大小,文件的全部block为了容错都会被冗余复制存储。HDFS中的文件是writer-one,严格要求任什么时候候只能是一个writer。文件的复制会全权交给namenode进行管理,namenode周期性的从集群中的每一个datanode接收心跳包和一个blockreport。心跳包表示该datanode节点正常工做,而blockreport包括了该datanode上全部的block组成的列表。

三、数据副本存放策略

  副本的存放是HDFS可靠性和高性能的关键。HDFS采用一种机架感知的策略来改进数据的可靠性、可用性和网络带宽的利用率。一个简单的没有优化的策略就是将副本存放在不一样的机架上。这样能够有效防止当整个机架失效时数据的丢失,而且容许读取数据的时候充分利用多个机架的带宽。

  HDFS的默认副本系数为3,副本存放策略是将第一个副本存放在本地机架的节点上,将第二个副本放在同一个机架的另外一个节点上,将第三个副本放在不一样的机架的节点上。由于是放在两个机架上,因此减小了读取数据时须要的网络传输总带宽。这样的策略减小了机架之间的数据传输,提升了写操做的效率,机架的错误远比节点的错误要少的多,因此不会影响数据的可靠性和可用性。

四、安全模式

  当系统处于安全模式时,不会接受任何对名称空间的修改,同时也不会对数据块进行复制或删除。namenode启动以后,自动进入安全模式,namenode从全部的datanode接收心跳信号和块状态报告。块状态报告包括了某个datanode全部的数据块列表,每一个数据块都有一个指定的最小副本数。当namenode检测确认某个数据块的副本数目达到这个最小值,该数据块就认为是副本安全的。在必定百分比的数据块被namenode检测确认是安全的以后(加上30s等待时间),namenode将退出安全模式。

1 bin/hadoop dfsadmin -safemode enter //进入安全模式
2 bin/hadoop dfsadmin -safemode leave //退出安全模式
3 bin/hadoop dfsadmin -safemode get //返回安全模式是否开启的信息
4 bin/hadoop dfsadmin -safemode wait //等待一直等到安全模式结束

五、负载均衡

  HDFS很容易出现不平衡情况的问题,同时也会引起其余问题,好比说MapReduce程序没法很好的利用本地计算机的优点,机器之间没法到达更好的网络带宽使用率、机器磁盘没法利用等。HDFS提供了一个工具,用于分析数据块分布和从新均衡DataNode上的数据分布。

$HADOOP_HOME/bin/start-balancer.sh -t 10%

这个命令,-t参数后面的是HDFS达到平衡状态的磁盘使用率误差值。若是机器与机器之间的使用率误差小于10%,那么咱们认为HDFS集群就达到了平衡状态。

  负载均衡程序做为一个独立的进程与namenode进行分开执行,HDFS均衡负载处理工程以下:

  一、负载均衡服务Rebalancing Server从namenode中获取datanode的状况,具体包括每个datanode磁盘使用状况,见序号1:get datanode report

  二、Rebalancing Server计算哪些机器须要将数据移动,哪些机器能够接受移动的数据,以及从datanode中获取须要移动数据的分布状况,见序号2:get partial blockmap

  三、Rebalancing Server计算出来哪一台机器的block移动到另外一台机器中去,见序号3:copy a block

  四、须要移动block的机器将数据移动到目标机器上,同时删除本身机器上的block数据,见序号四、五、6

  五、Rebalancing Server获取本次数据移动的执行结果,并继续执行这个过程,一直到没有数据能够移动或HDFS集群已经达到平衡的标准为止,见序号7

六、升级和回滚机制

  和升级软件同样,能够再集群上升级hadoop,可能升级成功,也可能失败,若是失败了,就用rollback进行回滚;若是过了一段时间,系统运行正常,就能够finalize正式提交此次升级。相关升级和回滚命令以下:

1 bin/hadoop namenode -update //升级
2 bin/hadoop namenode -rollback //回滚
3 bin/hadoop namenode -finalize //提交
4 bin/hadoop namenode -importCheckpoint //从Checkpoint恢复.用于namenode故障

升级过程:

  一、经过dfsadmin -upgradeProgress status检查是否已经存在一个备份,若是存在,则删除。

  二、中止集群并部署Hadoop的新版本

  三、使用-upgrade选项运行新的版本(bin/start-dfs.sh -upgrade)

若是想退回老版本:

  一、中止集群并部署hadoop的老版本。

  二、用回滚选项启动集群,命令以下:bin/start-dfs.sh -rollback

七、HDFS的缺点

  一、访问时延:HDFS的设计主要是用于大吞吐量的数据,是以必定的时延为代价的。

  二、对大量小文件的处理

    大量小文件处理时不免产生大量线程时延。解决办法:利用SequenceFile、MapFile、Har等方式归档小文件。就是把小文件归档管理,HBase就是这种原理。横向扩展。多Master设计。

  三、多用户写,任意文件修改

4、HDFS经常使用命令

一、archive

    用于建立一个hadoop归档文件,hadoop archive是特殊的档案格式。一个hadoop archive对应一个文件系统目录。拓展名是.har。

  1)建立一个archive:使用方法以下:

1 hadoop archive -archiveName NAME -p <parenet path> <src>* <dest>
2 
3 archiveName:指定要建立的档案的名字
4 p:是否建立路径中的各级服目录
5 src:须要归档的源目录,能够含正则表达式
6 dest:保存档案文件的目标目录

 

  例如:须要将目录/usr/work/dir1和/usr/work/dir2归档为work.har,并保存在目标目录/data/search下,命令以下:

bin/hadoop archive -archiveName work.har /usr/work/dir1 /usr/work/dir2 /data/search

  2)查看archive文件

1 查看前面建立的archive的归档文件work.har,须要得到建立的archive中的文件列表,即
2   hadoop dfs -lsr har:///data/search/work.har
3 查看archive中的file1文件的命令以下:
4    hadoop dfs -cat har:///data/search/work.har/dir1/file1

二、distcp

  用于hadoop集群之间复制数据。

1 例如:将集群NN1的数据目录/data/logs复制到NN2的/data/logs目录,假设端口均为9000,则在NN1上执行如下命令:(也能够将多个源目录复制到一个目录中)
2 hadoop distcp hdfs://NN1:9000/data/logs hdfs://NN2:9000/data/logs

三、fsck

  fsck是HDFS文件系统的检查工具。当用户发现HDFS上的文件可能受损时,可使用这个命令进行检查,方法以下:

1 hadoop fsck <path> [-move | -delete | -openforwrite] [-files [-blocks [-locations | locations | -racks]]]
2 
3 <path>:检查的起始目录
4 -move:移动受损文件到/lost+found
5 -delete:删除受损文件
6 -openforwrite:打印出写打开的文件
7 -files:打印出整被检查的文件
8 -blocks:打印出快信息报告
9 -locations:打印出每一个块的位置信息

5、HDFS Java API的使用方法

hadoop-1.x运行实例

相关文章
相关标签/搜索