首页 百科知识 源代码分析(二六)

源代码分析(二六)

时间:2023-09-22 百科知识 版权反馈
【摘要】:private Host2NodesMap host2DataNodeMap = newHost2NodesMap(); 保存了主机名到DatanodeDescriptor数组的映射。privateHostsFileReader hostsReader;保存了系统中允许/不允许连接到NameNode的机器列表。privateDaemon dnthread = null;线程句柄,该线程用于检测DataNode上的Decommission进程。例如,某节点被列入到不允许连接到NameNode的机器列表中,那么,该节点会进入Decommission状态,它上面的数据块会被复制到其它节点,复制结束后机器进入DatanodeInfo.AdminStates.DECOMMISSIONED,这台机器就可以从HDFS中撤掉。privateint blockInvalidateLimit = FSConstants.BLOCK_INVALIDATE_CHUNK;发送给DataNode删除数据块消息中,能包含的最大数据块数。

(没想到需要分页啦)

private Host2NodesMap host2DataNodeMap = newHost2NodesMap();
保存了主机名(String)到DatanodeDescriptor数组的映射(Host2NodesMap唯一的成员变量为HashMap<String,DatanodeDescriptor[]> map,它的方法都是对这个map进行操作)。

 

 NetworkTopology clusterMap = new NetworkTopology();
  privateDNSToSwitchMapping dnsToSwitchMapping;

定义了HDFS的网络拓扑,网络拓扑对应选择数据块副本的位置很重要。如在一个层次型的网络中,接到同一个交换机的两个节点间的网络速度,会比跨越多个交换机的两个节点间的速度快,但是,如果某交换机故障,那么它对接到它上面的两个节点会同时有影响,但跨越多个交换机的两个节点,这种影响会小得多。下面是NetworkTopology相关的类图:

mhtml:file://I:\技术文章下载\2010-4-23整理到notebook\Hadoop汇总2010-4-22\Hadoop源码分析\Hadoop源代码分析(二六)%20-%20-%20JavaEye技术网站.mht!http://www.javaeye.com/upload/attachment/61547/9c2f42c4-9550-3629-bac1-f7801a0f0c4d.jpg

Hadoop实现了一个树状的拓扑结构抽象,其中,Node接口,定义了网络节点的一些方法,NodeBaseNode的一个实现,提供了叶子节点的一些方法(明显它没有子节点),而InnerNode则实现了树的内部节点,如果我们考虑一个网络部署的话,那么叶子节点是服务器,而InnerNode则是服务器所在的机架或交换机或路由器。Node提供了对网络位置信息(采用类似文件树的方式),节点名称和Node所在的树的深度的方法。NodeBase提供了一个简单的实现。InnerNodeNetworkTopology的内部类,对比NodeBase,它的clildren保存了所有的子节点,这样的话,就可以构造一个拓扑树。这棵树的叶子可能是服务器,也可能是机架,内部则是机架或者是路由器等设备,InnerNode提供了一系列的方法区分处理这些信息。

NetworkTopologyadd方法和remove用于在拓扑结构中加入节点和删除节点,同时也给出一些get*方法,用于获取一些对象内部的信息,如getDistance,可以获取两个节点的距离,而isOnSameRack可以判断两个节点是否处于同一个机架。chooseRandom有两个实现,用于在一定范围内(另一个还有一个排除选项)随机选取一个节点。chooseRandom在选择数据块副本位置的时候调用。

DNSToSwitchMapping配合上面NetworkTopology,用于确定某一个节点的网络位置信息,它的唯一方法,可以通过一系列机器的名字找出它们对应的网络位置信息。目前有支持两种方法,一是通过命令行方式,将节点名作为输入,输出为网络位置信息(RawScriptBasedMapping执行命令CachedDNSToSwitchMapping缓存结果),还有一种就是利用配置参数hadoop.configured.node.mapping静态配置(StaticMapping)。

 

 ReplicationTargetChooser replicator;

用于为数据块备份选择目标,例如,用户写文件时,需要选择一些DataNode,作为数据块的存放位置,这时候就利用它来选择目标地址。chooseTargetReplicationTargetChooser中最重要的方法,它通过内部的一个NetworkTopology对象,计算出一个DatanodeDescriptor数组,该数组就是选定的DataNode,同时,顺序就是最佳的数据流顺序(还记得我们讨论DataXceiver些数据的那个图吗?)。

 

  privateHostsFileReader hostsReader;

保存了系统中允许/不允许连接到NameNode的机器列表。

 

  privateDaemon dnthread = null;

线程句柄,该线程用于检测DataNode上的Decommission进程。例如,某节点被列入到不允许连接到NameNode的机器列表中(HostsFileReader),那么,该节点会进入Decommission状态,它上面的数据块会被复制到其它节点,复制结束后机器进入DatanodeInfo.AdminStates.DECOMMISSIONED,这台机器就可以从HDFS中撤掉。

 

  privatelong maxFsObjects = 0;          // maximum number of fs objects

系统能拥有的INode最大数(配置项dfs.max.objects0为无限制)。

 

  privatefinal GenerationStamp generationStamp = newGenerationStamp();

系统的时间戳生产器。

 

  privateint blockInvalidateLimit = FSConstants.BLOCK_INVALIDATE_CHUNK;

发送给DataNode删除数据块消息中,能包含的最大数据块数。比方说,如果某DataNode上有250Block需要被删除,而这个参数是100,那么一共会有3条删除数据块消息消息,前面两条包含了100个数据块,最后一条是50个。

 

private long accessTimePrecision = 0;

用于控制文件的access时间的精度,也就是说,小于这个精度的两次对文件访问,后面的那次就不做记录了。


免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈