NameNode中数据节点的保存 - Host2NodesMap_服务器应用_Linux公社-Linux系统门户网站
你好,游客
NameNode中数据节点的保存
Host2NodesMap
来源:Linux社区&
作者:xhh198781
对于一台主机,我们可以在它上面部署多个DataNode进程,这也就是说在一台机器上有多个DataNode节点,而且这些DataNode节点属于同一个HDFS集群,那么这里就有一个问题了,NameNode节点是如何考虑整个集群的负载均衡的?如果NameNode节点以DataNode节点为单位来考虑负载均衡的话,就会出现包含有多个DataNode节点的主机负载过重,所以就不得不以主机为单位来计算集群的负载情况了。在NameNode中用Host2NodesMap类来存储主机与DataNode节点之间的映射。
&&&& 当一个DataNode节点向NameNode注册成功的时候,NameNode就会把这个DataNode节点存储到它的host2DataNodeMap属性中,也就是Host2NodesMap类的一个实例,这个类主要包含三个属性:
map:存储集群中所有主机上的所有DataNode节点;
r:用来随机选择给定主机上的某一个DataNode节点;
hostmapLock:控制对map的同步操作;
&&&& Host2NodesMap类主要负责对集群中的DataNode节点按在它们所在的主机进行分类管理,它可用来添加、删除、查询一个DataNode节点,它也可以按照主机或者DataNode的名字来查询。这些操作对应的方法是:
//判断一个DataNode节点在不在集群中
boolean contains(DatanodeDescriptor node) {&&& if (node==null) {&&&&&&&& }&&&& &&&& String host = node.getHost();&&& hostmapLock.readLock().lock();&&& try {&&&&& DatanodeDescriptor[] nodes = map.get(host);&&&&& if (nodes != null) {&&&&&&& for(DatanodeDescriptor containedNode:nodes) {&&&&&&&&& if (node==containedNode) {&&&&&&&&&&&&&&&&&&&& }&&&&&&& }&&&&& }&&& } finally {&&&&& hostmapLock.readLock().unlock();&&& }&& &&&&& }&& && //添加一个数据节点& boolean add(DatanodeDescriptor node) {&&& hostmapLock.writeLock().lock();&&& try {&&&&& if (node==null || contains(node)) {&&&&&&&&&&&& }&&&&& //找到DataNode节点所在的host
&&&&& String host = node.getHost();&&&&& DatanodeDescriptor[] nodes = map.get(host);&&&&& DatanodeDescriptor[] newN&&&&& if (nodes==null) {&&&&&&& newNodes = new DatanodeDescriptor[1];&&&&&&& newNodes[0]=&&&&& } else { // rare case: more than one datanode on the host&&&&&&& newNodes = new DatanodeDescriptor[nodes.length+1];&&&&&&& System.arraycopy(nodes, 0, newNodes, 0, nodes.length);&&&&&&& newNodes[nodes.length] =&&&&& }&&&&& map.put(host, newNodes);&&&&&&&& } finally {&&&&& hostmapLock.writeLock().unlock();&&& }& }&& && //删除一个节点& boolean remove(DatanodeDescriptor node) {&&& if (node==null) {&&&&&&&& }&&&& &&&& String host = node.getHost();&&& hostmapLock.writeLock().lock();&&& try {&&&&& DatanodeDescriptor[] nodes = map.get(host);&&&&& if (nodes==null) {&&&&&&&&&&&& }&&&&& if (nodes.length==1) {&&&&&&& if (nodes[0]==node) {&&&&&&&&& map.remove(host);&&&&&&&&&&&&&&&& } else {&&&&&&&&&&&&&&&& }&&&&& }&&&&& //rare case&&&&& int i=0;&&&&& for(; i&nodes. i++) {&&&&&&& if (nodes[i]==node) {&&&&&&&&&&&&&&&& }&&&&& }&&&&& if (i==nodes.length) {&&&&&&&&&&&& } else {&&&&&&& DatanodeDescriptor[] newN&&&&&&& newNodes = new DatanodeDescriptor[nodes.length-1];&&&&&&& System.arraycopy(nodes, 0, newNodes, 0, i);&&&&&&& System.arraycopy(nodes, i+1, newNodes, i, nodes.length-i-1);&&&&&&& map.put(host, newNodes);&&&&&&&&&&&& }&&& } finally {&&&&& hostmapLock.writeLock().unlock();&&& }& }&& && //根据主机名获取这个主机上的一个DataNode节点,如果这个主机上有多个DataNode节点,则随机选一个& DatanodeDescriptor getDatanodeByHost(String host) {&&& if (host==null) {&&&&&&&& }&&&& &&&& hostmapLock.readLock().lock();&&& try {&&&&& DatanodeDescriptor[] nodes = map.get(host);&&&&& // no entry&&&&& if (nodes== null) {&&&&&&&&&&&& }&&&&& // one node&&&&& if (nodes.length == 1) {&&&&&&& return nodes[0];&&&&& }&&&&& // more than one node&&&&& return nodes[r.nextInt(nodes.length)];&&& } finally {&&&&& hostmapLock.readLock().unlock();&&& }& }&& && //根据DataNode节点的名字来找到这个节点& public DatanodeDescriptor getDatanodeByName(String name) {&&& if (name==null) {&&&&&&&& }&&&& &&&& int colon = name.indexOf(":");&&& S&&& if (colon & 0) {&&&&& host =&&& } else {&&&&& host = name.substring(0, colon);&&& }&&& hostmapLock.readLock().lock();&&& try {&&&&& DatanodeDescriptor[] nodes = map.get(host);&&&&& // no entry&&&&& if (nodes== null) {&&&&&&&&&&&& }&&&&& for(DatanodeDescriptor containedNode:nodes) {&&&&&&& if (name.equals(containedNode.getName())) {&&&&&&&&& return containedN&&&&&&& }&&&&& }&&&&&&&& } finally {&&&&& hostmapLock.readLock().unlock();&&& }& }
&&&& 另外还有一个问题,刚才说了,NameNode节点如果只以主机为单位来评估集群的负载情况,其实也是不合理的。例如,在实际的应用中,如果在某个集群里面存在主机配置参差不齐的情况,则对于那些配置很高的主机来说,它们的很多资源会处于空闲状态,其工作量相对于那些配置较低的主机来说已经饱和了。正常的情况下,集群的管理人员会在配置差的主机上部署少量的DataNode节点,在配置高的主机上部署较多的DataNode节点,因次,NameNode节点就不能仅仅只通过主机工作量来评估集群的负载情况了。至于NameNode是如何进行集群的负载均衡的,我会在以后的文章中详细介绍,但是它的实现也不一定很好,大家期望也不要太高。
&&&& 遗憾的是,-0.2.0版本并没有这样考虑集群的负载情况,它用Host2NodesMap结构主要是能够根据某个客户端来获取其上的DataNode节点。但是,我上面猜测的并不是没有任何意义,或许将来Hadoop会把主机负载纳入到集群负载的考虑范围。
【内容导航】
相关资讯 & & &
& (03/11/:48)
& (01/30/:17)
& (05/16/:27)
& (02/17/:43)
& (12/16/:47)
同意评论声明
发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款不良人2手游竞技场阵容怎么换 英雄阵容更换方法_西西软件资讯
西西软件园多重安全检测下载网站、值得信赖的软件下载站!
→ 不良人2手游竞技场阵容怎么换 英雄阵容更换方法
2.0.1最新版
类型:角色扮演大小:477.6M语言:中文 评分:6.6
竞技场是玩家间互相切磋的地方,可是不能搭配自己最强的阵容,竞技场还要怎么打,下面这种就来为大家分享不良人2手游竞技场阵容更换方法,希望大家喜欢。一、在主界面更换头像边上有一个&换&字点下,进去调整下阵容,然后点一下出战!二、竞技场界面更换竞技场里面里面有一个&我的战队,点进去换&以上就是西西软件园为大家分享的不良人2手游竞技场阵容更换方法,更多资讯内容请继续关注我们。
(51) 最火手游排行榜单由西西手游中心整理,现在年已经过去四分之三了,在这一年中涌现出了不少的手游大作,西西本页将为玩家整理热门手游排行榜手游排行榜网游最新榜单游戏下载,大家可以在这里轻松找到自己喜欢玩的热门游戏类型。手游排行依据根据下载次数排行付费情况统计排行口碑传播排行推广力度排行...
01-28 / 327M
推荐理由:西游伏妖篇手游九游版是手机游戏渠道九游游戏独立运营的游戏版本,在西游伏妖篇手游九游版中,游戏为玩家提
02-06 / 325.8M
推荐理由:西游伏妖篇官网正版是一款非常好玩的制作相当宏大的手机动作冒险格斗类西游题材游戏,精美的游戏画面,刺激
01-24 / 478M
推荐理由:西游伏妖篇ios版是一款由完美世界根据周星驰主演的同名电影改编而成的角色扮演类苹果手机游戏,游戏完美的还
01-17 / 535M
推荐理由:网易倩女幽魂手游是一款全新的MMORPG类游戏,游戏由网易端游《新倩女幽魂》改编而来,沿袭倩女品牌极致唯美
02-21 / 493M
推荐理由:诛仙手游下载,诛仙手游版是一款3DMMORPG手机游戏,由作者萧鼎所著的热门小说《诛仙》同名改编,诛仙手游版中
02-01 / 392M
推荐理由:劲舞团官方正版手游是网易代理的劲舞团官方正版手游。游戏继承了pc端的经典玩法,玩家可自由搭配角色的服饰
(12) 不良人手游作为不良人手游的延续之作,震撼的人气国产的同名动漫游戏强势来袭承袭各种经典的剧情等你欣赏以顶级国漫武侠的风格,经典的故事情节发展,同时借鉴全新的图像引擎技术,为玩家提供更多的游戏特效,颠覆上一代传统。西西为大家带来不良人手游和辅助下载以及相关攻略。在这里,玩家将会体验到原汁原味的不良人江湖,一天是不良人,则一辈子是不良人...
10-24 / 403M
推荐理由:不良人2ios版是不良人的续作,同时也是由同名动漫改编而来的决赛扮演类手游,玩家将可以在游戏招募各种同伴
11-06 / 441.9M
推荐理由:不良人2官方百度版是一款非常好玩的非常精彩刺激的角色扮演RPG,炫酷的战斗与刺激的冒险,不良人2百度版绝对
10-26 / 442M
推荐理由:不良人2手游360版是一款由云畅游戏携手若森数字倾力打造的武侠类角色扮演手机游戏,游戏是根据最近热播的同
10-24 / 970KB
推荐理由:不良人2手游刷元宝烧饼修改器安卓版是一款非常好用的不良人2游戏辅助软件,游戏为玩家修改带来更多的元宝,
10-24 / 412M
推荐理由:不良人2手游vivo版是一款非常有意思的非常精彩刺激的角色扮演RPG,玩家可以体验到全新的战斗模式与刺激的冒
10-24 / 412M
推荐理由:不良人2手游官方oppo版是一款精美二次元画风的角色扮演类手机游戏,炫酷时装,生活表情,暂放下手中剑,领略
10-3110-3110-3110-2910-2810-2710-2710-2710-2710-26
阅读本文后您有什么感想? 已有23人给出评价!
名称大小下载