Hadoop分布式文件系统—HDFS

HDFS原理

HDFS(Hadoop Distributed File System)是一个分布式文件系统。它具有高容错性并提供了高吞吐量的数据访问,非常适合大规模数据集上的应用,它提供了一个高度容错性和高吞吐量的海量数据存储解决方案。

HDFS在设计时已考虑硬件错误等情况,具有高容错性等特征。HDFS的假设前提术设计目标包括以下几个方面。

1.硬件错误
硬件错误是常态而不是异常。HDFS 可能由成百上千台服务器构成,每台服务器上存储着文件系统的部分数据。我们面对的现实是构成系统的组件数量是巨大的,而且任一-组件都有可能失效,这意味着总是有一-部分HDFS的组件是不工作的。因此,错误检测和快速、自动的恢复是HDFS的核心架构目标。

2.大规模数据集
运行在HDPFS上的应用具有很大的数据集。HDPFS上一个典型文件的大小般在吉字节至太字节量级。因此,HDFS被配置以支持大文件存储。它能提供整体上较高的数据传输带宽,能在一个集群里扩 展到数百个节点。一个单一的HDFS实例能支撑数以千万计的文件存储和访问。

3.简单的一致性模型
HDFS应用需要一个“一 次写人、 多次读取”的文件访问模型。-一个文件经过创建、写人和关闭之后就不需要改变。这一-假设简化了数据一致性问题, 并且使高吞吐量的数据访问成为可能。MapReduce 应用或者网络爬虫应用都非常适合这个模型。

4.移动计算比移动数据更划算
一个应用请求的计算,离它操作的数据越近就越高效,在数据达到海量级别的时候更是如此。因为这样就能降低网络阻塞的影响,提高系统数据的吞吐量。将计算移动到数据附近,比将数据移动到应用所在位置显然更好。HDFS提供了将应用移动到数据附近的接口。

5.异构软硬件 平台间的可移植性
HDFS在设计的时候就考虑到平台的可移植性,这种特性方便了HDFS作为大规模数据应用平台的推广。

HDFS 的组件

HDFS包含Namenode、Datanode、 Secondary Namenode三个组件。

1.NameNode
NameNode负责管理文件目录、文件和block的对应关系以及block和datanode的对应关系。NameNode节点也成为元数据节点,用来管理文件系统的命名空间,维护目录树,接管用户的请求。
(1) 将文件的元数据保存在一个文件目录树中
(2) 在磁盘上保存为:fsimage 维护文件系统树和 edits记录文件操作日志
(3) 保存datanode的数据信息的文件,在系统启动的时候读入内存。

2.DataNode
Datanode是文件系统的工作节点。他们根据需要存储并检索数据块(受客户端或namenode调度),并且定期向nameNode发送他们所存储的块的列表。

3.Sconday Namend:辅助后台程序,与NameNode进行通信,以便定期保存HDFS元数据的快照,用以备份和恢复数据。

       在Namenode节点上,fimge保存了元数据镜像文件(文件系统的目录树),而cdis中完整记录了元数据的操作日志(针对文件系统做的修改操作记录)。Namende内存中存储的元数据可以用imgetd"来表达。 hecoay Namnde负贲定时(默认1小时)从Nameo上获取fimnge和dis进行合井,然后再发送给Namenode,减少Namenode的工作量。这是HA (高可用性)的一个常用解决方案,但不支持热备。要使用这种方式来完成高可用性,直接修改配置即可。

HDFS架构

如图所示,HDFS是一个主从结构,一个HDFS集群是由一个管理节点NameNode,它是一个管理文件命名空间和调节客户端访问文件的主服务器,还有一些数据节点DataNode,通常是一个节点一个机器,它来管理对应节点的存储。

HDFS第一代与二代区别 hdfs du_HDFS


文件写入流程:

(1)客户端向Namenode发起文件写人的请求;

(2)Namenode根据文件大小和文件块配置情况,返回给客户端所管理部分Datanode的信息;

(3)客户端将文件划分为多个块,根据Datanode的地址信息,按顺序写入到每一个Datanode块中。

文件读取流程:

(1)客户端向Namenode发起文件读取的请求;

(2)Namenode返回文件存储的Datanode的信息;

(3)客户端读取文件信息。

HDFS数据复制

HDFS被设计成能够在一- 个大集群中跨机器可靠地存储超大文件。它将每个文件存储成一系列的数据块,除了最后一个以外, 所有的数据块都是同样大小的( Hadoop 1.X 默认每个数据块大小为64MB. Hadoop 2.X和Hadoop 3.X默认每个数据块大小为128MB)。为了容错,文件的所有数据块都会有副本。每个文件的数据块大小和副本系数都是可配置的。应用程序可以指定某个文件的副本数量。副本系数可以在文件创建的时候指定,也可以在之后改变。HDFS中的文件都是一-次性写 人的,并且严格要求在任何时候都只能有一个写人者。

Namenode全权管理数据块的复制,它周期性地从集群中的每个Datanode 接收心跳信号和块状态报告。接收到心跳信号意味着该Datanode 节点工作正常。块状态报告包含了该Datanode上所有数据块的列表。

副本的存放是HDFS可靠性和性能的关键。优化的副本存放策略是HDFS区分于其他大部分分布式文件系统的重要特性。HDFS 采用一种称为机架感知(rack-aware)的策略来改进数据的可靠性、可用性和网络带宽的利用率。在大多数情况下,副本系数是3,HDFS的存放策略是将-个副本存放在 本地机架的节点上,一个副本存放在同一机架的另一个节点上,最后一个副本存放在不同机架的节点上。

这种策略减少了机架间的数据传输,提高了写操作的效率。机架的错误远远比节点的错误少,所以这个策略不会影响到数据的可靠性和可用性。与此同时,因为数据块只放在两个(不是三个)不同的机架上,所以此策略减少了读取数据时需要的网络传输总带宽。在这种策略下,副本并不是均匀分布在不同的机架上。

三分之一的副本在一 一个节点上,三分之二的副本在一- 个机架上,这-策略在 不损害数据可靠性和读取性能的情况下改进了写的性能。为了降低整体的带宽消耗和读取延时,HIDFS会尽量让读取程序读取离它最近的副本。如果在读取程序的同一个机架上有一个副本,那么就读取该剧本。如果一个HIDFS集群跨越多个数据中心,那么客户端也将首先读本地数据中心的副本。

HDFS 健壮性

HDFS的主要目标就是即使在出错的情况F也要保证数据存储的可靠性。常见的三种出错情况是Namenode出错、Datanode出错和网络制裂。1.磁盘数据错误,心跳检测和重新复制

每个Datanode节点周期性地向Namenode发送心跳信号。网络割裂可能导致部分 Datanode与Namenode失去联系。Namenode通过心做信号的缺失来检测这一情况。并将这些近期不再发送心跳信号的 Datanode标记为死机,不会再将新的IO请求发给它们。任何存储在死机Datanode上的数据将不再有效。Datanode的死机可能会引起一些数据块的副本系数低于指定值,Namenode不断地检测这些需要复制的数据块,一旦发现就启动复制操作。在下列情况下,可能需要重新复制:某个Datanode 节点失效,某个副本遭到损坏,Datanode上的硬盘错误,文件的副本系数增大。

2.集群均衡

HDFS的架构支持数据均衡策略。如果某个Datanode节点上的空闲空间低于特定的临界点,按照均衡策略系统就会自动地将数据从这个Datanode 移动到其他空闲的Datanode。当对某个文件的请求突然增加时,也可能启动-个计划创建该文件新的副本,并且同时重新平衡集群中的其他数据。

3.数据完整性

从某个Datanode获取的数据块有可能是损坏的,损坏可能是由Datanode的存储设备错误、网络错误或者软件漏洞造成的。HDFS客户端软件实现了对HDFS文件内容的校验和(checksum)检查。当客户端创建一个 新的HDFS文件时,会计算这个文件每个数据块的校验和,并将校验和作为一个单独的隐藏文件保存在同一个HDFS名字空间下。当客户端获取文件内容后,它会检验从Datanode获取的数据以及相应的校验和与文件中的校验和是否匹配,如果不匹配,客户端可以选择从其他Datanode获取该数据块的副本。

4.元数据磁盘错误

FsImage和Editlog是HDFS的核心数据结构。如果这些文件损坏,整个HDFS实例都将失效。因而,Namenode 可以配置成支持维护多个FsImage和Edilog的副本。任何对Fslmage或者Editlog的修改,都将同步到它们的副本上。这种多副本的同步操作可能会降低Namenode每秒处理的名字空间事务数量。然而这个代价是可以接受的,因为即使HDFS的应用是数据密集的,它们也非元数据密集的。当Namenode重启的时候,它会选取最近的完整的FsImage和Editlog来使用。

5.快照

快照支持某-特定时刻的数据的复制备份。利用快照,可以让HDFS在数据损坏时恢复到过去一个已知 正确的时间点。

HDFS 数据组织

HDFS数据组织包括HDFS的数据块存储流水线复制、文件的制除和恢复等机制,保障了HDFS高效和可靠地存储数据。

1.数据块存储

HDFS的设计是用于支持大文件的。运行在HDFS上的程序也是用于处理大数据集的。这些程序仅写一次数据,一次或多次读数据请求,并且这些读操作要求满足流式传输速度。HDFS支持文件的一次写多次读操作。HDFS中典型的块大小是64MB,一个HDFS文件可以被切分成多个64MB大小的块,如果需要,每一个块可以分布在不同的数据节点上。

一个客户端创建一个文件的请求并不会立即转发到名字节点。实际上,一开始HDFS客户端将文件数据缓存在本地的临时文件中。应 用程序的写操作被透明地重定向到这个临时本地文件。当本地文件堆积到一个HDFS块大小的时候,客户端才会通知名称节点。名称节点 将文件名插入到文件系统层次中,然后为它分配一个数据块。名称节点构造包括数据节点ID(可能是多个,副本数据块存放的节点也有)和目标数据块标识的报文,用它回复客户端的请求。客户端收到后将本地的临时文件刷新到指定的数据节点数据块中。当文件关闭时,本地临时文件中未上传的残留数据就会被转送到数据节点。然后客户端就可以通知名称节点文件已经关闭。此时,名称节点将文件的创建操作添加到到持久化存储中。假如名称节点在文件关闭之前死掉,文件就丢掉了。

上述流程是在认真考虑了运行在HDFS上的目标程序之后被采用。这些应用程序需要流式地写文件。如果客户端对远程文件系统进行直接写入而没有任何本地的缓存,这就会对网速和网络吞吐量产生很大的影响。这方面早有前车之鉴,早期的分布式文件系统如AFS,也用客户端缓冲来提高性能,POSIX接口的限制也被放宽以达到更高的数据上传速率。

2.流水线复制

当客户端写入据到HDFS文件中时,数据首先被写入本地文件中,假设该文件的副本系数设置为3,当本地文件堆积到一个数据块的大小时,客户端从名称节点(Namenode)获得一个数据节点(Datanode)的列表。这个列表也包含存放数据块副本的数据节点。当客户端刷新数据块到第一个数据节点。第一个数据节点开始以4KB单元接收数据,将每一小块都写到本地仓库中,同时将每一小块都传送到列表中的第二个数据节点。同理,第二个数据节点将小块数据写入本地仓库中,同时传给第三个数据节点,第三个数据节点直接写到本地库中。一个数据节点在接前一个节点数据的同时,还可以将数据流水式传递给下一个节点,所以,数据是流水式地从一个数据节点传递到下一个数据节点。

3.文件的删除和恢复

当用户或应用程序删除某个文件时,这个文件并没有立刻从HDFS中删除。实际上,HDFS会将这个文件重命名转移到/rah目录。只要文件还在tah目录中,该文件就可以被迅速地恢复。文件在trash中保存的时间是可配置的,当超过这个时间时,Namende就会将这文件从名字空间中删除。删除文件会使得该文件相关的数据块被释放。只要玻别除的文件还在Irah目录中,用户就可以恢复这个文件。

如果用户希组恢过被删除的文件,可以湖觉tnh目录我回该文件。hosh 目录仅仅保任饮制除文件的最后剧本。Mms目录与其他的目录没有什么区别,除了一点: 在该自录上HDFS会应用一个特殊策略来自动删除文件。目前的默认策略是删除/rash中保留时间超过6小时的文件。

4.减少复制因子

当文件的复制因子减少了,名字节点选择删除多余的副本,下一次的心跳包的回复就会将此信息传递给数据节点。然后,数据节点移除相应的块,对应的空闲空间将回归到集群中,需要注意的就是,在setReplication函数调用后和集群空闲空间更新之间会有一段时间延迟。
什么是心跳机制?
就是每隔几分钟发送一个固定信息给服务端,服务端收到后回复一个固定信息如果服务端几分钟内没有收到客户端信息则视客户端断开。
发包方:可以是客户也可以是服务端,看哪边实现方便合理。
心跳包之所以叫心跳包是因为:它像心跳一样每隔固定时间发一次,以此来告诉服务器,这个客户端还活着。事实上这是为了保持长连接,至于这个包的内容,是没有什么特别规定的,不过一般都是很小的包,或者只包含包头的一个空包。心跳包主要也就是用于长连接的保活和断线处理。一般的应用下,判定时间在30-40秒比较不错。如果实在要求高,那就在6-9秒。

HDFS Shell命令

概述
HDFS Shell命令允许使用命令行在HDFS存储中进行文件夹和文件操作。

如文件夹的增删改查、文件的增删改查等。

开始练习hadoop时,打开Linux之后要用 start-dfs.sh

启动HDFS。

HDFS不是开机启动的

HDFS第一代与二代区别 hdfs du_客户端_02

常用命令
命令格式

hdfs dfs -操作命令 参数

前面的【hdfs dfs -】部分是固定的,后面的【操作命令 参数】部分是变化的

命令练习(练习时可结合Hadoop站点观察操作结果)
![在这里插入图片描述](

hdfs dfs -mkdir /abc #创建名为/abc的文件夹

hdfs dfs -ls / 0 #列出根目录中的内容

hdfs dfs -ls -R / #递归列出多层文件夹的内容

hdfs dfs -put /etc/hosts /abc/hosts #把Linux系统中/etc/hosts文件上传到HDFS中

hdfs dfs -appendToFile /etc/hosts /abc/hosts

#向文件中追加内容

hdfs dfs -checksum /abc/hosts #查看文件的MD5值

hdfs dfs -du -h / #查看文件/文件夹的大小

-h以人类友好的方式显示大小(过大时带单位)

hdfs dfs -get /abc/hosts ./hosts #把HDFS中的文件下载到本地Linux中

注意./hosts是下载后保存到本地的位置

hdfs dfs -cat /abc/hosts #查看HDFS中文本文件的内容

注意:只能查看文件文件

hdfs dfs -tail /abc/hosts #列出文件结尾处1KB的文件内容
hdfs dfs -mv /abc/hosts /abc/xyz #修改文件名字或移动位置

hdfs dfs -cp /abc/xyz /abc/hosts #复制文件

hdfs dfs -find / -name xyz #查找名字为xyz的文件的位置

hdfs dfs -rmdir /abc #删除名为/abc的文件夹

注意:如果其中还有文件则不能删除

hdfs dfs -rm /abc/hosts #删除文件

hdfs dfs -rm -r /abc #递归删除文件/文件夹,文件夹中有文件也能删除

hdfs dfs -df #查看HDFS文件系统的磁盘使用情况