Hadoop-FSDataset

FSDataset

FSDir

1getGenerationStampFromFile(File[] listdir, File blockFile)

获取时间戳,data存取在Datanode上的规则是blk_blockId,metadata存储在blk_blockId_timeStamp.meta

2getBlockInfo(TreeSet<Block> blockSet)

获取block对应的info包括Filelength,和timestamp

3getBlockAndFileInfo(TreeSet<BlockAndFile> blockSet)

与上面相同,不同是获得绝对路径

4getVolumeMap(HashMap<Block, DatanodeBlockInfo> volumeMap, FSVolume volume)

把所有文件放到一个map

5checkDirTree()

检查dir状态

6clearPath(File f, String[] dirNames, int idx)

目前看就是减少block数,在上层会有解决

FSVolume

FSVolume有以下属性:

private File currentDir; //保存到的目录

private FSDir dataDir; //目前的目录对应的FSDir

private File tmpDir;

private File blocksBeingWritten; // clients write here

private File detachDir; // copy on write for blocks in snapshot

private DF usage;

private DU dfsUsage;

private long reserved; //为系统其它部分留取的空间

在其初始化的阶段对各个文件夹初始化,对于blocksBeingWritten目录如果其支持append操作,那么其中的文件不能够被删除。

1addBlock(Block b, File f)

tmp文件夹下已经写完的文件放到current文件夹下

2recoverBlocksBeingWritten(File bbw)

dn挂掉时,之前正在写的文件

FSVolumeSet

保存了FSVlumeset,如果在conf中设置了多个文件,就对应了多个FSVolume

ActiveFile

文件写的时候会进入active状态,ActiveFile类就是针对这种情况进行处理

1File findMetaFile(final File blockFile)

获取metafile

2long parseGenerationStamp(File blockFile, File metaFile)

获取timeStamp

3synchronized File findBlockFile(long blockId)

获得block文件,锁机制解决

4synchronized Block getStoredBlock(long blkid)

获得block,同上,但是获得的时block

5MetaDataInputStream getMetaDataInputStream(Block b)

获得metadata的输入流,这个用来验证等

FSDataSet类的成员有

FSVolumeSet volumes;

private HashMap<Block,ActiveFile> ongoingCreates = new HashMap<Block,ActiveFile>();

private int maxBlocksPerDir = 0;

HashMap<Block,DatanodeBlockInfo> volumeMap = new HashMap<Block, DatanodeBlockInfo>();;

static Random random = new Random();

private int validVolsRequired;

FSDatasetAsyncDiskService asyncDiskService;

记住一条block等已经进行了序列化,可以在网络中进行传输,包含了所有的block信息

1synchronized long getVisibleLength(Block b)

获得blocklength,如果正在些,就获得目前已经能够看到的length

2synchronized File getBlockFile(Block b)

获得block对应的file

3synchronized InputStream getBlockInputStream(Block b, long seekOffset)

获得对应blockfileInputStream,最终返回的是FileInputStream

4synchronized BlockInputStreams getTmpInputStreams(Block b,

long blkOffset, long ckoff)

返回的时blockchecksum的封装的inputStream

5BlockWriteStreams createBlockWriteStreams( File f , File metafile)

获得向硬盘些的输出流,一个封装

6updateBlock(Block oldblock, Block newblock)

synchronized List<Thread> tryUpdateBlock(Block oldblock, Block newblock)

首先获得该block是否对应了正在写的线程。如果没有则update当前的block状态。

7writeToBlock(Block b, boolean isRecovery,

boolean replicationRequest)

这是很重要的一个方法。对于isRecovery的情况,有一种时由于block已经写入Dn但是有些ack没有返回的时候dn挂掉了,重启后会重新向NN汇报。另外的情况就是append操作。

1)首先会检查该block是否已经存在,并且可以被recovery,进行recovery

2)如果该block存在,但是正在被创建中,并且不是append的操作则抛出异常,由Datanode捕捉异常,再打log。表示该block已经存在了

3)如果该block存在,且正在append,则停止所有append的进程。

4)接着对append操作进行处理,首先获得原来的block信息,将原有的meta更换为现在的meta,将blockmeta放到tmp目录中,同时防盗volumeMap

5)最后生成一个BlockWriteStreams的流,进行写操作

8boolean delBlockFromDisk(File blockFile, File metaFile, Block b)

删除blockmeta数据

9Block[] getBlockReport()

获得所有的block信息

posted on 2011-10-14 16:13  萌@宇  阅读(691)  评论(0编辑  收藏  举报

导航