´ó¼Ò¶¼ÖªµÀHDFSµÄ¼Ü¹¹ÓÉNameNode,SecondaryNameNodeºÍDataNodes×é³É£¬ÆäÔ´ÂëÀàͼÈçÏÂͼËùʾ£º

ÕýÈçÉÏͼËùʾ£¬NameNodeºÍDataNode¼Ì³ÐÁ˺ܶàµÄprotocolÓÃÓڱ˴˼äµÄͨÐÅ£¬ÆäʵnameNode»¹ÊµÏÖÁËRefreshUserMappingsProtocolºÍRefreshAuthorizationPolicyProtocolÁ½¸öÐÒ飬ÓÃÓÚȨÏÞ¿ØÖƺ͸üУ»ÊµÏÖÁËClientProtocolÐÒéÓÃÓÚºÍclient¶ËͨÐÅ¡£
ClientProtocolÐÒ飺
ͨ¹ý´ËÐÒé,client¶Ë¿ÉÒÔ²Ù¿ØÄ¿Â¼¿Õ¼ä£¬°üÀ¨ÎļþÁ÷¶ÁдµÈ¡£±ÈÈ磺
getBlockLocations·½·¨¿ÉÒÔ»ñÈ¡¾ßÌåij¸öÎļþÔÚdatanodeÉϵĴ洢λÖã»
addBlockÌí¼ÓblockÊý¾Ý£¬»¹ÓÐcreate£¬deleteµÈ²Ù×÷¡£
NamenodeProtocolÐÒ飺
ÓÃÓÚsecondNameNodeºÍNameNode½ÚµãͨÐÅ£¬±ÈÈç»ñÈ¡namenodeÉϵÄһЩ״̬ÐÅÏ¢£¬±ÈÈç»ñȡij¸öDataNodeÉϵÄblocksµÄÐÅÏ¢ÒÔ¼°²Ù¿ØeditLogÎļþ£¬Õâ¸öÎļþ»á¼Ç¼ÿ´Înamenode¶ÔÎļþµÄ²Ù×÷ÈÕÖ¾£¬Ï൱ÓÚmysqlµÄbinlog¡£¹ØÓÚsecondarynamenode½ÚµãµÄ×÷ÓÃÕâÀïÒª×ö¸ö˵Ã÷£¬ËüÕæÕýµÄÓÃ;£¬ÊÇÓÃÀ´±£´ænamenodeÖжÔHDFS
metadataµÄÐÅÏ¢µÄ±¸·Ý£¬²¢¼õÉÙnamenodeÖØÆôµÄʱ¼ä¡£ÎªÁ˱£Ö¤½»»¥ËÙ¶È£¬HDFSÎļþϵͳµÄmetadataÊDZ»loadµ½namenode»úÆ÷µÄÄÚ´æÖе쬲¢ÇһὫÄÚ´æÖеÄÕâЩÊý¾Ý±£´æµ½´ÅÅ̽øÐг־û¯´æ´¢¡£Îª
Á˱£Ö¤Õâ¸ö³Ö¾Ã»¯¹ý³Ì²»»á³ÉΪHDFS²Ù×÷µÄÆ¿¾±£¬hadoop²ÉÈ¡µÄ·½Ê½ÊÇ£ºÃ»ÓжÔÈκÎÒ»´ÎµÄµ±Ç°ÎļþϵͳµÄsnapshot½øÐг־û¯£¬¶ÔHDFS×î
½üÒ»¶Îʱ¼äµÄ²Ù×÷list»á±»±£´æµ½namenodeÖеÄÒ»¸ö½ÐEditlogµÄÎļþÖÐÈ¥¡£µ±ÖØÆônamenodeʱ£¬³ýÁË
load fsImageÒâÍ⣬»¹»á¶ÔÕâ¸öEditLogÎļþÖÐ ¼Ç¼µÄHDFS²Ù×÷½øÐÐreplay£¬ÒÔ»Ö¸´HDFSÖØÆô֮ǰµÄ×îÖÕ״̬¡£
¶øSecondaryNameNode£¬»áÖÜÆÚÐԵĽ«EditLogÖмǼµÄ¶ÔHDFSµÄ²Ù×÷ºÏ²¢µ½Ò»¸öcheckpointÖУ¬È»ºóÇå¿Õ
EditLog¡£ËùÒÔnamenodeµÄÖØÆô¾Í»áLoad×îеÄÒ»¸öcheckpoint£¬²¢replay EditLogÖÐ
¼Ç¼µÄhdfs²Ù×÷£¬ÓÉÓÚEditLogÖмǼµÄÊÇ´Ó ÉÏÒ»´ÎcheckpointÒÔºóµ½ÏÖÔڵIJÙ×÷ÁÐ±í£¬ËùÒԾͻá±È½ÏС¡£Èç¹ûûÓÐsnnµÄÕâ¸öÖÜÆÚÐԵĺϲ¢¹ý³Ì£¬ÄÇôµ±Ã¿´ÎÖØÆônamenodeµÄʱºò£¬¾Í»á
»¨·ÑºÜ³¤µÄʱ¼ä¡£¶øÕâÑùÖÜÆÚÐԵĺϲ¢¾ÍÄܼõÉÙÖØÆôµÄʱ¼ä¡£Í¬Ê±Ò²Äܱ£Ö¤HDFSϵͳµÄÍêÕûÐÔ¡£
DatanodeProtocolÐÒé:
ÓÃÓÚDataNodeºÍNameNode½ÚµãµÄͨÐÅ£¬Ö÷ÒªµÄͨÐŽӿÚÈçÏ£º

¿ÉÒÔ¿´³öÀ´Ã¿¸öDataNodeÆðÀ´Ö®ºóÒªµ÷ÓÃrigister·½·¨Í¨ÖªNameNode¸üÐÂËü£¬È»ºóͨ¹ýsendHeartBeatÐÅÏ¢¸æËßNameNode
Ëü»¹½¡¿µµÄ»îןÍһЩÆäËûÐÅÏ¢£¬µ±È»namenodeÒ²¿ÉÒÔ·µ»ØÒ»Ð©½á¹û¸æËßDatanodeɾ³ý»òÕßÒÆ¶¯Êý¾Ý¡£´ËÍ⻹Óкཻܶ»¥½Ó¿Ú
InterDatanodeProtocolÐÒ飺
¸ÃÐÒéÓÃÓÚDatanode½ÚµãÖ®¼äµÄ»¥ÏàͨÐÅ¡£±ÈÈç»ñÈ¡¾ßÌåÒ»¸öblockµÄmetadataÐÅÏ¢»òÕßÊÇÖ´ÐÐÊý¾Ý»Ö¸´Ç¨ÒÆetc
´ËÍâDataNode»¹ÊµÏÖÁËClientDatanodeProtocolÐÒéÓÃÓÚºÍclient½»»¥Í¨ÐÅ¡£±ÈÈçblock»ñÈ¡£¬blockÊý¾Ý»Ö¸´ºÍblock·¾¶ÐÅÏ¢¡£´ÓÕâÀï¿ÉÒÔ¿´³öclientÌá½»Êý¾ÝµÄʱºòÊÇÏònamenode·¢³öÇëÇó¶ø·ÇÏòdatanode·¢ËÍ´æ´¢Êý¾ÝµÄÇëÇó¡£
Á˽âÁËNameNodeµÄһЩÐÒéÖ®ºóÔÙÀ´¿´¿´NameNodeµÄÊôÐÔ:

¿´¿´¼¸¸öÖØÒªµÄÊôÐÔ£º
serviceRpcServerÓÃÓÚºÍsecondaryNameNode,DataNodeÖ®¼ä½øÐÐRPCͨÐÅ£»
serverÓÃÓÚºÍclient¶Ë½øÐÐRPCͨÐÅ£»
httpServer¾ÍÊÇÎÒÃǵı¾µØÆô¶¯·þÎñÆ÷¡£
NameNodeÔÚ³õʼ»¯µÄʱºò»¹»áÆô¶¯Ò»¸öemptierÏß³ÌÓÃÓÚ¶¨ÆÚµÄɾ³ýµ±Ç°»ØÊÕÕ¾µÄÎļþ¡£¶¨ÆÚʱ¼ä¿ÉÒÔÔÚÅäÖÃÎļþÖÐÅäÖÃfs.trash.interval²ÎÊý£¬¼ÙÈç0µÄ»°¾ÍÏ൱ÓÚ»ØÊÕÕ¾¹¦ÄÜÊÇÎÞЧµÄ
NameNode½Úµã³õʼ»¯µÄ¹¤×÷¾ÍÊÇÏÈÆô¶¯·þÎñÆ÷httpServer,È»ºóÆô¶¯namenode¶Ô¿Í»§¶ËµÄRPC
server £¬½Ó×ÅÆô¶¯serviceRpcServer£¬È»ºóÆô¶¯»ØÊÕÕ¾ºǫ́Ïß³Ìemptier
½ÓÏÂÀ´Öص㿴һÏÂnamesystem²ÎÊý£¬namesystemÏ൱ÓÚËùÓÐDataNodeµÄ¼Çʱ¾£¬Ö÷Òª¼Ç¼ÁËÒÔÏÂÐÅÏ¢£º
// Mapping: Êý¾Ý¿é -> { inode½Úµã, datanodeÁбí, self ref } //Ö÷ÒªÓÃÓڼǼÿ¸öblock´æ´¢µÄdatanode½ÚµãºÍ¶ÔÓ¦µÄinode½ÚµãÐÅÏ¢ //Ò²¾ÍÊÇ´æ´¢ÁËblockµÄmetaÐÅÏ¢ |
// Updated only in response to client-sent information. 02.// 03.final BlocksMap blocksMap = new BlocksMap(DEFAULT_INITIAL_MAP_CAPACITY, 04. DEFAULT_MAP_LOAD_FACTOR);
|
ÊôÐÔdatanodeMap:
NavigableMap<String, DatanodeDescriptor> datanodeMap = 02. new TreeMap<String, DatanodeDescriptor>();
|
Õâ¸ötreemap´æ´¢ÁËÿ¸öDataNode¶ÔÓ¦µÄÔªÐÅÏ¢;
ÊôÐÔheartbeatsÓÃÓÚheartbeatÏß³Ì¼à¿ØÊ¹Óãº
ArrayList<DatanodeDescriptor> heartbeats = new ArrayList<DatanodeDescriptor>();¼Ç¼µÄÊÇ´æ»îµÄdatanode½ÚµãÐÅÏ¢ 02. 03.private Map<String, Collection<Block>> recentInvalidateSets =new TreeMap<String, Collection<Block>>();
//ÎÞÓÃblockÁбí
|
¼ÙÈçÏÖÔÚÒª»ñȡij¸ödatanodeÉϵÄn¸ö½ÚµãµÄ»°£¬ÏÈҪȥdatanodeMapÖлñÈ¡DatanodeDescriptorÐÅÏ¢£¬È»ºó»ñÈ¡BlockInfoÐÅÏ¢
½Ó×ÅblocksMapÖлñÈ¡block´æ´¢µÄdatanode½Úµãid£¬µ±È»¼ÙÈçÕâ¸öblockÔÚrecentInvalidateSetsÁбíÖÐÄǾÍÒª¹ýÂ˵ô¡£
ÊôÐÔdir
// 02.// Stores the correct file name hierarchy 03.//Õâ¸öÎļþÖд洢ÁËÿ¸öÎļþÃû¶ÔÓ¦µÄλÖÃÒ²¾ÍÊÇÃüÃû¿Õ¼ä 04.// 05.public FSDirectory dir;
|
½ÓÏÂÀ´ÎÒÃÇÒª¹Ø×¢Ò»ÏÂFSNamesystemµÄ³õʼ»¯¹ý³Ì£º
1.¶ÁÈ¡ºÍÉèÖÃconfÎļþÖеIJÎÊý
2.½«FSNamesystem×¢²áµ½MBeanÒÔ±ãJMS²Ù×÷ºÍ¼à¿Ø
3.¼ÓÔØ±¾µØÓ³ÏóÎļþ
4.Æô¶¯HeartbeatMonitor£¬ReplicationMonitorµÈÏß³Ì
HeartbeatMonitorÏß³ÌÒ»Ö±ÔËÐУ¬Ëü»áÿ¼ä¸ôheartbeatRecheckIntervalʱ¼ä¾ÍÈ¥¼ì²éËùÓеÄdatanode½ÚµãÊÇ·ñalive
while (!allAlive) { 03. boolean foundDead = false; 04. DatanodeID nodeID = null; 05. 06. // ÔÚdatanode½ÚµãÁбíÖвéÕÒµÚÒ»¸ödeadÁ赀 07. 08. synchronized(heartbeats) { 09. for (Iterator<DatanodeDescriptor> it = heartbeats.iterator(); 10. it.hasNext();) { 11. DatanodeDescriptor nodeInfo = it.next(); 12. if (isDatanodeDead(nodeInfo)) {//datanodeµÄmetaÐÅÏ¢ÖÐÉϴθüÐÂʱ¼ä³¬¹ýÒ»¶¨·§Öµ 13. foundDead = true; 14. nodeID = nodeInfo; 15. break; 16. } 17. } 18. } 19. 20. //ÒÆ³öÒѾËÀÁ˵Ľڵã 21. if (foundDead) { 22. synchronized (this) { 23. synchronized(heartbeats) { 24. synchronized (datanodeMap) { 25. DatanodeDescriptor nodeInfo = null; 26. try { 27. nodeInfo = getDatanode(nodeID); 28. } catch (IOException e) { 29. nodeInfo = null; 30. } 31. if (nodeInfo != null && isDatanodeDead(nodeInfo)) { 32. NameNode.stateChangeLog.info("BLOCK* NameSystem.heartbeatCheck: " 33. + "lost heartbeat from " + nodeInfo.getName()); 34. removeDatanode(nodeInfo); 35. } 36. } 37. } 38. } 39. } 40. allAlive = !foundDead; 41. } 42.ÒÆ³ö²Ù×÷¹ý³ÌÊÇÕâÑùµÄ£º 43.//´ÓheartbeatsÖÐÒÆ³ö 44. synchronized (heartbeats) { 45. if (nodeInfo.isAlive) { 46. updateStats(nodeInfo, false); 47. heartbeats.remove(nodeInfo); 48. nodeInfo.isAlive = false; 49. } 50. } 51.//ɾ³ý¸Ãnode¶ÔÓ¦µÄblockÐÅÏ¢ 52. for (Iterator<Block> it = nodeInfo.getBlockIterator(); it.hasNext();) { 53. removeStoredBlock(it.next(), nodeInfo); 54. } 55. unprotectedRemoveDatanode(nodeInfo); 56.//½«Æä´ÓÍØÆË½á¹¹ÖÐÒÆ³ö 57. clusterMap.remove(nodeInfo);
|
ReplicationMonitorÏ̸߳ºÔðÊý¾Ý¿éµÄ¶à¸ö±¸·ÝºÍ¼à¿Ø¹¤×÷
Ëü¸ºÔð½«ÐèÒª¶à¸ö±¸·ÝµÄblock¼ÓÈëPendingReplicationBlocksÖв¢ÓÃÒ»¸öÏß³Ì¼à¿ØËüÔÚÕâ¸ömapÀïÃæµÄ´æ»îʱ¼ä£¬¹ýÆÚÁ˾ͽ«Æäɾ³ý¡£ÕâÑùÔÚDataNode½ÚµãÆô¶¯·þÎñµÄʱºò¿ÉÒÔɨÃèÕâ¸öÁбíÍê³É¸´ÖƱ¸·Ý¹¤×÷.
|