转自:http://blog.csdn.net/sxf_824/article/details/4842196
设计思想
HDFS中对数据存储的最小单位为block,HDFS会将其存储的大文件打散成很多64M大小的block,并将这些block分别存储在集群中datanode机器上。服务器namenode主要存储文件元数据信息(文件目录结构,具体文件由那些block组成),该部分主要涉及的关键对象为:INode,INodeFile,INodeDirectory,Block,BlockInfo,FSDirectory
NameNode主要负责存储文件目录结构以及具体文件由那些block组成这些元数据基本信息,以上对象存在于namenode上。上述对象的主要关系如下。
INode
INode是抽象基类,从字面上能够了解到它表示一个文件属性目录结构中的一个节点,它包含的主要属性为:
//节点名称
protectedbyte[]name;
//父节点
protectedINodeDirectoryparent;
//最后修改时间
protectedlongmodificationTime;
//访问时间
protectedlongaccessTime;
//访问权限(同linux0777,0666之类)
privatelongpermission;
INodeFile
INodeFile继承自INode,表示文件节点。包含的主要属性如下:
//该文件中包含的所有Block,这些对象并不包含实际的文件block内容,主要的属性为blocks,后续通过blockID和时间戳信息可以找到这些Block存在哪台datanode机器上,客户端直接与该datanode建立链接,请求这个BockID对应的Block中具体文件内容数据(后续再讲,该字段为关键字段)
protectedBlockInfoblocks[]=null;
//block的复制个数
protectedshortblockReplication;
//缺省block大小
protectedlongpreferredBlockSize;
INodeDirectory
INodeDirectory同样继承自INode,表示文件目录节点,主要包含的属性如下:
//该文件目录下所有的子节点信息
privateList<INode>children;
Block
publicclassBlockimplementsWritable,Comparable<Block>
Block本身是一个抽象概念,就表示HDFS中一个最小存储单元,其主要包含的属性如下:
//BlockID标识
privatelongblockId;
//这个Block包含多少字节数据
privatelongnumBytes;
//一个时间戳,表示Block的版本
privatelonggenerationStamp;
注:这个Block对象只是一个抽象的概念(你可以理解为一个数据块的标识,一个存储单元的标识),这个对象并不包含实际Block数据。
Block信息的读取就是client通过网络传递一个序列化的block对象到DataNode,DataNode在本机中的读取这个Block对应的存储文件,返回给客户端。
Block是一个实现了Writable,Comparable<Block>的对象。说明Block对象可以进行序列化并通过网络进行传输,DataNode也可以通过HashMap的方式将Block与实际的存储文件进行对应关联。
BlockInfo
BlockInfo继承自Block,其包含的主要属性如下:
//该Block所属的文件
privateINodeFileinode;
/**
*Thisarraycontainstripletsofreferences.
*Foreachi-thdata-nodetheblockbelongsto
*triplets[3*i]isthereferencetotheDatanodeDescriptor
*andtriplets[3*i+1]andtriplets[3*i+2]arereferences
*tothepreviousandthenextblocks,respectively,inthe
*listofblocksbelongingtothisdata-node.
*/
privateObject[]triplets
triplets是一个关键字段。
通过triplets[3*i+1]和triplets[3*i+2]可以得到某台datanode机器上所有的block列表,triplets[3*i+1]和triplets[3*i+2]为BlockInfo类型对象。
该项功能主要应用在DatanodeDescriptor实例的
privatevolatileBlockInfoblockList=null这个字段中。
通过triplets[3*i]可以得到这个Block其他副本的所属datanode的位置,triplets[3*i]为DatanodeDescriptor类型对象
抓住BlockInfo就抓住了整个HDFS按Block进行文件分布式存储的关键。
BlockInfo信息中不仅包括了一个Block都存储在哪些DataNode上,还包含了某个具体datanode上存储的所有Block信息,以及该block属于哪一个INodeFile。用户需要读取文件时首先通过INodeFile得到这个文件所有的Block---INodeFile中的BlockInfo[]getBlocks()方法。通过BlockInfo又可以得到Block存储的DataNodeInfo列表。用户就可以向得到的DataNode列表的机器发送读取Block具体数据的请求(这部分具体实现后面再讲)。
在系统运行过程中,上述关键对象主要存储在内存中,也就是说HDFS的Namenode有一个内存镜像,其中的内容就是以上对象组成的树形结构,也许有人会问,如果Namenode当机会出现什么问题呢?这个问题问得好:)(具体的解决办法后续会详细讲解,目前先提一下)
HDFS为了能够保证数据安全性,完整性,采用和数据库一样的容灾机制,记录数据操作行为日志:对应的功能对象为FSEditLog。
系统定时将内存中的文件系统结构镜像序列化到磁盘(FsImage),并删除当前的EditLog。如果系统机器重启,Namenode会从镜像文件中读取目录结构信息,同时执行EditLog中记录的操作,用以恢复最新的内存镜像。
FSDirectory
FSdirectory的一个主要作用是就是上述所说的从镜像文件中读取目录结构信息,同时执行EditLog中记录的操作,用以恢复最新的内存镜像。
FSdirectory另一个主要作用就是操作INodeDirectory,INodeFile对象,对文件系统的目录,文件以及文件包含的Block进行操作。FSdirectory有一个关键属性:rootDir,这个对象是整个文件系统的根目录。
该对象涉及的主要方法如下:
voidloadFSImage(Collection<File>dataDirs,Collection<File>editsDirs,StartupOptionstartOpt)throwsIOException
booleanmkdirs(Stringsrc,PermissionStatuspermissions,
booleaninheritPermission,longnow)
BlockaddBlock(Stringpath,INode[]inodes,Blockblock)throwsIOException
private<TextendsINode>TaddChild(INode[]pathComponents,intpos,Tchild,longchildDiskspace,booleaninheritPermission)
throwsQuotaExceededException
INodeFileUnderConstruction
这个类继承自INodeFile,它的实例代表一个正在处于写入状态的文件,新文件的创建和文件的追加(文件追加目前HDFS支持不是很好)时都会使用到这个对象,INode有一个方法booleanisUnderConstruction(),如果这个方法返回true,表示这个对象目前处于写入状态,可以将这个对象引用转化为INodeFileUnderConstruction。
当文件处于isUnderConstruction状态时,往往就和文件租约产生关联,因为文件的写入操作都会首先实现申请一个租约(租约有专门一章进行讲解),从FSNameSystem的startFileInternal()方法中的部分逻辑代码可以看出端倪。
//首先判断文件是否存在,并且处于文件写入状态
if(myFile!=null&&myFile.isUnderConstruction())
{
//转换文件为INodeFileUnderConstruction类型
INodeFileUnderConstructionpendingFile=
(INodeFileUnderConstruction)myFile;
//Ifthefileisunderconstruction,thenitmustbeinour
//leases.Findtheappropriateleaserecord.
//如果文件处于写入状态一定有租约与之对应
Leaselease=
leaseManager.getLease(newStringBytesWritable(holder));
下面我们分析一下INodeFileUnderConstruction的关键属性以及方法
INodeFile这个对象仅仅表示一个文件节点,它的大部分属性都是与BlockInfo相关的。
而INodeFileUnderConstruction就会有一些文件创建以及追加时必要的信息,,详细如下:
//这个属性表示当前文件的租约属主是哪次应用
StringBytesWritableclientName=null;//leaseholder
StringBytesWritableclientMachine=null;
//client很可能也是datanode其中之一
DatanodeDescriptorclientNode=null;//ifclientisaclusternodetoo.
//这个属性主要应用于block的recover操作(该操作后续会详细描述)
privateintprimaryNodeIndex=-1;//thenodeworkingonleaserecovery
//文件最后一个block需要写入的机器,这是很重要的属性,也是显而易见的,文件的追加写入一定是对最后一个Block进行操作
privateDatanodeDescriptor[]targets=null;//locationsforlastblock
privatelonglastRecoveryTime=0;
下面看一个很重要的方法,这个方法后续会详细描述。
voidassignPrimaryDatanode()
当文件写入过程中,很可能在某些datanode上写入失败,这就需要对block进行recover操作,而恢复操作中的主节点就是那些写入正常的datanode。
设计思想
HDFS中对数据存储的最小单位为block,HDFS会将其存储的大文件打散成很多64M大小的block,并将这些block分别存储在集群中datanode机器上。服务器namenode主要存储文件元数据信息(文件目录结构,具体文件由那些block组成),该部分主要涉及的关键对象为:INode,INodeFile,INodeDirectory,Block,BlockInfo,FSDirectory
NameNode主要负责存储文件目录结构以及具体文件由那些block组成这些元数据基本信息,以上对象存在于namenode上。上述对象的主要关系如下。
INode
INode是抽象基类,从字面上能够了解到它表示一个文件属性目录结构中的一个节点,它包含的主要属性为:
//节点名称
protectedbyte[]name;
//父节点
protectedINodeDirectoryparent;
//最后修改时间
protectedlongmodificationTime;
//访问时间
protectedlongaccessTime;
//访问权限(同linux0777,0666之类)
privatelongpermission;
INodeFile
INodeFile继承自INode,表示文件节点。包含的主要属性如下:
//该文件中包含的所有Block,这些对象并不包含实际的文件block内容,主要的属性为blocks,后续通过blockID和时间戳信息可以找到这些Block存在哪台datanode机器上,客户端直接与该datanode建立链接,请求这个BockID对应的Block中具体文件内容数据(后续再讲,该字段为关键字段)
protectedBlockInfoblocks[]=null;
//block的复制个数
protectedshortblockReplication;
//缺省block大小
protectedlongpreferredBlockSize;
INodeDirectory
INodeDirectory同样继承自INode,表示文件目录节点,主要包含的属性如下:
//该文件目录下所有的子节点信息
privateList<INode>children;
Block
publicclassBlockimplementsWritable,Comparable<Block>
Block本身是一个抽象概念,就表示HDFS中一个最小存储单元,其主要包含的属性如下:
//BlockID标识
privatelongblockId;
//这个Block包含多少字节数据
privatelongnumBytes;
//一个时间戳,表示Block的版本
privatelonggenerationStamp;
注:这个Block对象只是一个抽象的概念(你可以理解为一个数据块的标识,一个存储单元的标识),这个对象并不包含实际Block数据。
Block信息的读取就是client通过网络传递一个序列化的block对象到DataNode,DataNode在本机中的读取这个Block对应的存储文件,返回给客户端。
Block是一个实现了Writable,Comparable<Block>的对象。说明Block对象可以进行序列化并通过网络进行传输,DataNode也可以通过HashMap的方式将Block与实际的存储文件进行对应关联。
BlockInfo
BlockInfo继承自Block,其包含的主要属性如下:
//该Block所属的文件
privateINodeFileinode;
/**
*Thisarraycontainstripletsofreferences.
*Foreachi-thdata-nodetheblockbelongsto
*triplets[3*i]isthereferencetotheDatanodeDescriptor
*andtriplets[3*i+1]andtriplets[3*i+2]arereferences
*tothepreviousandthenextblocks,respectively,inthe
*listofblocksbelongingtothisdata-node.
*/
privateObject[]triplets
triplets是一个关键字段。
通过triplets[3*i+1]和triplets[3*i+2]可以得到某台datanode机器上所有的block列表,triplets[3*i+1]和triplets[3*i+2]为BlockInfo类型对象。
该项功能主要应用在DatanodeDescriptor实例的
privatevolatileBlockInfoblockList=null这个字段中。
通过triplets[3*i]可以得到这个Block其他副本的所属datanode的位置,triplets[3*i]为DatanodeDescriptor类型对象
抓住BlockInfo就抓住了整个HDFS按Block进行文件分布式存储的关键。
BlockInfo信息中不仅包括了一个Block都存储在哪些DataNode上,还包含了某个具体datanode上存储的所有Block信息,以及该block属于哪一个INodeFile。用户需要读取文件时首先通过INodeFile得到这个文件所有的Block---INodeFile中的BlockInfo[]getBlocks()方法。通过BlockInfo又可以得到Block存储的DataNodeInfo列表。用户就可以向得到的DataNode列表的机器发送读取Block具体数据的请求(这部分具体实现后面再讲)。
在系统运行过程中,上述关键对象主要存储在内存中,也就是说HDFS的Namenode有一个内存镜像,其中的内容就是以上对象组成的树形结构,也许有人会问,如果Namenode当机会出现什么问题呢?这个问题问得好:)(具体的解决办法后续会详细讲解,目前先提一下)
HDFS为了能够保证数据安全性,完整性,采用和数据库一样的容灾机制,记录数据操作行为日志:对应的功能对象为FSEditLog。
系统定时将内存中的文件系统结构镜像序列化到磁盘(FsImage),并删除当前的EditLog。如果系统机器重启,Namenode会从镜像文件中读取目录结构信息,同时执行EditLog中记录的操作,用以恢复最新的内存镜像。
FSDirectory
FSdirectory的一个主要作用是就是上述所说的从镜像文件中读取目录结构信息,同时执行EditLog中记录的操作,用以恢复最新的内存镜像。
FSdirectory另一个主要作用就是操作INodeDirectory,INodeFile对象,对文件系统的目录,文件以及文件包含的Block进行操作。FSdirectory有一个关键属性:rootDir,这个对象是整个文件系统的根目录。
该对象涉及的主要方法如下:
voidloadFSImage(Collection<File>dataDirs,Collection<File>editsDirs,StartupOptionstartOpt)throwsIOException
booleanmkdirs(Stringsrc,PermissionStatuspermissions,
booleaninheritPermission,longnow)
BlockaddBlock(Stringpath,INode[]inodes,Blockblock)throwsIOException
private<TextendsINode>TaddChild(INode[]pathComponents,intpos,Tchild,longchildDiskspace,booleaninheritPermission)
throwsQuotaExceededException
INodeFileUnderConstruction
这个类继承自INodeFile,它的实例代表一个正在处于写入状态的文件,新文件的创建和文件的追加(文件追加目前HDFS支持不是很好)时都会使用到这个对象,INode有一个方法booleanisUnderConstruction(),如果这个方法返回true,表示这个对象目前处于写入状态,可以将这个对象引用转化为INodeFileUnderConstruction。
当文件处于isUnderConstruction状态时,往往就和文件租约产生关联,因为文件的写入操作都会首先实现申请一个租约(租约有专门一章进行讲解),从FSNameSystem的startFileInternal()方法中的部分逻辑代码可以看出端倪。
//首先判断文件是否存在,并且处于文件写入状态
if(myFile!=null&&myFile.isUnderConstruction())
{
//转换文件为INodeFileUnderConstruction类型
INodeFileUnderConstructionpendingFile=
(INodeFileUnderConstruction)myFile;
//Ifthefileisunderconstruction,thenitmustbeinour
//leases.Findtheappropriateleaserecord.
//如果文件处于写入状态一定有租约与之对应
Leaselease=
leaseManager.getLease(newStringBytesWritable(holder));
下面我们分析一下INodeFileUnderConstruction的关键属性以及方法
INodeFile这个对象仅仅表示一个文件节点,它的大部分属性都是与BlockInfo相关的。
而INodeFileUnderConstruction就会有一些文件创建以及追加时必要的信息,,详细如下:
//这个属性表示当前文件的租约属主是哪次应用
StringBytesWritableclientName=null;//leaseholder
StringBytesWritableclientMachine=null;
//client很可能也是datanode其中之一
DatanodeDescriptorclientNode=null;//ifclientisaclusternodetoo.
//这个属性主要应用于block的recover操作(该操作后续会详细描述)
privateintprimaryNodeIndex=-1;//thenodeworkingonleaserecovery
//文件最后一个block需要写入的机器,这是很重要的属性,也是显而易见的,文件的追加写入一定是对最后一个Block进行操作
privateDatanodeDescriptor[]targets=null;//locationsforlastblock
privatelonglastRecoveryTime=0;
下面看一个很重要的方法,这个方法后续会详细描述。
voidassignPrimaryDatanode()
当文件写入过程中,很可能在某些datanode上写入失败,这就需要对block进行recover操作,而恢复操作中的主节点就是那些写入正常的datanode。
分享到:
相关推荐
本文重在探索hdfs分布式文件系统的元数据合并及更新原理。
hdfs文件的查看 hdfs fs -cat /文件名
Java管理hdfs文件和文件夹的工具类,最近版本hadoop2.4。
hdfs文件的下载
hdfs 文件的上传,hdfs fs -put /文件名
本文档是关于hadoop中HDFS的文件读写操作的一份ppt,适用于学习hadoop新手.
HDFS文件系统,大数据资源文件
文档详细的讲述了Hadoop中HDFS文件操作命令和HDFS编程
hdfs文件传输调优,hdfs文件传输调优 hdfs文件传输调优
本文档时Hadoop云计算平台下运用Hadoop API对HDFS进行相关的操作,详细的记录了程序在eclipse中的应用,代码内容和运行结果,是学习Hadoop非常有用的资料。
storm-hdfs, 用于与HDFS文件系统交互的风暴组件 风暴 HDFS用于与HDFS文件系统交互的风暴组件用法以下示例将在每 1,000个元组同步后将管道("|") -delimited文件写入HDFS路径 hdfs://localhost:54310/foo.,使它的对...
python解析hdfs文件内容生成本地文件、及相关插件包安装实现方式
windows平台下的HDFS文件浏览器,就像windows管理器一样管理你的hdfs文件系统。现在官网已经停止更新这款软件。具体配置如下: HDFS配置页面及端口http://master:50070 配置HDFS服务器 配置WebHDFS HDFS Explorer...
主要介绍了Python连接HDFS实现文件上传下载及Pandas转换文本文件到CSV操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
Hadoop hdfs文件操作,单词统计MR代码 demo,topN求解编程代码 demo
java对大数据HDFS文件操作jar包和maven2个项目,有jar包,有依赖,2个项目呦
3、HDFS的使用(读写、上传、下载、遍历、查找文件、整个目录拷贝、只拷贝文件、列出文件夹下文件、删除文件及目录、获取文件及文件夹属性等)-java 网址:...
上传文件到HDFS的java代码实现。已经测试了,可以直接运行。
在搭建完hadoop大数据系统(CDH5.16.1)后,如何访问hdfs文件系统上的数据呢?那当然是通过构建maven项目 使用java api接口进行文件了。为此,特别进行了hdfs文件系统java api访问的整理。
hdfs写的原理,描述客户端如何将数据写的hdfs中的详细过程