exo之老婆怀孕:Hadoop_DataNode_代码分析(2)

来源:百度文库 编辑:偶看新闻 时间:2024/04/28 23:01:46

(1)由上文知FSVolume和Storage.StorageDirectory对应,由于HDFS规定了一个目录能存放Block的数目,FSDir对应一个StorageDirectory里面众多存放block的目录。由此FSVolumeSet= Storage,FSVolume=Storage.StorageDirectory,FSDir= StorageDirectory的子目录。FSVolume就是一个通常的那样一个目录,管理着数据块文件,detach文件和临时文件。FSVolume中的recoverDetachedBlocks用来恢复detach的文件,如果detach中存在current中不存在的文件,就把此文件rename到current中,否则什么都不做。DU是FSVolume的一个成员,用来启动一个新的线程时刻跟踪磁盘的使用量,这个跟踪磁盘的使用量的线程会汇报执行异常,在主线程使用这个对象的使用要获得对象锁进而获得最新的异常情况。上面暗含一个通常设置,那就是不同的FSVolume在不同的磁盘上。

(2)FSDataSet处理对Block的操作,需要一个能从block立刻找到block对应的File对象,volumeMap >就来做这个事情。可能存在多个线程正在创建Block ongoingCreates>用来表达这一信息。ActiveFile中有一个File对象和正在操作这个File的线程。(2.1)getTmpInputStreams得到Block的临时输入流。注意,临时输入流是指对应的文件处于tmp目录中。新创建块时,块数据应该写在tmp目录中,直到写操作成功,文件才会被移动到current目录中,如果失败,就不会影响current目录了。注意虽然临时文件夹是为写操作而设计的,但是这个方法用来获得临时文件夹中block的输入流。

(2.2)用来创建block的方法是writeToBlock,这个方法会分两种情况,一种是恢复写操作,一种是新建一个block,第一次写。如果是第一次写并且要新建的block不存在并且ongoingCreates没有block则在临时文件夹中新建文件,把block信息加入volumeMap,把当前线程对block的关系加入ongoingCreates,返回输出流即可。恢复操作可能发生在用户没有成功收到ACK的情况下,这时block应该已经存在并且写入了数据,需要先创建一个detached文件(备份),接着,writeToBlock检查是否有还有对文件写的线程,如果有,则通过线程的interrupt方法,强制结束线程。这就是说,如果有线程还在写对应的文件块,该线程将被终止。同时,从ongoingCreates中移除对应的信息。接下来将根据临时文件是否存在,创建/复用临时数据文件和临时数据元文件。后续操作就和正常流程一样,根据相关信息,创建一个ActiveFile对象,记录到ongoingCreates中……。writeToBlock调用之后DataNode就要开始写一个block了,无论写发生在什么情况下,函数返回时这个block只存在临时文件中(当然可能有备份),这样才能和真正开始写流程结束写流程的操作一致。

(2.3)updateBlock用来更新一个block。updateBlock的最外层是一个死循环,循环的结束条件,是没有任何和这个数据块相关的写线程。每次循环,updateBlock都会去调用一个叫tryUpdateBlock的内部方法。tryUpdateBlock发现已经没有线程在写这个块,就会跟新和这个数据块相关的信息,包括元文件和内存中的映射表volumeMap。如果tryUpdateBlock发现还有活跃的线程和该块关联,那么,updateBlock会试图结束该线程,并等在join上等待。但是这个方法貌似没有用到。

(2.4) finalizeBlock(Block b) 提交(或叫:结束finalize)通过writeToBlock打开的block,这意味着写过程没有出错,可以正式把Block从tmp文件夹放到current文件夹。在FSDataset中,finalizeBlock将从ongoingCreates中删除对应的block,同时将block对应的DatanodeBlockInfo,放入volumeMap中。我们还是以blk_3148782637964391313为例,当DataNode提交Block ID为3148782637964391313数据块文件时,DataNode将把tmp/blk_3148782637964391313移到current下某一个目录,以subdir12为例,这是tmp/blk_3148782637964391313将会挪到current/subdir12/blk_3148782637964391313。对应的meta文件也在目录current/subdir12下。

(2.5)另外还有一些操作block的方法:u nfinalizeBlock和上一个方法相反、isValidBlock验证block是否有效存在等等一些简单方法。