欢迎来到天天文库
浏览记录
ID:6127020
大小:532.00 KB
页数:5页
时间:2018-01-04
《hadoop中hdfs的存储机制》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、Hadoop中HDFS的存储机制HDFS(HadoopDistributedFileSystem)是Hadoop分布式计算中的数据存储系统,是基于流数据模式访问和处理超大文件的需求而开发的。下面我们首先介绍HDFS中的一些基础概念,然后介绍HDFS中读写操作的过程,最后分析了HDFS的优缺点。1.HDFS中的基础概念 Block:HDFS中的存储单元是每个数据块block,HDFS默认的最基本的存储单位是64M的数据块。和普通的文件系统相同的是,HDFS中的文件也是被分成64M一块的数据块存储的。不同的是,在HDFS中,如果一个文件大小小于
2、一个数据块的大小,它是不需要占用整个数据块的存储空间的。NameNode:元数据节点。该节点用来管理文件系统中的命名空间,是master。其将所有的为了见和文件夹的元数据保存在一个文件系统树中,这些信息在硬盘上保存为了命名空间镜像(namespaceimage)以及修改日志(editlog),后面还会讲到。此外,NameNode还保存了一个文件包括哪些数据块,分布在哪些数据节点上。然而,这些信息不存放在硬盘上,而是在系统启动的时候从数据节点收集而成的。DataNode:数据节点,是HDFS真正存储数据的地方。客户端(client)和元数据节
3、点(NameNode)可以向数据节点请求写入或者读出数据块。此外,DataNode需要周期性的向元数据节点回报其存储的数据块信息。SecondaryNameNode:从元数据节点。从元数据节点并不是NameNode出现问题时候的备用节点,它的主要功能是周期性的将NameNode中的namespaceimage和editlog合并,以防log文件过大。此外,合并过后的namespaceimage文件也会在SecondaryNameNode上保存一份,以防NameNode失败的时候,可以恢复。editlog:修改日志,当文件系统客户端clien
4、t进行写操作的时候,我们就要把这条记录放在修改日志中。在记录了修改日志后,NameNode则修改内存中的数据结构。每次写操作成功之前,editlog都会同步到文件系统中。fsimage:命名空间镜像,它是内存中的元数据在硬盘上的checkpoint。当NameNode失败的时候,最新的checkpoint的元数据信息就会从fsimage加载到内存中,然后注意重新执行修改日志中的操作。而SecondaryNameNode就是用来帮助元数据节点将内存中的元数据信息checkpoint到硬盘上的。 具体checkpoint的过程如下图:(参考ha
5、doop集群的博客)checkpoint的过程如下:SecondaryNameNode通知NameNode生成新的日志文件,以后的日志都写到新的日志文件中。SecondaryNameNode用httpget从NameNode获得fsimage文件及旧的日志文件。SecondaryNameNode将fsimage文件加载到内存中,并执行日志文件中的操作,然后生成新的fsimage文件。SecondaryNameNode将新的fsimage文件用httppost传回NameNode。NameNode可以将旧的fsimage文件及旧的日志文件,换
6、为新的fsimage文件和新的日志文件(第一步生成的),然后更新fstime文件,写入此次checkpoint的时间。这样NameNode中的fsimage文件保存了最新的checkpoint的元数据信息,日志文件也重新开始,不会变的很大了。2.HDFS中文件读写操作流程在HDFS中,文件的读写过程就是client和NameNode以及DataNode一起交互的过程。我们已经知道NameNode管理着文件系统的元数据,DataNode存储的是实际的数据,那么client就会联系NameNode以获取文件的元数据,而真正的文件读取操作是直接和
7、DataNode进行交互的。写文件的过程: 客户端调用create()来创建文件DistributedFileSystem用RPC调用元数据节点,在文件系统的命名空间中创建一个新的文件。元数据节点首先确定文件原来不存在,并且客户端有创建文件的权限,然后创建新文件。DistributedFileSystem返回DFSOutputStream,客户端用于写数据。客户端开始写入数据,DFSOutputStream将数据分成块,写入dataqueue。Dataqueue由DataStreamer读取,并通知元数据节点分配数据节点,用来存储数据块(每
8、块默认复制3块)。分配的数据节点放在一个pipeline里。DataStreamer将数据块写入pipeline中的第一个数据节点。第一个数据节点将数据块发送给第二个数据节点。第
此文档下载收益归作者所有