- 浏览: 2105879 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
无心流泪wan:
private static final Log log = ...
log4j Category.callAppenders Block -
yjxa901:
博主好: http://www.java.net/down ...
jdk debug -
aptech406328627:
大神,请接收我的膜拜吧,纠结了两天的问题,就这么让你给解决了 ...
java.lang.reflect.MalformedParameterizedTypeException -
xukunddp:
谢谢1楼,我也遇到,搞定了
java.lang.reflect.MalformedParameterizedTypeException -
di1984HIT:
学习了!!!!
jvmstat hsperfdata java.io.tmpdir
今天来总看下namenode这个类的主要功能
首先看下这个类的注释说明:
/********************************************************** * NameNode serves as both directory namespace manager and * "inode table" for the Hadoop DFS. There is a single NameNode * running in any DFS deployment. (Well, except when there * is a second backup/failover NameNode.) * * The NameNode controls two critical tables: * 1) filename->blocksequence (namespace) * 2) block->machinelist ("inodes") * * The first table is stored on disk and is very precious. * The second table is rebuilt every time the NameNode comes * up. * * 'NameNode' refers to both this class as well as the 'NameNode server'. * The 'FSNamesystem' class actually performs most of the filesystem * management. The majority of the 'NameNode' class itself is concerned * with exposing the IPC interface and the http server to the outside world, * plus some configuration management. * * NameNode implements the ClientProtocol interface, which allows * clients to ask for DFS services. ClientProtocol is not * designed for direct use by authors of DFS client code. End-users * should instead use the org.apache.nutch.hadoop.fs.FileSystem class. * * NameNode also implements the DatanodeProtocol interface, used by * DataNode programs that actually store DFS data blocks. These * methods are invoked repeatedly and automatically by all the * DataNodes in a DFS deployment. * * NameNode also implements the NamenodeProtocol interface, used by * secondary namenodes or rebalancing processes to get partial namenode's * state, for example partial blocksMap etc. **********************************************************/
注释里说namenode这个节点维护的信息是:文件与文件块的关联关系(也叫namespache),这个主要由之前blog里的INodeFile这个类体现出来。文件块与机器节点之间的关系,可以用DatanodeDescriptor和BlockInfo体现出来,以后会写篇blog分析如何依据这3个模型来查询与新增修改数据关系等。
file与block的对应关系这个会持久化,如果namenode重启时需要加载这些数据,对于block与datanode的关系,因为只有持有数据的人才有资格说话,所以这个数据为了保证是最新的,需要由datanode来report给namenode,这个report是每次在心跳时一起发送的(具体分析datanode时再细说),在namenode重启时进入到safemode,datanode就会连接上namenode然后report自己磁盘上所有的block信息,当达到一定的额度就认为所有的datanode与block的信息report完毕然后退出safemode。
主要的NameNode Server的工作都是交给FSNamesystem来完成的,这个类有4700多行,他自己只是参与IPC与jetty web的功能,所以Namenode的
主要功能都在 FSNamesystem这个类里实现的。
因为Namenode自身的重要性,所以他作为一个枢纽联系着client datanode secondNameNode,从设计哲学上说就变成了namenode这个类需要实现满足枢纽功能的三个接口,分别对应与client datanode secondName做交互,当你觉得namenode需要另外一种职责时可以定义新的接口,然后让namenode实现即可。
首先是ClientProtocol,先看下他的注释说明
/********************************************************************** * ClientProtocol is used by user code via * {@link org.apache.hadoop.hdfs.DistributedFileSystem} class to communicate * with the NameNode. User code can manipulate the directory namespace, * as well as open/close file streams, etc. * **********************************************************************/
例如client可以调用FileSystem来完成文件的上传,删除等等,我们可以看到这个接口里比较常用的2个函数
新建文件的
/** * Create a new file entry in the namespace. * <p> * This will create an empty file specified by the source path. * The path should reflect a full path originated at the root. * The name-node does not have a notion of "current" directory for a client. * <p> * Once created, the file is visible and available for read to other clients. * Although, other clients cannot {@link #delete(String)}, re-create or * {@link #rename(String, String)} it until the file is completed * or explicitly as a result of lease expiration. * <p> * Blocks have a maximum size. Clients that intend to * create multi-block files must also use {@link #addBlock(String, String)}. * * @param src path of the file being created. * @param masked masked permission. * @param clientName name of the current client. * @param overwrite indicates whether the file should be * overwritten if it already exists. * @param replication block replication factor. * @param blockSize maximum block size. * * @throws AccessControlException if permission to create file is * denied by the system. As usually on the client side the exception will * be wrapped into {@link org.apache.hadoop.ipc.RemoteException}. * @throws QuotaExceededException if the file creation violates * any quota restriction * @throws IOException if other errors occur. */ public void create(String src, FsPermission masked, String clientName, boolean overwrite, short replication, long blockSize )
删除文件的,对应的fs命令为rm -rm/-rmr
/** * Delete the given file or directory from the file system. * <p> * same as delete but provides a way to avoid accidentally * deleting non empty directories programmatically. * @param src existing name * @param recursive if true deletes a non empty directory recursively, * else throws an exception. * @return true only if the existing file or directory was actually removed * from the file system. */ public boolean delete(String src, boolean recursive)
再来看下DatanodeProtocol,以下是注释说明
/* NameNode also implements the DatanodeProtocol interface, used by * DataNode programs that actually store DFS data blocks. These * methods are invoked repeatedly and automatically by all the * DataNodes in a DFS deployment. **********************************************************************/ /********************************************************************** * Protocol that a DFS datanode uses to communicate with the NameNode. * It's used to upload current load information and block reports. * * The only way a NameNode can communicate with a DataNode is by * returning values from these functions. * **********************************************************************/
具体看几个常用函数就明白这个意思了,同时注意还有个返回值,是namenode返回给datanode的,这个等分析datanode再说。
/** Register Datanode. * * @see org.apache.hadoop.hdfs.server.datanode.DataNode#dnRegistration * @see org.apache.hadoop.hdfs.server.namenode.FSNamesystem#registerDatanode(DatanodeRegistration) * * @return updated {@link org.apache.hadoop.hdfs.server.protocol.DatanodeRegistration}, which contains * new storageID if the datanode did not have one and * registration ID for further communication. */ public DatanodeRegistration register(DatanodeRegistration registration) 当datanode启动时就调用这个。 /** sendHeartbeat() tells the NameNode that the DataNode is still * alive and well. Includes some status info, too. * It also gives the NameNode a chance to return * an array of "DatanodeCommand" objects. * A DatanodeCommand tells the DataNode to invalidate local block(s), * or to copy them to other DataNodes, etc. */ public DatanodeCommand[] sendHeartbeat(DatanodeRegistration registration, long capacity, long dfsUsed, long remaining, int xmitsInProgress, int xceiverCount) /** * blockReport() tells the NameNode about all the locally-stored blocks. * The NameNode returns an array of Blocks that have become obsolete * and should be deleted. This function is meant to upload *all* * the locally-stored blocks. It's invoked upon startup and then * infrequently afterwards. * @param registration * @param blocks - the block list as an array of longs. * Each block is represented as 2 longs. * This is done instead of Block[] to reduce memory used by block reports. * * @return - the next command for DN to process. * @throws IOException */ public DatanodeCommand blockReport(DatanodeRegistration registration, long[] blocks)
再来看下NamenodeProtocol这个接口,首先看下注释
/* NameNode also implements the NamenodeProtocol interface, used by * secondary namenodes or rebalancing processes to get partial namenode's * state, for example partial blocksMap etc. */ /***************************************************************************** * Protocol that a secondary NameNode uses to communicate with the NameNode. * It's used to get part of the name node state *****************************************************************************/
这个接口提供了2个功能,一个是和secondNamenode之间的交互使用,另外一个是给balance使用,那么分别看看这2个功能接口。
balance主要是查看单个datanode机器上的block数,如果发现某个机器上的数很大,超出普通的那就需要将这个机器上的block移动到一个block数少的机器上了,那么做操作之前需要有一些数据支持,所以由namenode来提供了,接口是
/** Get a list of blocks belonged to <code>datanode</code> * whose total size is equal to <code>size</code> * @param datanode a data node * @param size requested size * @return a list of blocks & their locations * @throws RemoteException if size is less than or equal to 0 or datanode does not exist */ public BlocksWithLocations getBlocks(DatanodeInfo datanode, long size) throws IOException;
这个具体的调用实现等分析到balance时再细细分析下。
和secondeNamenode相关的接口如下:
/** * Closes the current edit log and opens a new one. The * call fails if the file system is in SafeMode. * @throws IOException * @return a unique token to identify this transaction. */ public CheckpointSignature rollEditLog() throws IOException; /** * Rolls the fsImage log. It removes the old fsImage, copies the * new image to fsImage, removes the old edits and renames edits.new * to edits. The call fails if any of the four files are missing. * @throws IOException */ public void rollFsImage() throws IOException;
针对备份或者说二级namenode的具体实施过程需要有个流程图的东西来解释下。
发表评论
-
hive相关操作文档收集
2011-12-02 13:26 899How to load data into Hive ... -
hive sql doc
2011-11-16 11:38 1035记录2个常用的hive sql语法查询地 官方 ht ... -
hive Required table missing : "`DBS`" in Catalog "" Schema "
2011-11-14 20:49 10891最近需要提取一些数据,故开始使用hive,本机搭建了一个hiv ... -
HDFS数据兼容拷贝
2011-09-29 22:07 1070系统中使用了hadoop 19.2 20.2 2个版本,为啥有 ... -
hdfs 简单的api 读写文件
2011-08-24 14:30 11246import java.io.BufferedReader; ... -
hbase之htable线程安全性
2011-08-19 01:52 3744在单线程环境下使用hbase的htable是没有问题,但是突然 ... -
hbase之scan的rowkey问题
2011-08-17 20:43 18739最近使用到hbase做存储,发现使用scan的时候,返回的ro ... -
datanode启动开启了那些任务线程
2011-03-27 23:21 1777今天开始分析datanode,首先看看datanode开启了哪 ... -
hadoop监控
2011-03-21 18:27 5630通过从hadoop的 hadoop-metrics文件中就可以 ... -
zookeeper集群配置注意项
2011-03-16 01:05 2666项目中需要使用hbase,故准备在本机搭建hbase,考虑到h ... -
Block类图描述
2011-03-15 08:24 1125前面2个描述了datanode以及INodeFile,还缺个B ... -
INodeFile类图描述
2011-03-14 21:58 1316针对具体存储在hdfs上的文件有个对象来模型化他那就是INod ... -
DatanodeDescriptor类图描述
2011-03-13 23:21 1613本想画个UML里的标准类图的,可惜linux下的画图工具都不那 ... -
namenode维护的变量有哪些
2011-03-12 23:51 1338之前的blog ... -
namenode任务线程之RPC
2011-03-12 18:21 2938namenode需要监听和收集各个datanode的信息,需要 ... -
hadoop各配置文件加载情况
2011-03-12 16:30 4620之前依据名字想当然的把fs.default.name配置在hd ... -
hadoop远程调试
2011-03-12 13:52 2943之前的一篇blog里讲述了hadoop单机版调试的方法,那种调 ... -
namenode后台jetty web
2011-03-11 23:33 2498现在开始分析namenode启动时开启的 ... -
FSNamesystem中的recentInvalidateSets
2011-03-11 22:28 1233今天早就回来了,然后偷懒了2个小时,现在才开始分析代码,之前在 ... -
namenode任务线程之FSNamesystem$SafeModeMonitor
2011-03-10 22:58 1711前面5个任务线程一般会 ...
相关推荐
这个过程涉及Secondary NameNode向NameNode发起HTTP请求,触发NameNode启动HTTP客户端到Secondary NameNode处下载FSImage文件,所需的所有信息都包含在NameNode的HTTP请求中。 #### 四、Secondary NameNode的数据...
在IT行业中,Hadoop是一个广泛使用的开源框架,主要用于大数据处理和分布式存储。深入理解Hadoop的源代码对于优化系统性能、解决技术问题以及开发自定义工具具有重要意义。本篇文章将详细探讨Hadoop的核心组件,包括...
NameNode的核心功能主要实现在`FSNamesystem`类中,而`NameNode.java`则主要负责对外提供服务接口以及内部组件的管理和协调。 #### 三、NameNode.java成员变量详解 1. **`public FSNamesystem namesystem;`** - ...
6. **PendingReplication Blocks线程(timethread)**:这个线程在`PendingReplicationBlocks`类中,用于检查等待复制的数据块。如果数据块长时间未被复制,会被移动到`timedOutItems`列表中,以供进一步处理。 7. **...
HDFS的主要功能组件包括HDFS的核心类和接口,体系结构涉及HDFS的整体设计,NameNode是HDFS的核心,负责管理文件系统的命名空间,维护文件系统的文件树及整个HDFS的元数据,而DataNode则负责存储实际的数据。...
以上就是关于HDFSJava操作类HDFSUtil以及JUnit测试的主要内容,它涵盖了HDFS的基础操作和高可用环境的配置,对于在Java应用中集成HDFS操作非常实用。在实际项目中,还需要根据具体需求进行调整和扩展,例如添加数据...
第一个DataNode会继续调用下一个DataNode,依次类推,直到管道建立完成。 6. **数据块传输**:客户端开始向第一个DataNode传输数据块。数据传输是以packet为单位进行的,默认情况下,一个packet的大小为64KB。第一...
源码中,`org.apache.hadoop.hdfs.server.namenode` 和 `org.apache.hadoop.hdfs.server.datanode` 包含了这两个角色的核心实现。 2. 文件块与副本策略:HDFS通过将文件切分成多个块并在多个节点上保存副本来提高...
3. **mapred-site.xml**: 在HA环境下,这个文件主要涉及YARN(Yet Another Resource Negotiator)与MapReduce的配置。`mapreduce.jobtracker.address`或`yarn.resourcemanager.address`定义了ResourceManager的地址...
#### 四、DFSClient的主要功能 DFSClient实现了许多文件管理功能,这些功能最终会调用NameNode对应的RPC方法来实现。例如: - **setReplication**:设置文件的副本数量。 - **rename**:重命名文件。 - **delete**...
Hadoop的核心库`hadoop-core`包含了实现这些功能的Java类和接口。在`hadoop-core-0.20.2-320-sources.jar`这个文件中,我们可以找到源代码,这对于开发者来说非常有价值,因为它允许他们深入了解Hadoop的工作原理,...
“人工智能”可能是指在这个简易云盘实现中,可能会用到的一些AI技术,比如数据分类、推荐系统或自动备份策略,这些功能可以提升用户体验。然而,由于标题和描述没有明确提及,这部分可能是猜测。 【压缩包子文件的...
DataNode与NameNode之间的通信,以及客户端与NameNode的交互,都是通过这个模块完成的。 4. **io**: 这个包包含了一系列的可序列化对象,如Writable接口,它是Hadoop中数据交换的基础。所有的数据类型,包括自定义...
1. `FSDirectory`:这是NameNode中管理文件系统元数据的关键类,包含了文件和目录的创建、删除、重命名等操作。源码中可以看到如何处理这些操作以及如何更新元数据信息。 2. `BlockManager`:负责HDFS的数据块管理和...
15. **Secondary Namenode**:Secondary Namenode并不是备份Namenode的简单副本,它的主要功能是定期合并NameNode的元数据日志,以防止NameNode的元数据文件过大,从而提高系统稳定性。 以上知识点涵盖了Hadoop生态...
此外,NameNode会记录每个文件的数据块副本所在的DataNode列表,但并不会长期保存这些信息,而是通过DataNode的定期心跳报告来更新。 2. **DataNode**:作为HDFS的存储节点,负责存储实际的数据块,并响应客户端的...
Hadoop是开源、高可靠、可扩展的分布式计算框架,主要功能包括海量数据存储(HDFS)、海量数据分析(MapReduce)和分布式资源调度(Yarn)。作为云计算的标准开源软件,Hadoop的生态系统分布图包括多个构造模块,如...
- `dfs.nameservices`: 定义一个命名服务ID,例如"my-ha",这将包含两个NameNode实例。 - `dfs.ha.namenodes.my-ha`: 指定命名服务下的NameNode ID,如"nn1"和"nn2"。 - `dfs.namenode.shared.edits.dir`: 配置...
这一过程涉及多个阶段,包括客户端请求、NameNode分配存储位置、数据块的传输和确认等。 4. **下列哪个是Hadoop运行的模式** - **知识点说明**:Hadoop支持三种运行模式:单机模式、伪分布模式和全分布模式。每种...