设为首页 收藏本站
查看: 1067|回复: 0

[经验分享] Hadoop源代码分析(二六)

[复制链接]

尚未签到

发表于 2016-12-8 09:51:02 | 显示全部楼层 |阅读模式
(没想到需要分页啦)

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

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




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

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

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

 

  ReplicationTargetChooser replicator;

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

 

  private HostsFileReader hostsReader;

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

 

  private Daemon dnthread = null;

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

 

  private long maxFsObjects = 0;          // maximum number of fs objects

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

 

  private final GenerationStamp generationStamp = new GenerationStamp();

系统的时间戳生产器。

 

  private int blockInvalidateLimit = FSConstants.BLOCK_INVALIDATE_CHUNK;

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

 

private long accessTimePrecision = 0;

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

 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-311334-1-1.html 上篇帖子: Hadoop源代码分析(一一) 下篇帖子: Hadoop MapReduce程序编写备忘
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表