HDFS(Hadoop Distributed FileSystem)
1.简介
~ 高度容错性的分布式文件系统,适合部署在廉价的计算机上。
~ Linux文件系统之上又构建了一个文件系统,
~ 能提供高吞吐量的数据访问,非常适合大规模数据集上的应用
~ 一个树形文件系统。可以创建、删除、移动或重命名文件和目录
~ 一组计算机节点组成:一个NameNode提供元数据,多个DataNode存储块
~ NameNode和DataNode以管理者-工作者模式运行, NameNode是管理者,DataNode是工作者。
2.HDFS元数据管理机制?
3.HDFS架构?
* NameNode
* DataNode
* Secondary NameNode
4.NameNode简介?
* 是整个文件系统的管理节点。它维护着整个文件系统的文件目录树,文件/目录的元信息和每个文件对应的数据块列表。接收用户的操作请求。
* 文件包括: hdfs-site.xml的dfs.name.dir属性
①fsimage:元数据镜像文件。存储某一时段NameNode内存元数据信息。
②edits:操作日志文件。
③fstime:保存最近一次checkpoint的时间
* 以上这些文件是保存在linux的文件系统中。
5.NameNode工作特点?
* Namenode始终在内存中保存metedata,用于处理“读请求”
* 到有“写请求”到来时,namenode会首先写editlog到磁盘,即向edits文件中写日志,成功返回后,才会修改内存,并且向客户端返回
* Hadoop会维护一个fsimage文件,也就是namenode中metedata的镜像,但是fsimage不会随时与namenode内存中的metedata保持一致,而是每隔一段时间通过合并edits文件来更新内容。Secondary namenode就是用来合并fsimage和edits文件来更新NameNode的metedata的。
6.NameNode工作流程?
7.Datanode?
* 提供真实文件数据的存储服务。
* 文件块(block):最基本的存储单位。对于文件内容而言,一个文件的长度大小是size,那么从文件的0偏移开始,按照固定的大小,顺序对文件进行划分并编号,划分好的每一个块称一个Block。HDFS默认Block大小是128MB,以一个256MB文件,共有256/128=2个Block. dfs.block.size
* 不同于普通文件系统的是,HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间
* Replication。多复本。默认是三个。
hdfs-site.xml的dfs.replication属性
8.SecondaryNameNode?
*HA的一个解决方案。但不支持热备。配置即可。
* 执行过程:从NameNode上下载元数据信息(fsimage,edits),然后把二者合并,生成新的fsimage,在本地保存,并将其推送到NameNode,替换旧的fsimage.
* 默认在安装在NameNode节点上,但这样...不安全!
9.SecondaryNameNode的工作流程?
①secondary通知namenode切换edits文件
②secondary从namenode获得fsimage和edits(通过http)
③secondary将fsimage载入内存,然后开始合并edits
④secondary将新的fsimage发回给namenode
⑤namenode用新的fsimage替换旧的fsimage,同时把edits.new文件重命名为edits
10.什么时候checkpiont?
* fs.checkpoint.period 指定两次checkpoint的最大时间间隔,默认3600秒。
* fs.checkpoint.size 规定edits文件的最大值,一旦超过这个值则强制checkpoint,不管是否到达最大时间间隔。默认大小是64M。
11.HDFS文件操作过程?
12.工作特性?
①数据副本
每个文件存储成一系列的数据块,所有数据块都会有副本,可配置 数据块大小和副本系数。
Namenode接收Datanode心跳信号和块状态报告。
HDFS采用机架感知(rack-aware)保证可靠性、可用性和网络带宽的利用率。Namenode可以确定每个Datanode所属的机架id。
副本系数是3,一个简单但没有优化的策略就是将副本存放在不同的机架上
第一个副本在本地机架的节点上,第二个副本在同一机架的另一个节点上,第三个副本在不同机架的节点上。
尽量让读取程序读取离它最近的副本。
②安全模式
Namenode启动进入安全模式,Namenode从 Datanode接收心跳信号和块状态报告。块状态报告包括了某个Datanode所有的数据块列表,每个数据块都有一个指定的最小副本数。当Namenode检测确认某个数据块的副本数目达到这个最小值,那么该数据块就会被认为是副本安全(safely replicated)的;在一定百分比(这个参数可配置)的数据块被Namenode检测确认是安全之后(加上一个额外的30秒等待时间),Namenode将退出安全模式状态。接下来它会确定还有哪些数据块的副本没有达到指定数目,并将这些数据块复制到其他Datanode上。
③文件系统元数据的持久化
对文件系统元数据产生修改的操作用EditLog事务日志记录,文件系统的名字空间存储在FsImage文件。
Namenode在内存中保存文件系统的名字空间(FsImage)和文件数据块映射(Blockmap)的映像,Namenode启动,系统从读取Editlog和FsImage,将所有Editlog中的事务作用在内存中的FsImage上,并将这个新版本的FsImage从内存中保存到磁盘上,删除旧的Editlog,这个过程叫检查点(checkpoint)。
Datanode将HDFS数据以文件的形式存储在本地的文件系统中,它并不知道有关HDFS文件的信息。它把每个HDFS数据块存储在本地文件系统的一个单独的文件中。
④健壮性
每个Datanode节点周期性地向Namenode发送心跳信号。网络割裂可能导致一部分Datanode跟Namenode失去联系。Namenode通过心跳信号的缺失来检测这一情况,并将这些近期不再发送心跳信号Datanode标记为宕机,不会再将新的IO请求发给它们。
任何存储在宕机Datanode上的数据将不再有效。Datanode的宕机可能会引起一些数据块的副本系数低于指定值,Namenode不断地检测这些需要复制的数据块,一旦发现就启动复制操作。在下列情况下,可能需要重新复制:某个Datanode节点失效,某个副本遭到损坏,Datanode上的硬盘错误,或者文件的副本系数增大。
会影响HDFS的性能,但数据不会丢失或破坏。
⑤集群均衡
某个Datanode节点上的空闲空间低于特定的临界点,按照均衡策略系统就会自动地将数据从这个Datanode移动到其他空闲的Datanode。当对某个文件的请求突然增加,那么也可能启动一个计划创建该文件新的副本,并且同时重新平衡集群中的其他数据。
⑥数据完整性
数据块有可能是损坏的。HDFS客户端软件对HDFS文件内容的校验和检查。当客户端创建一个新的HDFS文件,会计算这个文件每个数据块的校验和,并将校验和作为一个单独的隐藏文件保存在同一个HDFS名字空间下。当客户端获取文件内容后,它会检验从Datanode获取的数据跟相应的校验和文件中的校验和是否匹配,如果不匹配,客户端可以选择从其他Datanode获取该数据块的副本。
⑦元数据磁盘错误
Namenode可以配置成支持维护多个FsImage和Editlog的副本。任何对FsImage或者Editlog的修改,都将同步到它们的副本上。
⑧数据组织
数据块大小是64MB。因而,HDFS中的文件总是按照64M被切分成不同的块,每个块尽可能地存储于不同的Datanode中。
⑨客户端缓存
应用程序的写操作被透明地重定向到临时文件。数据量超过一个数据块的大小,Namenode将文件名插入文件系统的层次结构中,并且分配一个数据块给它。然后返回Datanode的标识符和目标数据块给客户端。接着客户端将这块数据从本地临时文件上传到指定的Datanode上。当文件关闭时,在临时文件中剩余的没有上传的数据也会传输到指定的Datanode上。然后客户端告诉Namenode文件已经关闭。此时Namenode才将文件创建操作提交到日志里进行存储。如果Namenode在文件关闭前宕机了,则该文件将丢失。
⑩流水线复制
本地临时文件累积到一个数据块的大小时,客户端开始向第一个Datanode传输数据,第一个Datanode一小部分一小部分(4 KB)地接收数据,将每一部分写入本地,并同时传输该部分到列表中第二个Datanode节点。第二个Datanode一小部分一小部分地接收数据,写入本地,并同时传给第三个Datanode。第三个Datanode接收数据并存储在本地。
⑪可访问性
HDFS给应用提供了多种访问方式。用户可以通过Java API接口访问,也可以通过C语言的封装API访问,还可以通过浏览器的方式访问HDFS中的文件。
⑫存储空间回收
当用户或应用程序删除某个文件时,这个文件并没有立刻从HDFS中删除。这个文件重命名转移到/trash目录。过一段时间会彻底删除,只要文件还在/trash目录中,该文件就可以被迅速地恢复。
⑬通信协议
所有的HDFS通讯协议都是建立在TCP/IP协议之上。
13.文件读取过程?
1、Client向NameNode发起RPC请求; 2、NameNode返回有block拷贝的DataNode 3、Client选取最近的DataNode读取block; 4、读完后关闭DataNode连接,寻找下一个block的DataNode; 5、客户端继续向NameNode获取下一批的block列表。 6、读取完一个block都会进行checksum验证,如果错误通知NameNode,找一个拥有该block拷贝的DataNode继续读。
14.文件写入过程?
1、Client发起RPC请求; 2、Namenode文件是否存在,创建者是否有权,成功则会为文件创建一个记录,否则抛出异常; 3、当客户端将文件切分成packets成数据队列,向Namenode申请新的blocks。 4、开始以pipeline(管道)的形式将packet写入所有的备份中。呈流水线的形式。 5、客户端接受Datanode成功的信号。 6、如果datanode出现了故障,Namenode会分配一个新的datanode
参考书籍:《云计算理论与实践》 潘虎著 中国工信出版集团