版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Hadoop学习摘要2:分析HDFS读写过程首先,打开文件1.1,客户端HDFS必须打开文件,然后在客户端上调用distributed file system . open(path f,int buffer size),如下所示:public fsdata input stream open(path f,int buffer size)throws io exception return new DFS client . dfsdatasinputstream(Dfs.open (get pathname (f)、buffersize、verify checksum、statistics)
2、;其中DFS是DistributedFileSystem的成员变量,用于调用生成和返回DFS inputstream (src,buffersize,verify checksum)的open函数。在DFSInputStream的构造函数中,openInfo函数主要获取有关要在NameNode中打开的文件中的blocks的信息,如下所示:synchronized void open info()throws io exception localted blocks new info=callget block locations(name node,src,0,prefetch size);t
3、his . located blocks=new info;This.currentNode=nullprivate static localted blocks callgetblocklocations(客户端协议名称节点、Stringsrc、long start、long length) throws ioexceptionreturn name node . getblocklocations(src、start、length);LocatedBlocks主要包含一个链接的List blocks,每个LocatedBlock包含以下信息:Block b:有关此Block的信息长偏移:文
4、件中此块的偏移DatanodeInfo locs:此块位于哪个DataNode上上述NameNode.getBlockLocations是RPC调用,最终调用NameNode类的getBlockLocations函数。1.2,NameNodeNameNode.getBlockLocations的实现如下:public localted blocks get block locations(string src、长偏移、长长度)throws io exceptionreturn name system . getblocklocations(get client machine()、Src、of
5、fset、length);Namesystem是类型为FSNamesystem的NameNode成员变量,用于存储NameNode的name space树,其中一个重要的成员变量是FSDirectory dir。FSDirectory和Lucene的FSDirectory没有关系。主要用于读取和写入硬盘上的FSImage文件(包括FSImage fsImage),fsImage类具有成员变量fseditlog,用于读取和写入硬盘上的edit文件。这两个文件的关系在上一篇文章中讨论过。FSDirectory还具有一个名为INodeDirectoryWithQuota rootDir的重要成员变量
6、,INodeDirectory是实现的inodelivery的超类,如下所示:public class inode directory extends inode .Private List children.这是有关INodeDirectory本身是具有关联列表的索引节点,并且在此关联列表中仍然是文件夹的信息,是有关类型INode directory的信息,是文件的类型INodeFile,是INodeFile中包含成员变量BlockInfo blocks的文件中包含的块的信息。很明显,这是树形结构。FSNamesystem.getBlockLocations函数包括:public local
7、ted blocks get block locations(string src、long offset、long length、boolean do access time)throws io exception final localted blocks ret=getblocklocationsinternal(src,dir.get fileinode (src)、Offset、length、integer.max _ value、do access time);Return retDir.getFileINode(src)通过路径名在文件系统树中查找索引节点文件。其中,存储有关要打
8、开的文件的索引节点的信息。GetBlockLocationsInternal的实现如下:专用同步锁定块getblocklocationsinternal(string src、INodeFile索引节点、长偏移、很长的路,Int nrBlocksToReturn、Boolean doAccessTime)Throws io exception/获取此文件的block信息blockblocks=inode . get blocks();list results=new ArrayList(blocks . length);/计算从offset开始,长度为与length相关的blocksint c
9、urBlk=0;Long curPos=0,blk size=0;Intnr blocks=(blocks 0)。getnumbytes()=0)?0 : blocks.lengthfor(curBlk=0;CurBlk nrBlocksCurBlk) Blk size=blocks curblk。getnumbytes();曲面块大小偏移(if)/如果curPos和curPos blkSize之间存在offset,则curBlk指向offset所在的blockBreakCurPos=blkSizeLong endOff=offset length/循环显示从curBlk开始的每个block,
10、直到当前位置curPos超过endOff东北intnum nodes=block smap . num nodes(blockscurblk);intnumcorruptnodes=count nodes(blockscurblk)。corrupt replicas();intnumcorruptreplics=corrupt replicas . numcorruptreplics(blockscurblk);boolean block corrupt=(numcorruptnodes=num nodes);Int numMachineSet=blockCorrupt?NumNodes :(
11、num nodes-numCorruptNodes);/找到与此block对应的datanode,然后将损坏插入到machineSetdatanodedescriptormachineset=new datanodedescriptornummachineset;If (numMachineSet 0) num nodes=0;For(Iterator it=block smap . node iterator(blockscurblk);it . has next();)DatanodeDescriptor dn=it . next();boolean replica corrupt=cor
12、rupt replicas . isreplicatiuppt(blockscurblk,dn);If (blockCorrupt |(!BlockCorrupt!ReplicaCorrupt)machine setnum nodes=dn;/使用此machineSet和当前block配置LocatedBlockresults . add(new localted block(blockscurblk、machineset、curpos、BlockCorrupt)Curpos=blocks curblk。getnumbytes();CurBlk while (curPos endOffCurB
13、lk blocks.lengthresults . size()nrBlocksToReturn);/使用此LocatedBlock links配置LocatedBlocks对象的返回Return inode。createlocated blocks(results);1.3,客户端通过RPC调用从NameNode获取的LocatedBlocks对象将DFSInputStream对象配置为成员变量,然后包装到FSDataInputStream中并返回给用户。二、读取文件2.1,客户端读取文件时,客户端将打开文件时获取的fs data inputstream . read(long positi
14、on,byte buffer,int offset,int length)函数用于读取文件操作。FSDataInputStream通过调用封装的DFSInputStream的read (long position,byte buffer,int offset,int length)函数实现,如下所示:Public intread (long position,byte buffer,int offset,int length)Throws io exceptionlong filelen=getFileLength();Int realLen=length位置长度文件(if)RealLen=(
15、int)(filelen-position);/首先获取包含offset到offset length内容的block列表/例如,对于64米的单个块文件系统,要读取100米到128米长度的数据,块列表包含块2、3和4list block range=getblock range(position,re Allen);Int remaining=realLen/读取每个block的内容/在上例中,块2的读取长度为36米,读取长度为28米,块3的读取长度为64米,块4的读取长度为0到36米,总计为128米锁定块3360块范围(for)long target start=position-blk .
16、getstartoffset();long bytes to read=math . min(remaining,blk . get blocksize()-target start);Fetchblockbytesrange (blk、targetstart、Targetstart bytes to read-1,buffer,offset);remaining-=bytesToRead;职位=bytesToReadOffset=bytesToReadassert remaining=0 : wrong number of bytes read . ;If(状态!=null) stats . increment bytes read(re Allen);Return realLen其中ge
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 梳理缝编非织造布制作工冲突管理水平考核试卷含答案
- 景泰蓝釉料工岗位安全意识考核试卷含答案
- 纪念红军长征胜利90周年初中生主题宣讲稿
- 2026年辽宁省大连理工大学环境设计专业室内设计原理综合测试卷及答案
- 第8章 市场竞争分析实战
- 环境岗事业编2026面试自测卷模拟练习含答案解析
- 2026年10月自考《中国近现代史纲要》(03708)模拟试卷
- 预防火灾安全教育主题班会课件
- 2026年驾驶证理论考试科目四安全行车心理素质提升课件
- 国资穿透式监管体系构建与案例介绍
- 舞台灯光音箱施工方案
- 鹅圆环病毒感染
- GJB2489A2023航空机载设备履历本及产品合格证编制要求
- 2025年内蒙古自治区中考物理试卷真题(含答案)
- 2025年上海松江国有资产投资经营管理有限公司招聘笔试参考题库含答案解析
- 2025年上海市各区高三二模语文试题汇编《现代文二》含答案
- 礼品礼金管理制度
- 2024省技能大赛植物嫁接赛项备考试题库(含答案)
- 公安民警矛盾纠纷调解培训
- 20. 曹刿论战 第2课时课件(28张)
- 军港之夜混声合唱谱
评论
0/150
提交评论