Ò»¡¢¸ÅÊö
´ÓÕû¸öHDFSϵͳ¼Ü¹¹ÉÏ¿´£¬NameNodeÊÇÆäÖÐ×îÖØÒª¡¢×ÔÓÒ²ÊÇ×îÈÝÒ׳öÏÖÎÊÌâµÄµØ·½£¬¶øÇÒÒ»µ©NameNode³öÏÖ¹ÊÕÏ£¬Õû¸öHadoop¼¯Èº¾Í½«´¦ÓÚ²»¿É·þÎñµÄ״̬£¬Í¬Ê±Ëæ×ÅÊý¾Ý¹æÄ£ºÍ¼¯Èº¹æÄ£µØ³ÖÐøÔö³¤£¬ºÜ¶àСÁ¿¼¶Ê±±»Òþ²ØµÄÎÊÌâÖð½¥±©Â¶³öÀ´¡£ËùÒÔ£¬´Ó¸ü¸ß²ã´ÎÕÆÎÕNameNodeµÄÄÚ²¿½á¹¹ºÍÔËÐлúÖÆÓÈÆäÖØÒª¡£³ýÌØ±ð˵Ã÷Í⣬±¾ÎÄ»ùÓÚÉçÇø°æ±¾Hadoop-2.4.1[1][2]£¬ËäÈ»2.4.1Ö®ºóÒѾÓжà´Î°æ±¾µü´ú£¬µ«ÊÇ»ù±¾ÔÀíÏàͬ¡£
NameNode¹ÜÀí×ÅÕû¸öHDFSÎļþϵͳµÄÔªÊý¾Ý¡£´Ó¼Ü¹¹Éè¼ÆÉÏ¿´£¬ÔªÊý¾Ý´óÖ·ֳÉÁ½¸ö²ã´Î£ºNamespace¹ÜÀí²ã£¬¸ºÔð¹ÜÀíÎļþϵͳÖеÄÊ÷״Ŀ¼½á¹¹ÒÔ¼°ÎļþÓëÊý¾Ý¿éµÄÓ³Éä¹ØÏµ£»¿é¹ÜÀí²ã£¬¸ºÔð¹ÜÀíÎļþϵͳÖÐÎļþµÄÎïÀí¿éÓëʵ¼Ê´æ´¢Î»ÖõÄÓ³Éä¹ØÏµBlocksMap£¬Èçͼ1Ëùʾ[1]¡£Namespace¹ÜÀíµÄÔªÊý¾Ý³ýÄڴ泣פÍ⣬Ҳ»áÖÜÆÚFlushµ½³Ö¾Ã»¯É豸ÉÏFsImageÎļþ£»BlocksMapÔªÊý¾ÝÖ»ÔÚÄÚ´æÖдæÔÚ£»µ±NameNode·¢ÉúÖØÆô£¬Ê×Ïȴӳ־û¯É豸ÖжÁÈ¡FsImage¹¹½¨Namespace£¬Ö®ºó¸ù¾ÝDataNodeµÄ»ã±¨ÐÅÏ¢ÖØÐ¹¹ÔìBlocksMap¡£ÕâÁ½²¿·ÖÊý¾Ý½á¹¹ÊÇÕ¼¾ÝÁËNameNode´ó²¿·ÖJVM
Heap¿Õ¼ä¡£

ͼ1 HDFS½á¹¹Í¼
³ýÁ˶ÔÎļþϵͳ±¾ÉíÔªÊý¾ÝµÄ¹ÜÀíÖ®Í⣬NameNode»¹ÐèҪά»¤Õû¸ö¼¯ÈºµÄ»ú¼Ü¼°DataNodeµÄÐÅÏ¢¡¢Lease¹ÜÀíÒÔ¼°¼¯ÖÐʽ»º´æÒýÈëµÄ»º´æ¹ÜÀíµÈµÈ¡£Õ⼸²¿·ÖÊý¾Ý½á¹¹¿Õ¼äÕ¼ÓÃÏà¶Ô¹Ì¶¨£¬ÇÒÕ¼ÓýÏС¡£
²âÊÔÊý¾ÝÏÔʾ£¬NamespaceĿ¼ºÍÎļþ×ÜÁ¿µ½2ÒÚ£¬Êý¾Ý¿é×ÜÁ¿µ½3Òں󣬳£×¤ÄÚ´æÊ¹ÓÃÁ¿³¬¹ý90GB¡£
¶þ¡¢ÄÚ´æÈ«¾°
ÈçǰÊö£¬NameNodeÕû¸öÄÚ´æ½á¹¹´óÖ¿ÉÒÔ·Ö³ÉËĴ󲿷֣ºNamespace¡¢BlocksMap¡¢NetworkTopology¼°ÆäËü£¬Í¼2Ϊ¸÷Êý¾Ý½á¹¹ÄÚ´æÂß¼·Ö²¼Í¼Ê¾¡£

ͼ2 NameNodeÄÚ´æÈ«¾°Í¼
Namespace£ºÎ¬»¤Õû¸öÎļþϵͳµÄĿ¼Ê÷½á¹¹¼°Ä¿Â¼Ê÷ÉϵÄ״̬±ä»¯£»
BlockManager£ºÎ¬»¤Õû¸öÎļþϵͳÖÐÓëÊý¾Ý¿éÏà¹ØµÄÐÅÏ¢¼°Êý¾Ý¿éµÄ״̬±ä»¯£»
NetworkTopology£ºÎ¬»¤»ú¼ÜÍØÆË¼°DataNodeÐÅÏ¢£¬»ú¼Ü¸ÐÖªµÄ»ù´¡£»
ÆäËü£º
LeaseManager£º¶ÁдµÄ»¥³âͬ²½¾ÍÊÇ¿¿LeaseʵÏÖ£¬Ö§³ÖHDFSµÄWrite-Once-Read-ManyµÄºËÐÄÊý¾Ý½á¹¹£»
CacheManager£ºHadoop 2.3.0ÒýÈëµÄ¼¯ÖÐʽ»º´æÐÂÌØÐÔ£¬Ö§³Ö¼¯ÖÐʽ»º´æµÄ¹ÜÀí£¬ÊµÏÖmemory-localityÌáÉý¶ÁÐÔÄÜ£»
SnapshotManager£ºHadoop 2.1.0ÒýÈëµÄSnapshotÐÂÌØÐÔ£¬ÓÃÓÚÊý¾Ý±¸·Ý¡¢»Ø¹ö£¬ÒÔ·ÀÖ¹ÒòÓû§Îó²Ù×÷µ¼Ö¼¯Èº³öÏÖÊý¾ÝÎÊÌ⣻
DelegationTokenSecretManager£º¹ÜÀíHDFSµÄ°²È«·ÃÎÊ£»
ÁíÍ⻹ÓÐÁÙʱÊý¾ÝÐÅÏ¢¡¢Í³¼ÆÐÅÏ¢metricsµÈµÈ¡£
NameNode³£×¤ÄÚ´æÖ÷Òª±»NamespaceºÍBlockManagerʹÓ㬶þÕßʹÓÃÕ¼±È·Ö±ð½Ó½ü50%¡£ÆäËü²¿·ÖÄڴ濪Ïú½ÏСÇÒÏà¶Ô¹Ì¶¨£¬ÓëNamespaceºÍBlockManagerÏà±È»ù±¾¿ÉÒÔºöÂÔ¡£
Èý¡¢ÄÚ´æ·ÖÎö
3.1 Namespace
Óëµ¥»úÎļþϵͳÏàËÆ£¬HDFS¶ÔÎļþϵͳµÄĿ¼½á¹¹Ò²Êǰ´ÕÕÊ÷×´½á¹¹Î¬»¤£¬Namespace±£´æÁËĿ¼Ê÷¼°Ã¿¸öĿ¼/Îļþ½ÚµãµÄÊôÐÔ¡£³ýÔÚÄڴ泣פÍ⣬Õⲿ·ÖÊý¾Ý»á¶¨ÆÚflushµ½³Ö¾Ã»¯É豸ÉÏ£¬Éú³ÉÒ»¸öеÄFsImageÎļþ£¬·½±ãNameNode·¢ÉúÖØÆôʱ£¬´ÓFsImage¼°Ê±»Ö¸´Õû¸öNamespace¡£Í¼3ËùʾΪNamespaceÄÚ´æ½á¹¹¡£Ç°Êö¼¯ÈºÖÐĿ¼ºÍÎļþ×ÜÁ¿¼´Õû¸öNamespaceĿ¼Ê÷Öаüº¬µÄ½Úµã×ÜÊý£¬¿É¼ûNamespace±¾ÉíÆäʵÊÇÒ»¿Ã·Ç³£¾Þ´óµÄÊ÷¡£

ͼ3 NamespaceÄÚ´æ½á¹¹
ÔÚÕû¸öNamespaceĿ¼Ê÷ÖдæÔÚÁ½ÖÖ²»Í¬ÀàÐ͵ÄINodeÊý¾Ý½á¹¹£ºINodeDirectoryºÍINodeFile¡£ÆäÖÐINodeDirectory±êʶµÄÊÇĿ¼Ê÷ÖеÄĿ¼£¬INodeFile±êʶµÄÊÇĿ¼Ê÷ÖеÄÎļþ¡£ÓÉÓÚ¶þÕß¾ù¼Ì³Ð×ÔINode£¬ËùÒԾ߱¸´ó²¿·ÖÏàͬµÄ¹«¹²ÐÅÏ¢INodeWithAdditionalFields£¬³ý³£Óûù´¡ÊôÐÔÍ⣬ÆäÖл¹ÌṩÁËÀ©Õ¹ÊôÐÔfeatures£¬ÈçQuota¡¢SnapshotµÈ¾ùͨ¹ýFeatureÔö¼Ó£¬Èç¹ûÒÔºó³öÏÖÐÂÊôÐÔÒ²¿Éͨ¹ýFeature·½±ãÀ©Õ¹¡£²»Í¬µÄÊÇ£¬INodeFileÌØÓеıêʶ¸±±¾ÊýºÍÊý¾Ý¿é´óС×éºÏµÄheader£¨2.6.1Ö®ºóÓÖÐÂÔöÁ˱êʶ´æ´¢²ßÂÔIDµÄÐÅÏ¢£©¼°¸ÃÎļþ°üº¬µÄÓÐÐòBlocksÊý×飻INodeDirectoryÔòÌØÓÐ×Ó½ÚµãµÄÁбíchildren¡£ÕâÀïÐèÒªÌØ±ð˵Ã÷childrenÊÇĬÈÏ´óСΪ5µÄArrayList£¬°´ÕÕ×Ó½ÚµãnameÓÐÐò´æ´¢£¬ËäÈ»ÔÚ²åÈëʱ»áËðʧһ²¿·ÖдÐÔÄÜ£¬µ«ÊÇ¿ÉÒÔ·½±ãºóÐø¿ìËÙ¶þ·Ö²éÕÒÌá¸ß¶ÁÐÔÄÜ£¬¶ÔÒ»°ã´æ´¢ÏµÍ³£¬¶Á²Ù×÷±Èд²Ù×÷Õ¼±ÈÒª¸ß¡£¾ßÌåµÄ¼Ì³Ð¹ØÏµ¼ûͼ4Ëùʾ¡£

ͼ4 INode¼Ì³Ð¹ØÏµ
3.2 BlockManager
BlocksMapÔÚNameNodeÄÚ´æ¿Õ¼äÕ¼¾ÝºÜ´ó±ÈÀý£¬ÓÉBlockManagerͳһ¹ÜÀí£¬Ïà±ÈNamespace£¬BlockManager¹ÜÀíµÄÕⲿ·ÖÊý¾ÝÒª¸´ÔӵĶࡣNamespaceÓëBlockManagerÖ®¼äͨ¹ýÇ°ÃæÌáµ½µÄINodeFileÓÐÐòBlocksÊý×鹨Áªµ½Ò»Æð¡£Í¼5ËùʾBlockManager¹ÜÀíµÄÄÚ´æ½á¹¹¡£

ͼ5 BlockManager¹ÜÀíµÄÄÚ´æ½á¹¹
ÿһ¸öINodeFile¶¼»á°üº¬ÊýÁ¿²»µÈµÄBlock£¬¾ßÌåÊýÁ¿ÓÉÎļþ´óС¼°Ã¿Ò»¸öBlock´óС£¨Ä¬ÈÏΪ64M£©±ÈÖµ¾ö¶¨£¬ÕâЩBlock°´ÕÕËùÔÚÎļþµÄÏȺó˳Ðò×é³ÉBlockInfoÊý×飬Èçͼ5ËùʾµÄBlockInfo[A~K]£¬BlockInfoά»¤µÄÊÇBlockµÄÔªÊý¾Ý£¬½á¹¹Èçͼ6Ëùʾ£¬Êý¾Ý±¾ÉíÊÇÓÉDataNode¹ÜÀí£¬ËùÒÔBlockInfoÐèÒª°üº¬Êµ¼ÊÊý¾Ýµ½µ×ÓÉÄÄЩDataNode¹ÜÀíµÄÐÅÏ¢£¬ÕâÀïµÄºËÐÄÊÇÃûΪtripletsµÄObjectÊý×飬´óСΪ3*replicas£¬ÆäÖÐreplicasÊÇBlock¸±±¾ÊýÁ¿¡£triplets°üº¬µÄÐÅÏ¢£º
triplets[i]£ºBlockËùÔÚµÄDataNode£»
triplets[i+1]£º¸ÃDataNodeÉÏǰһ¸öBlock£»
triplets[i+2]£º¸ÃDataNodeÉϺóÒ»¸öBlock£»
ÆäÖÐi±íʾµÄÊÇBlockµÄµÚi¸ö¸±±¾£¬iȡֵ[0,replicas)¡£

ͼ6 BlockInfo¼Ì³Ð¹ØÏµ
´ÓÇ°ÃæÃèÊö¿ÉÒÔ¿´µ½BlockInfo¼¸¿éÖØÒªÐÅÏ¢£ºÎļþ°üº¬ÁËÄÄЩBlock£¬ÕâЩBlock·Ö±ð±»Êµ¼Ê´æ´¢ÔÚÄÄЩDataNodeÉÏ£¬DataNodeÉÏËùÓÐBlockǰºóÁ´±í¹ØÏµ¡£
Èç¹û´ÓÐÅÏ¢ÍêÕû¶ÈÀ´¿´£¬ÒÔÉÏÊý¾Ý×ã¹»Ö§³ÖËùÓйØÓÚHDFSÎļþϵͳµÄÕý³£²Ù×÷£¬µ«»¹´æÔÚÒ»¸öʹÓó¡¾°½Ï¶àµÄÎÊÌ⣺²»ÄÜͨ¹ýblockid¿ìËÙ¶¨Î»Block£¬ËùÒÔÒýÈëÁËBlocksMap¡£
BlocksMapµ×²ãͨ¹ýLightWeightGSetʵÏÖ£¬±¾ÖÊÊÇÒ»¸öÁ´Ê½½â¾ö³åÍ»µÄ¹þÏ£±í¡£ÎªÁ˱ÜÃârehash¹ý³Ì´øÀ´µÄÐÔÄÜ¿ªÏú£¬³õʼ»¯Ê±£¬Ë÷Òý¿Õ¼äÖ±½Ó¸øµ½ÁËÕû¸öJVM¿ÉÓÃÄÚ´æµÄ2%£¬²¢ÇÒ²»Ôٱ仯¡£¼¯ÈºÆô¶¯¹ý³Ì£¬DataNode»á½øÐÐBR£¨BlockReport£©£¬¸ù¾ÝBRµÄÿһ¸öBlock¼ÆËãÆäHashCode£¬Ö®ºó½«¶ÔÓ¦µÄBlockInfo²åÈëµ½ÏàӦλÖÃÖð½¥¹¹½¨ÆðÀ´¾Þ´óµÄBlocksMap¡£Ç°ÃæÔÚINodeFileÀïÒ²Ìáµ½µÄBlockInfo¼¯ºÏ£¬Èç¹ûÎÒÃǽ«BlocksMapÀïµÄBlockInfoÓëËùÓÐINodeFileÀïµÄBlockInfo·Ö±ðÊÕ¼¯ÆðÀ´£¬¿ÉÒÔ·¢ÏÖÁ½¸ö¼¯ºÏÍêÈ«Ïàͬ£¬ÊÂʵÉÏBlocksMapÀïËùÓеÄBlockInfo¾ÍÊÇINodeFileÖжÔÓ¦BlockInfoµÄÒýÓã»Í¨¹ýBlock²éÕÒ¶ÔÓ¦BlockInfoʱ£¬Ò²ÊÇÏȶÔBlock¼ÆËãHashCode£¬¸ù¾Ý½á¹û¿ìËÙ¶¨Î»µ½¶ÔÓ¦µÄBlockInfoÐÅÏ¢¡£ÖÁ´ËÉæ¼°µ½HDFSÎļþϵͳ±¾ÉíÔªÊý¾ÝµÄÎÊÌâ»ù±¾ÉÏÒѾ½â¾öÁË¡£
Ç°ÃæÌáµ½²¿·Ö¶¼ÊôÓÚ¾²Ì¬Êý¾Ý²¿·Ö£¬NameNodeÄÚ´æÖÐËùÓÐÊý¾Ý¶¼ÒªËæ¶ÁдÇé¿ö·¢Éú±ä»¯£¬BlockManagerµ±È»Ò²ÐèÒª¹ÜÀíÕⲿ·Ö¶¯Ì¬Êý¾Ý¡£Ö÷ÒªÊǵ±Block·¢Éú±ä»¯²»·ûºÏÔ¤ÆÚʱÐèÒª¼°Ê±µ÷ÕûBlocksµÄ·Ö²¼¡£ÕâÀïÉæ¼°¼¸¸öºËÐĵÄÊý¾Ý½á¹¹£º
excessReplicateMap£ºÈôij¸öBlockʵ¼Ê´æ´¢µÄ¸±±¾Êý¶àÓÚÔ¤É踱±¾Êý£¬ÕâʱºòÐèҪɾ³ý¶àÓั±¾£¬ÕâÀï¶àÓั±¾»á±»ÖÃÓÚexcessReplicateMapÖС£excessReplicateMapÊÇ´ÓDataNodeµÄStorageIDµ½Block¼¯ºÏµÄÓ³É伯¡£
neededReplications£ºÈôij¸öBlockʵ¼Ê´æ´¢µÄ¸±±¾ÊýÉÙÓÚÔ¤É踱±¾Êý£¬ÕâʱºòÐèÒª²¹³äȱÉÙ¸±±¾£¬ÕâÀïÄÄЩBlockȱÉÙ¶àÉÙ¸ö¸±±¾¶¼Í³Ò»´æÔÚneededReplicationsÀ±¾ÖÊÉÏneededReplicationsÊÇÒ»¸öÓÅÏȼ¶¶ÓÁУ¬È±ÉÙ¸±±¾ÊýÔ½¶àµÄBlockÖ®ºóÔ½»á±»ÓÅÏÈ´¦Àí¡£
invalidateBlocks£ºÈôij¸öBlock¼´½«±»É¾³ý£¬»á±»ÖÃÓÚinvalidateBlocksÖС£invalidateBlocksÊÇ´ÓDataNodeµÄStorageIDµ½Block¼¯ºÏµÄÓ³É伯¡£Èçij¸öÎļþ±»¿Í»§¶ËÖ´ÐÐÁËɾ³ý²Ù×÷£¬¸ÃÎļþËùÊôµÄËùÓÐBlock»áÏȱ»ÖÃÓÚinvalidateBlocksÖС£
corruptReplicas£ºÓÐЩ³¡¾°BlockÓÉÓÚʱ¼ä´Á/³¤¶È²»Æ¥ÅäµÈµÈÔì³ÉBlock²»¿ÉÓ㬻ᱻÔÝ´æÔÚcorruptReplicasÖУ¬Ö®ºóÔÙ×ö´¦Àí¡£
Ç°Ãæ¼¸¸öÉæ¼°µ½Block·Ö²¼Çé¿ö¶¯Ì¬±ä»¯µÄºËÐÄÊý¾Ý½á¹¹£¬ÕâÀïµÄÊý¾Ýʵ¼ÊÉÏÊǹý¶ÉÐÔÖʵģ¬BlockManagerÄÚ²¿µÄReplicationMonitorỊ̈߳¨Í¼5±êʶThread/Monitor£©»á³ÖÐø´ÓÆäÖÐÈ¡³öÊý¾Ý²¢Í¨¹ýÂß¼´¦Àíºó·Ö·¢¸ø¾ßÌåµÄDatanodeDescriptor¶ÔÓ¦Êý¾Ý½á¹¹£¨3.3
NetworkTopologyÀï»áÓмòµ¥½éÉÜ£©£¬µ±¶ÔÓ¦DataNodeµÄÐÄÌø¹ýÀ´Ö®ºó£¬NameNode»á±éÀúDatanodeDescriptorÀïÔÝ´æµÄÊý¾Ý£¬½«Æäת»»³É¶ÔÓ¦Ö¸Áî·µ»Ø¸øDataNode£¬DataNodeÊÕµ½ÈÎÎñ²¢Ö´ÐÐÍê³ÉºóÔÙ·´À¡»ØNameNode£¬Ö®ºóDatanodeDescriptorÀï¶ÔÓ¦ÐÅÏ¢±»Çå³ý¡£ÈçBlockBÔ¤É踱±¾ÊýΪ3£¬ÓÉÓÚijÖÖÔÒòʵ¼Ê¸±±¾±ä³É4£¨Èç֮ǰÏÂÏßµÄDataNode
DÖØÐÂÉÏÏߣ¬ÆäÖÐBÕýºÃÓÐBlockBµÄÒ»¸ö¸±±¾Êý¾Ý£©£¬BlockManagerÄܼ°Ê±·¢ÏÖ¸±±¾±ä»¯£¬²¢½«¶àÓàµÄDataNode
DÉÏBlockB¸±±¾·ÅÖõ½excessReplicateMapÖУ¬ReplicationMonitorÏ̶߳¨ÆÚ¼ì²éʱ·¢ÏÖexcessReplicateMapÖÐÊý¾Ýºó½«ÆäÒÆµ½DataNode
D¶ÔÓ¦DatanodeDescriptorÖÐinvalidateBlocksÀµ±DataNode DÏ´ÎÐÄÌø¹ýÀ´ºó£¬ËæÐÄÌø·µ»ØÉ¾³ýBlock
BµÄÖ¸ÁDataNode DÊÕµ½Ö¸Áîʵ¼Êɾ³ýÆäÉϵÄBlock BÊý¾Ý²¢·´À¡»ØNameNode£¬´ËºóBlockManager½«DataNode
DÉϵÄBlock B´ÓÄÚ´æÖÐÇå³ý£¬ÖÁ´ËBlock BµÄ¸±±¾·ûºÏÔ¤ÆÚ£¬Õû¸öÁ÷³ÌÈçͼ7Ëùʾ¡£

ͼ7 ¸±±¾ÊýÒ쳣ʱ´¦Àí¹ý³Ì
3.3 NetworkTopology
Ç°Ãæ¶à´ÎÌáµ½BlockÓëDataNodeÖ®¼äµÄ¹ØÁª¹ØÏµ£¬ÊÂʵÉÏNameNodeȷʵ»¹ÐèÒª¹ÜÀíËùÓÐDataNode£¬²»½öÈç´Ë£¬ÓÉÓÚÊý¾ÝдÈëǰÐèҪȷ¶¨Êý¾Ý¿éдÈëλÖã¬NameNode»¹Î¬»¤×ÅÕû¸ö»ú¼ÜÍØÆËNetworkTopology¡£Í¼8ËùʾÄÚ´æÖлú¼ÜÍØÆËͼ¡£

ͼ8 NetworkTopologyÄÚ´æ½á¹¹
´Óͼ8¿ÉÒÔ¿´³öÕâÀï°üº¬Á½¸ö²¿·Ö£º»ú¼ÜÍØÆË½á¹¹NetworkTopologyºÍDataNode½ÚµãÐÅÏ¢¡£ÆäÖÐÊ÷×´µÄ»ú¼ÜÍØÆËÊǸù¾Ý»ú¼Ü¸ÐÖª£¨Ò»°ã¶¼ÊÇÍⲿ½Å±¾¼ÆËãµÃµ½£©ÔÚ¼¯ÈºÆô¶¯Íê³Éºó½¨Á¢ÆðÀ´£¬Õû¸ö»ú¼ÜµÄÍØÆË½á¹¹ÔÚNameNodeµÄÉúÃüÖÜÆÚÄÚÒ»°ã²»»á·¢Éú±ä»¯£»ÁíÒ»²¿·ÖÊDZȽϹؼüµÄDataNodeÐÅÏ¢£¬BlockManagerÒѾÌᵽÿһ¸öDataNodeÉϵÄBlocks¼¯ºÏ¶¼»áÐγÉÒ»¸öË«ÏòÁ´±í£¬¸ü׼ȷµÄÓ¦¸ÃÊÇDataNodeµÄÿһ¸ö´æ´¢µ¥ÔªDatanodeStorageInfoÉϵÄËùÓÐBlocks¼¯ºÏ»áÐγÉÒ»¸öË«ÏòÁ´±í£¬Õâ¸öÁ´±íµÄÈë¿Ú¾ÍÊÇ»ú¼ÜÍØÆË½á¹¹Ò¶×ӽڵ㼴DataNode¹ÜÀíµÄDatanodeStorageInfo¡£´ËÍâÓÉÓÚÉϲãÓ¦ÓöÔÊý¾ÝµÄÔöɾ²éËæÊ±·¢Éú±ä»¯£¬ËæÖ®DatanodeStorageInfoÉϵÄBlocksÒ²»á¶¯Ì¬±ä»¯£¬ËùÒÔNetworkTopologyÉϵÄDataNode¶ÔÏó»¹»á¹ÜÀíÕâЩ¶¯Ì¬±ä»¯µÄÊý¾Ý½á¹¹£¬ÈçreplicateBlocks/recoverBlocks/invalidateBlocks£¬ÕâЩÊý¾Ý½á¹¹ÕýºÃºÍBlockManager¹ÜÀíµÄ¶¯Ì¬Êý¾Ý½á¹¹¶ÔÓ¦£¬ÊµÏÖÁËÊý¾ÝµÄ¶¯Ì¬±ä»¯ÓÉBlockManager´«´ïµ½DataNodeÄÚ´æ¶ÔÏó×îºóͨ¹ýÖ¸ÁîÏ´ﵽÎïÀíDataNodeʵ¼ÊÖ´ÐеÄÁ÷¶¯¹ý³Ì£¬Á÷³ÌÔÚ3.2
BlockManagerÒѾ½éÉÜ¡£
ÕâÀï´æÔÚÒ»¸öÎÊÌ⣬ΪʲôDatanodeStorageInfoÏÂËùÓÐBlockÖ®¼ä»áÒÔË«ÏòÁ´±í×éÖ¯£¬¶ø²»ÊÇÆäËüÊý¾Ý½á¹¹£¿Èç¹û½áºÏʵ¼Ê³¡¾°¾Í²»ÄÑ·¢ÏÖ£¬¶Ôÿһ¸öDatanodeStorageInfoÏÂBlockµÄ²Ù×÷¼¯ÖÐÔÚ¿ìËÙÔö¼Ó/ɾ³ý£¨Block¶¯Ì¬Ôö¼õ±ä»¯£©¼°Ë³Ðò±éÀú£¨BlockReportÆÚ¼ä£©£¬ËùÒÔË«ÏòÁ´±íÊǷdz£ºÏÊʵÄÊý¾Ý½á¹¹¡£
3.4 LeaseManager
Lease »úÖÆÊÇÖØÒªµÄ·Ö²¼Ê½ÐÒ飬¹ã·ºÓ¦ÓÃÓÚ¸÷ÖÖʵ¼ÊµÄ·Ö²¼Ê½ÏµÍ³ÖС£HDFSÖ§³ÖWrite-Once-Read-Many£¬¶ÔÎļþд²Ù×÷µÄ»¥³âͬ²½¿¿LeaseʵÏÖ¡£Leaseʵ¼ÊÉÏÊÇʱ¼äÔ¼ÊøËø£¬ÆäÖ÷ÒªÌØµãÊÇÅÅËûÐÔ¡£¿Í»§¶ËдÎļþʱÐèÒªÏÈÉêÇëÒ»¸öLease£¬Ò»µ©Óпͻ§¶Ë³ÖÓÐÁËij¸öÎļþµÄLease£¬ÆäËü¿Í»§¶Ë¾Í²»¿ÉÄÜÔÙÉêÇëµ½¸ÃÎļþµÄLease£¬Õâ¾Í±£Ö¤ÁËͬһʱ¿Ì¶ÔÒ»¸öÎļþµÄд²Ù×÷Ö»ÄÜ·¢ÉúÔÚÒ»¸ö¿Í»§¶Ë¡£NameNodeµÄLeaseManagerÊÇLease»úÖÆµÄºËÐÄ£¬Î¬»¤ÁËÎļþÓëLease¡¢¿Í»§¶ËÓëLeaseµÄ¶ÔÓ¦¹ØÏµ£¬ÕâÀàÐÅÏ¢»áËæÐ´Êý¾ÝµÄ±ä»¯ÊµÊ±·¢Éú¶ÔÓ¦¸Ä±ä¡£

ͼ9 LeaseManagerµÄÄÚ´æÊý¾Ý½á¹¹
ͼ9ËùʾΪLeaseManagerÄÚ´æ½á¹¹£¬°üÀ¨ÒÔÏÂÈý¸öÖ÷ÒªºËÐÄÊý¾Ý½á¹¹£º
sortedLeases£ºLease¼¯ºÏ£¬°´ÕÕʱ¼äÏȺóÓÐÐò×éÖ¯£¬±ãÓÚ¼ì²éLeaseÊÇ·ñ³¬Ê±£»
leases£º¿Í»§¶Ëµ½LeaseµÄÓ³Éä¹ØÏµ£»
sortedLeasesByPath£ºÎļþ·¾¶µ½LeaseµÄÓ³Éä¹ØÏµ£»
ÆäÖÐÿһ¸öдÊý¾ÝµÄ¿Í»§¶Ë»á¶ÔÓ¦Ò»¸öLease£¬Ã¿¸öLeaseÀï°üº¬ÖÁÉÙÒ»¸ö±êʶÎļþ·¾¶µÄPath¡£Lease±¾ÉíÒѾά»¤ÁËÆä³ÖÓÐÕߣ¨¿Í»§¶Ë£©¼°¸ÃLeaseÕýÔÚ²Ù×÷µÄÎļþ·¾¶¼¯ºÏ£¬Ö®ËùÒÔÔö¼ÓÁËleasesºÍsortedLeasesByPathΪÌá¸ßͨ¹ýLease³ÖÓÐÕß»òÎļþ·¾¶¿ìËÙË÷Òýµ½LeaseµÄÐÔÄÜ¡£
ÓÉÓÚLease±¾ÉíµÄʱ¼äÔ¼ÊøÌØÐÔ£¬µ±Lease·¢Éú³¬Ê±ºóÐèÒªÇ¿ÖÆ»ØÊÕ£¬ÄÚ´æÖÐÓë¸ÃLeaseÏà¹ØµÄÄÚÈÝÒª±»¼°Ê±Çå³ý¡£³¬Ê±¼ì²é¼°³¬Ê±ºóµÄ´¦ÀíÂß¼ÓÉLeaseManager.MonitorͳһִÐС£LeaseManagerÖÐά»¤ÁËÁ½¸öÓëLeaseÏà¹ØµÄ³¬Ê±Ê±¼ä£ºÈí³¬Ê±£¨softLimit£©ºÍÓ²³¬Ê±£¨hardLimit£©£¬Ê¹Óó¡¾°ÉÔÓв»Í¬¡£
Õý³£Çé¿öÏ£¬¿Í»§¶ËÏò¼¯ÈºÐ´ÎļþǰÐèÒªÏòNameNodeµÄLeaseManagerÉêÇëLease£»Ð´Îļþ¹ý³ÌÖж¨ÆÚ¸üÐÂLeaseʱ¼ä£¬ÒÔ·ÀLease¹ýÆÚ£¬ÖÜÆÚÓësoftLimitÏà¹Ø£»Ð´ÍêÊý¾ÝºóÉêÇëÊÍ·ÅLease¡£Õû¸ö¹ý³Ì¿ÉÄÜ·¢ÉúÁ½ÀàÎÊÌ⣺£¨1£©Ð´Îļþ¹ý³ÌÖпͻ§¶ËûÓм°Ê±¸üÐÂLeaseʱ¼ä£»£¨2£©Ð´ÍêÎļþºóûÓгɹ¦ÊÍ·ÅLease¡£Á½¸öÎÊÌâ·Ö±ð¶ÔӦΪsoftLimitºÍhardLimit¡£Á½ÖÖ³¡¾°¶¼»á´¥·¢LeaseManager¶ÔLease³¬Ê±Ç¿ÖÆ»ØÊÕ¡£Èç¹û¿Í»§¶ËдÎļþ¹ý³ÌÖÐûÓм°Ê±¸üÐÂLease³¬¹ýsoftLimitʱ¼äºó£¬ÁíÒ»¿Í»§¶Ë³¢ÊÔ¶ÔͬһÎļþ½øÐÐд²Ù×÷ʱ´¥·¢LeaseÈí³¬Ê±Ç¿ÖÆ»ØÊÕ£»Èç¹û¿Í»§¶ËдÎļþÍê³Éµ«ÊÇûÓгɹ¦ÊÍ·ÅLease£¬Ôò»áÓÉLeaseManagerµÄºǫ́Ïß³ÌLeaseManager.Monitor¼ì²éÊÇ·ñÓ²³¬Ê±ºóͳһ´¥·¢³¬Ê±»ØÊÕ¡£²»¹ÜÊÇsoftLimit»¹ÊÇhardLimit³¬Ê±´¥·¢µÄÇ¿ÖÆLease»ØÊÕ£¬´¦ÀíÂß¼¶¼Ò»Ñù£ºFSNamesystem.internalReleaseLease£¬Âß¼±¾Éí±È½Ï¸´ÔÓ£¬ÕâÀï²»ÔÙÕ¹¿ª£¬¼òµ¥µÄ˵ÏȶÔLease¹ýÆÚǰ×îºóÒ»´ÎдÈëµÄBlock½øÐмì²éºÍÐÞ¸´£¬Ö®ºóÊͷų¬Ê±³ÖÓеÄLease£¬±£Ö¤ºóÃæÆäËü¿Í»§¶ËµÄдÈëÄܹ»Õý³£ÉêÇëµ½¸ÃÎļþµÄLease¡£
NameNodeÄÚ´æÊý¾Ý½á¹¹·Ç³£·á¸»£¬ÕâÀï¶Ô¼¸¸öÖØÒªµÄÊý¾Ý½á¹¹½øÐÐÁ˼òµ¥µÄÃèÊö£¬³ýÁËÇ°ÃæÂÞÁÐÖ®Í⣬Æäʵ»¹ÓÐÈçSnapShotManager/CacheManagerµÈ£¬ÓÉÓÚÆäÄÚ´æÕ¼ÓÃÓÐÏÞÇÒÓÐÒ»Ð©ÌØÐÔ»¹ÉÐδÎȶ¨£¬ÕâÀï²»ÔÙÕ¹¿ª¡£
ËÄ¡¢ÎÊÌâ
Ëæ×ż¯ÈºÖÐÊý¾Ý¹æÄ£µÄ²»¶Ï»ýÀÛ£¬NameNodeÄÚ´æÕ¼ÓÃËæÖ®³É±ÈÀýÔö³¤¡£²»¿É±ÜÃâµÄNameNodeÄڴ潫Öð½¥³ÉΪ¼¯Èº·¢Õ¹µÄÆ¿¾±£¬²¢¿ªÊ¼±©Â©Öî¶àÎÊÌâ¡£
1¡¢Æô¶¯Ê±¼ä±ä³¤¡£NameNodeµÄÆô¶¯¹ý³Ì¿ÉÒÔ·Ö³ÉFsImageÊý¾Ý¼ÓÔØ¡¢editlogs»Ø·Å¡¢Checkpoint¡¢DataNodeµÄBlockReport¼¸¸ö½×¶Î¡£Êý¾Ý¹æÄ£½ÏСʱ£¬Æô¶¯Ê±¼ä¿ÉÒÔ¿ØÖÆÔÚ~10minÒÔÄÚ£¬µ±ÔªÊý¾Ý¹æÄ£´ïµ½5ÒÚ£¨NamespaceÖÐINodeÊý³¬¹ý2ÒÚ£¬BlockÊý½Ó½ü3ÒÚ£©£¬FsImageÎļþ´óС½«½Ó½üµ½20GB£¬¼ÓÔØFsImageÊý¾Ý¾ÍÐèÒª~14min£¬CheckpointÐèÒª~6min£¬ÔÙ¼ÓÉÏÆäËü½×¶ÎÕû¸öÖØÆô¹ý³Ì½«³ÖÐø~50min£¬¼«¶ËÇé¿öÉõÖÁ³¬¹ý60min£¬ËäÈ»¾¹ý¶àÂÖÓÅ»¯ÖØÆô¹ý³ÌÒѾÄܹ»Îȶ¨ÔÚ~30min£¬µ«Ò²·Ç³£ºÄʱ¡£Èç¹ûÊý¾Ý¹æÄ£¼ÌÐøÔö¼Ó£¬Æô¶¯¹ý³Ì½«Í¬²½Ôö¼Ó¡£
2¡¢ÐÔÄÜ¿ªÊ¼Ï½µ¡£HDFSÎļþϵͳµÄËùÓÐÔªÊý¾ÝÏà¹Ø²Ù×÷»ù±¾ÉϾùÔÚNameNode¶ËÍê³É£¬µ±Êý¾Ý¹æÄ£µÄÔö¼ÓÖÂÄÚ´æÕ¼Óñä´óºó£¬ÔªÊý¾ÝµÄÔöɾ¸Ä²éÐÔÄÜ»á³öÏÖϽµ£¬ÇÒÕâÖÖϽµÇ÷ÊÆ»áÒò¹æÄ£Ð§Ó¦¼°¸´ÔӵĴ¦ÀíÂß¼±»·Å´ó£¬Ïà¶Ô¸´ÔÓµÄRPCÇëÇó£¨Èçaddblock£©ÐÔÄÜϽµ¸ü¼ÓÃ÷ÏÔ¡£
3¡¢NameNode JVM FGC£¨Full GC£©·çÏսϸߡ£Ö÷ÒªÌåÏÖÔÚÁ½¸ö·½Ã棺£¨1£©FGCƵÂÊÔö¼Ó£»£¨2£©FGCʱ¼äÔö¼ÓÇÒ·çÏÕ²»¿É¿Ø¡£Õë¶ÔNameNodeµÄÓ¦Óó¡¾°£¬Ä¿Ç°¿´CMSÄÚ´æ»ØÊÕËã·¨±È½ÏÖ÷Á÷£¬Õý³£Çé¿öÏ£¬¶Ô³¬¹ý100GBÄÚ´æ½øÐлØÊÕ´¦Àíʱ£¬¿ÉÒÔ¿ØÖƵ½Ãë¼¶±ðµÄÍ£¶Ùʱ¼ä£¬µ«ÊÇÈç¹û»ØÊÕʧ°Ü±»½µ¼¶µ½´®ÐÐÄÚ´æ»ØÊÕʱ£¬Ó¦ÓõÄÍ£¶Ùʱ¼ä½«´ïµ½Êý°ÙÃ룬Õâ¶ÔÓ¦Óñ¾ÉíÊÇÖÂÃüµÄ¡£
4¡¢³¬´óJVM Heap Sizeµ÷ÊÔÎÊÌâ¡£Èç¹ûÏßÉϼ¯ÈºÐÔÄܱíÏÖ±ä²î£¬²»µÃ²»Í¨¹ý·ÖÎöÄÚ´æ²ÅÄܵõ½½áÂÛʱ£¬»á³ÉΪһ¼þÒì³£À§ÄѵÄÊÂÇé¡£ÇÒ²»ËµDump±¾Éí¼«Æä·Ñʱ·ÑÁ¦£¬Dump³¬´óÄÚ´æÊ±´æÔÚ¼«´ó¸ÅÂÊʹNameNode²»¿É·þÎñ¡£
Õë¶ÔNameNodeÄÚ´æÔö³¤´øÀ´µÄÖî¶àÎÊÌ⣬ÉçÇøºÍÒµ½ç¶¼ÔÚ³ÖÐø¹Ø×¢²¢³¢ÊÔ²»Í¬µÄ½â¾ö·½°¸¡£ÕûÌåÉÏÁ½¸ö˼·£º£¨1£©À©Õ¹NameNode·ÖÉ¢µ¥µã¸ºÔØ£»£¨2£©ÒýÈëÍⲿϵͳ֧³ÖNameNodeÄÚ´æÊý¾Ý¡£
´Ó2010Ä꿪ʼÉçÇø¾ÍͶÈë´óÁ¿¾«Á¦³ÖÐø½â¾ö£¬Federation·½°¸[3]ͨ¹ý¶ÔNameNode½øÐÐˮƽÀ©Õ¹·ÖÉ¢µ¥µã¸ºÔصķ½Ê½½â¾öNameNodeµÄÎÊÌ⣬¾¹ý¼¸ÄêµÄ·¢Õ¹¸Ã·½°¸Öð½¥Îȶ¨£¬Ä¿Ç°ÒѾ±»Òµ½ç¹ã·ºÊ¹Óᣳý´ËÖ®Í⣬ÉçÇøÒ²ÔÚ³¢ÊÔ½«Namespace´æ´¢ÖµÍⲿµÄKV´æ´¢ÏµÍ³ÈçLevelDB[4]£¬´Ó¶ø½µµÍNameNodeÄÚ´æ¸ºÔØ¡£
³ýÉçÇøÍ⣬ҵ½çÒ²ÔÚ³¢ÊÔ×Ô¼ºµÄ½â¾ö·½°¸¡£Baidu HDFS2[5]½«ÔªÊý¾Ý¹ÜÀíͨ¹ýÖ÷´Ó¼Ü¹¹µÄ¼¯ÈºÐÎʽÌṩ·þÎñ£¬±¾ÖÊÉÏÊǽ«ÔÉúNameNode¹ÜÀíµÄNamespaceºÍBlockManagement½øÐÐÎïÀí²ð·Ö¡£ÆäÖÐNamespace¸ºÔð¹ÜÀíÕû¸öÎļþϵͳµÄĿ¼Ê÷¼°Îļþµ½BlockID¼¯ºÏµÄÓ³Éä¹ØÏµ£¬BlockIDµ½DataNodeµÄÓ³Éä¹ØÏµÊǰ´ÕÕÒ»¶¨µÄ¹æÔò·Öµ½¶à¸ö·þÎñ½Úµã·Ö²¼Ê½¹ÜÀí£¬ÕâÖÖ·½°¸ÓëLustreÓÐÏàËÆÖ®´¦£¨Hash-based
Partition£©¡£Taobao HDFS2[6]³¢ÊÔ¹ý²ÉÓÃÁíÍâµÄ˼·£¬½èÖú¸ßËÙ´æ´¢É豸£¬½«ÔªÊý¾Ýͨ¹ýÍâ´æÉ豸½øÐг־û¯´æ´¢£¬±£³ÖNameNodeÍêÈ«ÎÞ״̬£¬ÊµÏÖNameNodeÎÞÏÞÀ©Õ¹µÄ¿ÉÄÜ¡£ÆäËüÀàËÆµÄÖî¶à·½°¸²»Ò»¶ø×ã¡£
¾¡¹ÜÉçÇøºÍÒµ½ç¾ù¶ÔNameNodeÄÚ´æÆ¿¾±ÓгÉÊìµÄ½â¾ö·½°¸£¬µ«ÊDz»Ò»¶¨ÊÊÓÃËùÓеij¡¾°£¬ÓÈÆäÊÇÖÐС¹æÄ£¼¯Èº¡£½áºÏʵ¼ù¹ý³ÌºÍ¼¯Èº¹æÄ£·¢Õ¹ÆÚ¿ÉÄÜÓöµ½µÄNameNodeÄÚ´æÏà¹ØÎÊÌâÕâÀïÓм¸µã½¨Ò飺
ºÏ²¢Ð¡Îļþ¡£ÕýÈçÇ°ÃæÌáµ½£¬Ä¿Â¼/ÎļþºÍBlock¾ù»áÕ¼ÓÃNameNodeÄÚ´æ¿Õ¼ä£¬´óÁ¿Ð¡Îļþ»á½µµÍÄÚ´æÊ¹ÓÃЧÂÊ£»ÁíÍ⣬СÎļþµÄ¶ÁдÐÔÄÜÔ¶Ô¶µÍÓÚ´óÎļþµÄ¶Áд£¬Ö÷ÒªÔÒò¶ÔСÎļþ¶ÁдÐèÒªÔÚ¶à¸öÊý¾ÝÔ´Çл»£¬ÑÏÖØÓ°ÏìÐÔÄÜ¡£
µ÷ÕûºÏÊʵÄBlockSize¡£Ö÷ÒªÕë¶Ô¼¯ÈºÄÚÎļþ½Ï´óµÄÒµÎñ³¡¾°£¬¿ÉÒÔͨ¹ýµ÷ÕûĬÈϵÄBlock Size´óС£¨²ÎÊý£ºdfs.blocksize£¬Ä¬ÈÏ128M£©£¬½µµÍNameNodeµÄÄÚ´æÔö³¤Ç÷ÊÆ¡£
HDFS Federation·½°¸¡£µ±¼¯ÈººÍÊý¾Ý¾ù´ïµ½Ò»¶¨¹æÄ£Ê±£¬½öͨ¹ý´¹Ö±À©Õ¹NameNodeÒѲ»ÄܺܺõÄÖ§³ÖÒµÎñ·¢Õ¹£¬¿ÉÒÔ¿¼ÂÇHDFS
Federation·½°¸ÊµÏÖ¶ÔNameNodeµÄˮƽÀ©Õ¹£¬ÔÚ½â¾öNameNodeµÄÄÚ´æÎÊÌâµÄͬʱͨ¹ýFederation¿ÉÒÔ´ïµ½Á¼ºÃµÄ¸ôÀëÐÔ£¬²»»áÒòΪµ¥Ò»Ó¦ÓÃѹ¿åÕû¼¯Èº¡£
Îå¡¢×ܽá
NameNodeÔÚÕû¸öHDFSϵͳ¼Ü¹¹ÖÐÕ¼¾Ý¾Ù×ãÇáÖØµÄλÖã¬ÄÚ²¿Êý¾ÝºÍ´¦ÀíÂß¼Ïà¶Ô¸´ÔÓ£¬±¾Îļòµ¥ÊáÀíÁËNameNodeµÄÄÚ´æÈ«¾°¼°¶ÔÆäÖм¸¸ö¹Ø¼üÊý¾Ý½á¹¹£¬´ÓNameNodeÄÚ´æºËÐÄÊý¾ÝÊӽǶÔNameNode½øÐÐÁ˼òµ¥µÄ½â¶Á£¬²¢½áºÏʵ¼Ê³¡¾°½éÉÜÁËËæ×ÅÊý¾Ý¹æÄ£µÄÔö¼Ó£¬NameNodeÄÚ´æ¿ÉÄÜÓöµ½µÄÎÊÌâ¼°Òµ½ç¸÷ÖÖ¿É½è¼øµÄ½â¾ö·½°¸¡£ÔÚºóÐøµÄ¡¶HDFS
NameNodeÄÚ´æÏê½â¡·ÖУ¬ÎÒÃÇ»áÏêϸ½â¶ÁNameNodeµÄ¼¸¸ö¹Ø¼üÊý¾Ý½á¹¹£¬·ÖÎö¸÷Êý¾Ý½á¹¹ÔÚJVM
HeapʹÓÃÕ¼±ÈÇé¿ö¡£
|