




已阅读5页,还剩43页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Hadoop之HDFS研究前言:网上已经有了一些技术博客来分析Hadoop,这里的分析基于以下的技术博客,并感谢,本文的源代码分析结合了技术博客和hadoop0.19.0版本的源代码,并融入了自己的理解。汇总如下,/ 侧重HDFS的分析,是我学习的重要参考资料和起点。/ 侧重MapReduce的分析,暂时还没有深入学习。/javenstudio/ 有部分Hadoop,也有Lucene的分析。暂时还没有深入学习。/core/docs/current/api/ hadoop的官方API说明本文的分析以/为基础,但侧重点不同。本文分析的目标如下:1, 删繁就简,考虑一个最简单、能跑起来的HDFS是如何实现的,对于一些系统升级等细节不涉及。2, 理清系统的主要模块之间的交互关系,便于从整体上把握系统。对模块采用内外两种方式分析。先搞明白模块的外部接口,干什么用,怎么用。再考虑模块的内部是如何怎么实现的。技术博客中对模块内部是如何实现的解释比较多,本文更多的从如何使用模块的角度讲3, 从改进和研究的角度去看系统,重点关注有研究价值部分的代码(例如,块的放置策略,MapReduce的调度策略)实现,找到相关的代码,搞清楚修改代码需要使用哪些API,目前的实现策略是什么。目前状况:分析了部分代码,NameNode的分析只完成了部分,很多细节还没有看明白。整体概览主要的包与功能介绍PackageDependencestool提供一些命令行工具,如DistCp,archivemapreduceHadoop的Map/Reduce实现filecache提供HDFS文件的本地缓存,用于加快Map/Reduce的数据访问速度fs文件系统的抽象,可以理解为支持多种文件系统实现的统一文件访问接口hdfsHDFS,Hadoop的分布式文件系统实现ipc一个简单的IPC的实现,依赖于io提供的编解码功能参考:/blog/86306io表示层。将各种数据编码/解码,方便于在网络上传输。完成对象的序列化与反序列化。net封装部分网络功能,如DNS,socketsecurity用户和用户组信息conf系统的配置参数metrics系统统计数据的收集,属于网管范畴util工具类record根据DDL(数据描述语言)自动生成他们的编解码函数,目前可以提供C+和Javahttp基于Jetty的HTTP Servlet,用户通过浏览器可以观察文件系统的一些状态信息和日志log提供HTTP访问日志的HTTP ServletHDFS的设计概述:NameNode的设计维护名字空间,是HDFS中文件目录和文件分配的管理者。保存的重要信息如下:文件名 数据块 ,NameNode在其本地磁盘上保存为文件(持久化)对目录树和文件名的更新数据块, 使用操作日志来保存更新。数据块 DataNode列表 ,NameNode不存,通过DataNode上报建立起来。一个HDFS集群上可能包含成千个DataNode节点,这些DataNode定时和NameNode通信,接受NameNode的指令。为了减轻NameNode的负担,NameNode上并不永久保存那个DataNode上有那些数据块的信息,而是通过DataNode启动时的上报,来更新NameNode上的映射表。DataNode和NameNode建立连接以后,就会不断地和NameNode保持心跳。心跳的返回其还也包含了NameNode对DataNode的一些命令,如删除数据库或者是把数据块复制到另一个DataNode。应该注意的是:NameNode不会发起到DataNode的请求,在这个通信过程中,它们是严格的客户端/服务器架构。DataNode当然也作为服务器接受来自客户端的访问,处理数据块读/写请求。DataNode之间还会相互通信,执行数据块复制任务,同时,在客户端做写操作的时候,DataNode需要相互配合,保证写操作的一致性。下面我们就来具体分析一下DataNode的实现。DataNode的实现包括两部分,一部分是对本地数据块的管理,另一部分,就是和其他的实体打交道。我们先来看本地数据块管理部分。安装Hadoop的时候,我们会指定对应的数据块存放目录,当我们检查数据块存放目录目录时,我们回发现下面有个叫dfs的目录,所有的数据就存放在dfs/data里面。其中有两个文件,storage里存的东西是一些出错信息,貌似是版本不对云云。in_use.lock是一个空文件,它的作用是如果需要对整个系统做排斥操作,应用应该获取它上面的一个锁。接下来是3个目录,current存的是当前有效的数据块,detach存的是快照(snapshot,目前没有实现),tmp保存的是一些操作需要的临时数据块。但我们进入current目录以后,就会发现有一系列的数据块文件和数据块元数据文件。同时还有一些子目录,它们的名字是subdir0到subdir63,子目录下也有数据块文件和数据块元数据。这是因为HDFS限定了每个目录存放数据块文件的数量,多了以后会创建子目录来保存。数据块文件显然保存了HDFS中的数据,数据块最大可以到64M。每个数据块文件都会有对应的数据块元数据文件。里面存放的是数据块的校验信息。下面是数据块文件名和它的元数据文件名的例子:blk_3148782637964391313blk_3148782637964391313_242812.meta上面的例子中,3148782637964391313是数据块的ID号,242812是数据块的版本号,用于一致性检查。在current目录下还有下面几个文件:VERSION,保存了一些文件系统的元信息。dncp_block_verification.log.curr和dncp_block_verification.log.prev,它记录了一些DataNode对文件系定时统做一致性检查需要的信息。 DataNode的设计存储数据块,一个数据块在多个DataNode上有备份,而一个DataNode上对于一个数据块最多只有一个备份。NameNode和DataNode的实现HDFS的包的结构图:org/apache/hadoop/hdfs/ |- protocol |- Block|- BlockListAsLongs|- BlocksWithLocations|- ClientDataNodeProtocol|- ClientProtocol|- DataNodeID|- DataNodeInfo|- DataTransferProtocol|- FSConstants|- LocatedBlock|- LocatedBlocks|- server|- common|- GenerationStamp |- HdfsConstants|- Storage |- StorageInfo|- Upgrade相关的|- protocol|- DatanodeRegistration|- DatanodeProtocol|- NamenodeProtocol|- NamespaceInfo|- NamespaceProtocol|- InterDatanodeProtocol|- DatanodeCommand|- BlockMetadataInfo|- DatanodeCommand|- BlocksWithLocations|- datanode|- BlockReceiver|- BlockSender|- BlockTransferThrottler|- DataNode|- DatanodeBlockInfo|- DataStorage|- DataXceiver|- DataXceiver Server|- FSDataSetInterface|- FSDataSet|- namenode|- |- |- |- |- |- |- |- |- |- |- |- |- |- |- |- |- |- |- |- |- NameNode的实现INode相关的类我们先分析INode*.java,类INode*抽象了文件层次结构。如果我们对文件系统进行面向对象的抽象,一定会得到和下面一样类似的结构图(类INode*):INode是一个抽象类,它的两个子类,分别对应着目录(INodeDirectory)和文件(INodeFile)。INodeDirectoryWithQuota,如它的名字隐含的,是带了容量限制的目录。INodeFileUnderConstruction,抽象了正在构造的文件,当我们需要在HDFS中创建文件的时候,由于创建过程比较长,目录系统会维护对应的信息。 INode类成员变量含义protected byte name目录/文件名protected INodeDirectory parent指向了父目录protected long modificationTime最后的修改时间protected long accessTime最后的访问时间private long permission访问权限。HDFS采用了和UNIX/Linux类似的访问控制机制。系统维护了一个类似于UNIX系统的组表(group)和用户表(user),并给每一个组和用户一个ID,permission在INode中是long型,它同时包含了组和用户信息。static class DirCounts long nsCount = 0;long dsCount = 0;nsCount 使用的NameSpace的个数dsCount 使用的DiskSpace的个数成员方法含义int collectSubtreeBlocksAndClear(List v)用于收集这个INode所有子树中的Block,放到List v中,并清除INodeFile中的Block。抽象方法,具体实现参考INodeFile中的实现,更清楚。long computeContentSummary(long summary)用于递归计算INode包含的一些相关信息,如文件数,目录数,占用磁盘空间。对输入的long summary中的相应的值进行累计,再返回。Summary数组的下标对应的值的含义如下:0: length, 1: file count, 2: directory count 3: disk space这个写的很不习惯。static byte getPathComponents(String path)例如,给出path /home/wangpeng/hadoop返回二维数组: “ ”“home” “wangpeng” “hadoop” INodeDirectory对HDFS目录的抽象。成员变量含义protected static final int DEFAULT_FILES_PER_DIRECTORY = 5每个目录下的默认文件个数设置为常量5final static String ROOT_NAME = private List children保存该目录下所有的目录/文件集合这几个方法的含义没有看明白?成员方法含义int getExistingPathINodes(byte components, INode existing)INode getExistingPathINodes(String path) INodeDirectoryWithQuota进一步加强了INodeDirectory,限制了INodeDirectory可以使用的空间(包括NameSpace和磁盘空间)。 INodeFile成员变量含义protected BlockInfo blocks = null保存所有的块,BlockInfo增强了Block类protected short blockReplication块的副本个数,如每个块做3次备份protected long preferredBlockSize期望的块大小,如 64MB/块 INodeFileUnderConstructionINodeFileUnderConstruction保存了正在构造的文件的一些信息。成员变量含义StringBytesWritable clientName = null目前拥有租约的节点名(创建文件时,只有一个节点拥有租约,其他节点配合这个节点工作)StringBytesWritable clientMachine = null构造该文件的客户端名称,如果构造请求由DataNode发起,clientNode会保持相应的信息DatanodeDescriptor clientNode = nullprivate int primaryNodeIndex = -1private DatanodeDescriptor targets = null保存了配合构造文件的所有节点private long lastRecoveryTime = 0DataNode*类上面描述了INode*类的关系。下面我们顺便考察一下一些NameNode上的数据类。BlocksMap保存了Block和它在NameNode上一些相关的信息。其核心是一个map:Map。BlockInfo扩展了Block,保存了该Block归属的INodeFile和DatanodeDescriptor,同时还包括了它的前继和后继Block。有了BlocksMap,就可以通过Block找对应的文件和这个Block存放的DataNode的相关信息。 BlockMap类保存block和block的元数据(块属于哪个INode、保存该块的datanodes)的映射关系。定义了内部类BlockInfo表示block的元数据。BlockInfo类内部的主要结构如下:DDPBDatanodeDescriptorPrevious BlockInfoNext BlockInfotriplets数组NBindex = 0index = 1index = 2BlockInfo对象内部BlockInfo对象外部成员方法含义public BlockInfo(Block blk, int replication)给出Block类型的blk变量,该块的副本个数replication,生成该块的元数据,BlockInfo类型的对象。DatanodeDescriptor getDatanode(int index)获得该块的第index个Datanode的信息,返回DatanodeDescriptor类型的对象private int ensureCapacity(int num) private int getCapacity() 获的块的所有的副本个数,因为可能会增大副本个数private int ensureCapacity(int num) 多增加num个单元上面的图,给出了类型是object的triplets数组,如果一个块设置的副本个数是3,那么该块的3个相应的元数据信息BlockInfo可以通过tripletsindex*3来访问。BlockInfo类写得好像很怪异,不知道为什么这么写?应该很简单,用一个list结构保存块的所有的元数据信息就可以了,好像在实现上用了一个内部的数组来实现链表的功能? BlockMap类成员变量与方法含义private Map map = new HashMap()哈希表,key是block,value是BlockInfo,即块的元数据。类(从上到下依次继承)用途位置DatanodeID配置信息tocol包下DatanodeInfo进一步,增加了一些动态信息tocol包下DatanodeDescriptor再进一步,包含了DataNode上一些Block的动态信息。node包下 DatanodeDescriptor类保存指定DataNode的状态(如可用的存储空间大小、上次的更新时间等)、维护DataNode上的块。内存中的数据结构,并不持久化到fsImage中,并且只在NameNode内部使用。DatanodeDescriptor类内部有两个内部类:BlockTargetPair和BlockQueueBlockTargetPair保存Block和对应DatanodeDescriptor的关联成员变量含义public final Block blockpublic final DatanodeDescriptor targetsBlockQueue是BlockTargetPair队列。private final Queue blockq = new LinkedList();成员变量含义private volatile BlockInfo blockList = null该Datanode上包含的数据块元数据的列表protected boolean isAlive = falseprivate BlockQueue replicateBlocks = new BlockQueue()该DataNode上正在复制(replicateBlocks)的块private BlockQueue recoverBlocks = new BlockQueue()该DataNode上正在Lease恢复(recoverBlocks)的Blockprivate Set invalidateBlocks = new TreeSet()该DataNode上已经失效的Blockprivate int currApproxBlocksScheduled = 0; private int prevApproxBlocksScheduled = 0;private long lastBlocksScheduledRollTime = 0;private static final int BLOCKS_SCHEDULED_ROLL_INTERVAL = 600*1000;10分钟成员方法含义public DatanodeDescriptor(DatanodeID nodeID, String networkLocation, String hostName, long capacity, long dfsUsed, long remaining, int xceiverCount)Capacity:datanode的容量,包括非DFS使用的空间。dfsUsed:datanode中被DFS使用的容量。Remaining:datanode剩下的容量。xceiverCount:datanode中数据传输的xceiverCount次数。 ?DatanodeDescriptor提供一系列方法,用于操作上面保存的队列和集合。也提供get*Command方法,用于生成发送到DataNode的命令。当NameNode收到DataNode对现在管理的Block状态的汇报是,会调用reportDiff,找出和现在NameNode上的信息差别,以供后续处理用。readFieldsFromFSEditLog方法用于从日志中恢复DatanodeDescriptor。前面我们提过关系:文件名数据块持久化在磁盘上,所有对目录树的更新和文件名数据块关系的修改,都必须能够持久化。为了保证每次修改不需要从新保存整个结构,HDFS使用操作日志,保存更新。现在我们可以得到NameNode需要存储在Disk上的信息了,包括:hadooplocalhost dfs$ ls -R namename:current image in_use.lockname/current:edits fsimage fstime VERSIONname/image:fsimagein_use.lock的功能和DataNode的一致。fsimage保存的是文件系统的目录树,edits则是文件树上的操作日志,fstime是上一次新打开一个操作日志的时间(long型)。image/fsimage是一个保护文件,防止0.13以前的版本启动(0.13以前版本将fsimage存放在name/image目录下,如果用0.13版本启动,显然在读fsimage会出错J)。FSImage类用途:处理检查点和NameSpace的修改日志FSEditLog类维护namespace修改的日志。该类提供了NameNode操作日志和日志文件的相关方法,相关类图如下:LeaseManager相关的类FSDirectory类FSNamesystem类common包的分析: GenerationStamp类内部是long类型的成员变量,表示时间戳,下一个值增加1。 FsConstants定义了一些常量。static public enum NodeType NAME_NODE, / 节点类型,namenode DATA_NODE; / 节点类型,datanode启动HDFS的时候,我们可以选择以下启动参数:FORMAT(-format):格式化系统 REGULAR(-regular):正常启动 UPGRADE(-upgrade):升级 ROLLBACK(-rollback):回滚 FINALIZE(-finalize):提交 IMPORT(-importCheckpoint):从Checkpoint恢复。 / 与DataNode通信,流式读写的超时 public static int READ_TIMEOUT = 60 * 1000; public static int WRITE_TIMEOUT = 8 * 60 * 1000; public static int WRITE_TIMEOUT_EXTENSION = 5 * 1000; /流水线写 StorageInfo和Storage基本作用是保存本地存储上的文件系统的元信息、系统状态等。/homewangpengHDFScurrentdetachtmpin_use.lockstorage空文件,对整个系统做互斥操作操作需要的临时数据块出错信息快照blk_314块数据文件blk_314_23.meta元数据文件subdir0- subdir63VERSION文件系统的元信息本地存储信息保存在VERSION文件中,下面是某一个DataNode的VERSION文件的例子:配置文件代码 #FriNov1410:27:35CST2008namespaceID=1950997968storageID=DS-697414267--50010-1226629655026cTime=0storageType=DATA_NODE layoutVersion=-16#Fri Nov 14 10:27:35 CST 2008namespaceID=1950997968storageID=DS-697414267--50010-1226629655026cTime=0storageType=DATA_NODElayoutVersion=-16本地可以在多个目录下存储数据,每个存储数据的目录用StorageDirerctory类的对象来表示。要求每个存储目录包含相同的VERSIION文件,当启动了NameNode和DataNode,读取VERSION文件(使用StorageDirectory类的read和write方法),并锁住每个存储目录(使用in_use.lock文件,对整个系统加锁和解锁,StorageDirectory类的lock和unlock方法)。 public class StorageDirectory File root; / 根目录 FileLock lock; / 锁文件 StorageDirType dirType; / 存储目录的类型。StorageDirType是一个接口类型最重要的方法public StorageState analyzeStorage(StartupOption startOpt)简单的说,就是根据一些目录和文件来判断该存储数据的目录的状态。Storage类主要的成员变量如下: private NodeType storageType; / 该节点的类型,NameNode还是DataNode protected List storageDirs = new ArrayList(); / 用一个数组来保存该节点上的所有的存储数据的目录另外,就是定义了一些常量,例如,目录和文件名 private static final String STORAGE_FILE_LOCK = in_use.lock; protected static final String STORAGE_FILE_VERSION = VERSION; public static final String STORAGE_DIR_CURRENT = current; private static final String STORAGE_DIR_PREVIOUS = previous; private static final String STORAGE_TMP_REMOVED = removed.tmp; private static final String STORAGE_TMP_PREVIOUS = previous.tmp; private static final String STORAGE_TMP_FINALIZED = finalized.tmp; private static final String STORAGE_TMP_LAST_CKPT = lastcheckpoint.tmp; private static final String STORAGE_PREVIOUS_CKPT = previous.checkpoint;数据块的实现FSDataset类的分析FSDir,FSVolume,FSVolumeSet之间的关系。FSDir就是存放数据块的目录树FSVolume,可以看成是一个完整的能够存放块数据的存储结构,除了FSDir,还包括temp目录,FSVolumeSet,管理多个FSVolume对象。该UML类图涉及的类分别介绍: Block类:块的元数据信息。块的格式如下:一个块包含两个文件:块号,31244, 时间戳,213blk_31244 数据文件blk_31244_213.meta 校验文件。成员变量含义private long blockId;块的id,即上面的31244private long numBytes;块的字节长度private long generationStamp;块创建的时间戳其中,时间戳,有一个专门的类/Hadoop-0.19/src/hdfs/org/apache/hadoop/hdfs/server/common/GenerationStamp.java其内部的实现就是采用了一个long变量,表示时间戳的值,每次加1的方式来递增。另外,从/Hadoop-0.19/src/test/org/apache/hadoop/hdfs/TestFileCorruption.java的174行,可用看出上面例子中的213,实际上就是时间戳。public static final long WILDCARD_STAMP = 1;wildcard通配符,相当于默认的时间戳,例如,创建一个新块时,时间戳就赋值为该值。public static final long FIRST_VALID_STAMP = 1000L; FSDataset类这个类包含的几个内部类。首先分析FSDir类。FSDir类:建立DataNode上块文件的树状存储结构。成员变量含义File dir; DataNode上本地的一个目录,int numBlocks = 0;该目录dir下的块文件的个数FSDir children;保存dir目录下的子目录int lastChildIdx = 0;这个变量记录上次在dir的子目录下,哪个子目录(索引)下添加了新块。注意,添加到哪个子目录下是随机选的主要的方法方法的含义public FSDir(File dir)给定目录dir后,递归的创建其底下的块文件的树状结构。private File addBlock(Block b, File src, boolean createOk, boolean resetIdx)该方法是将块b和对于的文件src,添加到DataNode节点的本地块的树状目录中(在本地文件系统上移动块文件)。注意,这是个递归方法,考虑的情况比较多。public File addBlock(Block b, File src)该方法又再次包装了上面的方法Public void getBlockInfo(TreeSet blockSet)该方法,是将目录树下的所有的block放到blockSet集合中void getVolumeMap(HashMap volumeMap, FSVolume volume)将目录下的所有的key block和Value DatanodeBlockInfo,作为键值对,放入volumeMap哈希表中。这里,用到了DatanodeBlockInfo类void clearPath(File f)没看明白 FSVolume类好像是对FSDir类进行了再次的封装,增加了一些新的成员变量,例如temp文件等。一个FSVolume对象,就是一个完整的能够存放块数据的存储空间。成员变量的含义:private FSDir dataDir;存放块数据文件的目录private File tmpDir;临时目录private File detachDir;?private DF usage;DF类是一个继承了shell的类,调用unix的df命令,获取磁盘的使用统计private DU dfsUsage;DU类是一个继承了shell的类,调用unix的du命令,获取目录下的磁盘使用了的空间。 dfsUsage.incDfsUsed(b.getNumBytes()+metaFile.length();使用的空间(块文件的大小和校验文件的大小),加入到对象中。private long reserved;预留的空间大小,返回的可用空间大小 实际可用的空间大小 预留的空间大小主要的方法:void decDfsUsed(long value)getAvailablegetUsedreversedgetCapacity可能的关系,不一定对。?long getDfsUsed()long getCapacity()long getAvailable() File createTmpFile(Block b) 给出块,在temp目录下创建该block对应的文件,在temp目录下,更加block的快号,创建文件名,返回File对象private void recoverDetachedBlocks(File dataDir, File dir) ? DatanodeBlockInfo类建立块文件和其属于哪个FSVolume之间的映射关系。成员变量含义private FSVolume volume; 块属于哪个FSVolumeprivate File file;块的文件名,private boolean detached; copy-on-write done for block FSVolumeSet类成员变量含义FSVolume volumes = null;FSVolume的数组,即存储块的FSVolume的数组。int curVolume = 0;当前的Volume的下标主要的方法,都是基于FSVolume的方法,进一步扩展。使用方式: volumes = new FSVolumeSet(volArray); ActiveFile静态类写一个块会使该文件处于活跃状态。该类用来保存一个文件对象和操作该文件的线程。线程可以有多个,ActiveFile构造函数会自动把当前线程加入其中。 FSDataSet类成员变量含义FSVolumeSet volumes存放所有的FSVolumeprivate HashMap ongoingCreates = new HashMap()Block到ActiveFile的哈希表,即正在创建的block都会记录到ongoingCreatesprivate int maxBlocksPerDir = 0private HashMap volumeMap = nullBlock到DatanodeBlockInfo的哈希表,这里用到了DatanodeBlockInfo类成员方法含义public long getMetaDataLength(Block b) 通过block的ID,找对应的元数据文件,返回元数据文件长度。public MetaDataInputStream getMetaDataInputStream(Block b)通过block的ID,找对应的元数据文件,在上面打开输入流。public long getLength(Block b) throws IOException block的长度public synchronized File getBlockFile(Block b) 给出一个块,返回块的文件名public synchronized BlockInputStreams getTmpInputStreams(Block b, long blkOffset, long ckoff) 得到Block的临时输入流。注意,临时输入流是指对应的文件处于tmp目录中。新创建块时,块数据应该写在tmp目录中,直到写操作成功,文件才会被移动到current目录中,如果失败,就不会影响current目录了。public BlockWriteStreams writeToBlock(Block b, boolean isRecovery) 参考下面的进一步解释public void updateBlock(Block oldblock, Block newblock) 参考下面的进一步解释public synchronized void finalizeBlock(Block b) 参考下面的进一步解释public synchronized void unfinalizeBlock(Block b) 取消通过writeToBlock打开的block,与finalizeBlock方法作用相反。public BlockWriteStreams writeToBlock(Block b, boolean isRecovery)得到一个block的输出流。BlockWriteStreams既包含了数据输出流,也包含了元数据(校验文件)输出流,这是一个相当复杂的方法。参数isRecovery说明这次写是不是对以前失败的写的一次恢复操作。我们先看正常的写操作流程:首先,如果输入的block是个正常的数据块,或当前的block已经有线程在写,writeToBlock会抛出一个异常。否则,将创建相应的临时数据文件和临时元数据文件,并把相关信息,创建一个ActiveFile对象,记录到ongoingCreates中,并创建返回的BlockWriteStreams。前面我们已经提过,建立新的ActiveFile时,当前线程会自动保存在ActiveFile的threads中。我们以blk_3148782637964391313为例,当DataNode需要为Block ID为3148782637964391313创建写流时,DataNode创建文件tmp/blk_3148782637964391313做为临时数据文件,对应的meta文件是tmp/blk_3148782637964391313_XXXXXX.meta。其中XXXXXX是版本号。isRecovery为true时,表明我们需要从某一次不成功的写中恢复,流程相对于正常流程复杂。如果不成功的写是由于提交(参考finalizeBlock方法)后的确认信息没有收到,先创建一个detached文件(备份)。接着,writeToBlock检查是否有还有对文件写的线程,如果有,则通过线程的interrupt方法,强制结束线程。这就是说,如果有线程还在写对应的文件块,该线程将被终止。同时,从ongoingCreates中移除对应的信息。接下来将根据临时文件是否存在,创建/复用临时数据文件和临时数据元文件。后续操作就和正常流程一样,根据相关信息,创建一个ActiveFile对象,记录到ongoingCreates中由于这块涉及了一些HDFS写文件时的策略,以后我们还会继续讨论这个话题。public void updateBlock(Block oldblock, Block newblock)更新一个block。这也是一个相当复杂的方法。updateBlock的最外层是一个死循环,循环的结束条件,是没有任何和这个数据块相关的写线程。每次循环,updateBlock都会去调用一个叫tryUpdateBlock的内部方法。tryUpdateBlock发现已经没有线程在写这个块,就会跟新和这个数据块相关的信息,包括元文件和内存中的映射表volumeMap。如果tryUpdateBlock发现还
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年中国电信股份有限公司安徽分公司校园招聘202人考试参考试题及答案解析
- 2025贵州贵阳综保产业发展有限公司(第一批)对外补岗招聘2人备考考试题库附答案解析
- 2025西安碑林仁华医院医养中心招聘(2人)考试参考试题及答案解析
- 2026建信养老金管理有限责任公司校园招聘9人笔试备考题库及答案解析
- 2025广东梅州市大埔县高陂中学招聘顶岗教师3人备考考试题库附答案解析
- 2025江西吉安新干县引进名师名校长1人备考考试题库附答案解析
- 食品中新兴污染物监测-洞察及研究
- 宜宾市卫生健康委员会2025年公开招募医疗卫生辅助岗位(市级单位)的补充备考考试题库附答案解析
- 2025山东省黄三角农高区城乡公益性岗位招聘54人备考考试题库附答案解析
- 住院患者健康宣教要点
- 肺栓塞患者护理查房课件
- 合规风险管理制度
- 病毒课件教学课件
- 9月30日烈士纪念日缅怀先烈功绩弘扬先烈精神课件
- 2024年华东师大版八年级数学上册同步练习题及答案
- 数字化印花工艺智能化
- 香雪制药资本结构优化分析
- 2024年高考作文备考之“有用无用”作文导写素材及范文
- DZ∕T 0214-2020 矿产地质勘查规范 铜、铅、锌、银、镍、钼(正式版)
- 无创呼吸机通气模式介绍及临床应用课件
- MOOC 模拟电子电路实验-东南大学 中国大学慕课答案
评论
0/150
提交评论