一、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配置文件来指定。网络
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进行交互。
图为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
读文件时在多个数据块文件中选择一个就能够了,可是写数据文件时须要同时写道多个数据块文件中。
图为HDFS写文件数据流的过程,首先客户端调用create()来建立文件,而后DistributedFileSystem一样使用RPC调用namenode首先肯定文件是否不存在,以及客户端有建立文件的权限,而后建立文件。DistributedFileSystem返回DFSOutputStream,客户端用于写数据。客户端开始写入数据,DFSOutputStream将数据分红块,写入data queue。data queue由data streamer读取,并通知元数据节点分配数据节点,用来存储数据块(每块默认复制3块)。分配的数据节点放在pipeline里。data streamer将数据块写入pipeline中的第一个数据节点。第一个数据节点将数据块发送给第二个数据节点,第二个数据节点将数据发送给第三个数据节点。DFSOutputStream为发出去的数据块保存了ack queue,等待pipeline中的数据节点告知数据已经写入成功。
edits、fsimage、fstime。都是二进制文件,能够经过Hadoop Writable对象就行序列化。
当客户端执行写操做时,首先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文件到文件的记录检查点时间。
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的设计主要是用于大吞吐量的数据,是以必定的时延为代价的。
二、对大量小文件的处理
大量小文件处理时不免产生大量线程时延。解决办法:利用SequenceFile、MapFile、Har等方式归档小文件。就是把小文件归档管理,HBase就是这种原理。横向扩展。多Master设计。
三、多用户写,任意文件修改
用于建立一个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
用于hadoop集群之间复制数据。
1 例如:将集群NN1的数据目录/data/logs复制到NN2的/data/logs目录,假设端口均为9000,则在NN1上执行如下命令:(也能够将多个源目录复制到一个目录中) 2 hadoop distcp hdfs://NN1:9000/data/logs hdfs://NN2:9000/data/logs
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:打印出每一个块的位置信息