Ò»¡¢±³¾°
ÔÚHadoop¼¯ÈºÕû¸öÉúÃüÖÜÆÚÀÓÉÓÚµ÷Õû²ÎÊý¡¢Patch¡¢Éý¼¶µÈ¶àÖÖ³¡¾°ÐèҪƵ·±²Ù×÷NameNodeÖØÆô£¬²»ÂÛ²ÉÓúÎÖּܹ¹£¬ÖØÆôÆÚ¼ä¼¯ÈºÕûÌå´æÔÚ¿ÉÓÃÐԺͿɿ¿ÐԵķçÏÕ£¬ËùÒÔÓÅ»¯NameNodeÖØÆô·Ç³£¹Ø¼ü¡£
±¾ÎÄ»ùÓÚHadoop-2.xºÍHA with QJMÉçÇø¼Ü¹¹ºÍϵͳÉè¼Æ£¨Èçͼ1Ëùʾ£©£¬Í¨¹ýÊáÀíNameNodeÖØÆôÁ÷³Ì£¬²¢ÔÚ´Ë»ù´¡ÉÏ£¬²ûÊö¶ÔNameNodeÖØÆôÓÅ»¯Êµ¼ù¡£

ͼ1 HDFS HA with QJM¼Ü¹¹Í¼Ê¾
¶þ¡¢NameNodeÖØÆôÁ÷³Ì
ÔÚHDFSµÄÕû¸öÔËÐÐÆÚÀËùÓÐÔªÊý¾Ý¾ùÔÚNameNodeµÄÄڴ漯ÖйÜÀí£¬µ«ÊÇÓÉÓÚÄÚ´æÒ×Ê§ÌØÐÔ£¬Ò»µ©³öÏÖ½ø³ÌÍ˳ö¡¢å´»úµÈÒì³£Çé¿ö£¬ËùÓÐÔªÊý¾Ý¶¼»á¶ªÊ§£¬¸øÕû¸öϵͳµÄÊý¾Ý°²È«»áÔì³É²»¿É»Ö¸´µÄÔÖÄÑ¡£ÎªÁ˸üºÃµÄÈÝ´íÄÜÁ¦£¬NameNode»áÖÜÆÚ½øÐÐCheckPoint£¬½«ÆäÖеÄÒ»²¿·ÖÔªÊý¾Ý£¨ÎļþϵͳµÄĿ¼Ê÷Namespace£©Ë¢µ½³Ö¾Ã»¯É豸ÉÏ£¬¼´¶þ½øÖÆÎļþFSImage£¬ÕâÑùµÄ»°¼´Ê¹NameNode³öÏÖÒì³£Ò²Äܴӳ־û¯É豸Éϻָ´ÔªÊý¾Ý£¬±£Ö¤ÁËÊý¾ÝµÄ°²È«¿É¿¿¡£
µ«ÊǽöÖÜÆÚ½øÐÐCheckPointÈÔÈ»ÎÞ·¨±£Ö¤ËùÓÐÊý¾ÝµÄ¿É¿¿£¬Èçǰ´ÎCheckPointÖ®ºóдÈëµÄÊý¾ÝÒÀÈ»´æÔÚ¶ªÊ§µÄÎÊÌ⣬ËùÒÔ½«Á½´ÎCheckPointÖ®¼ä¶ÔNamespaceд²Ù×÷ʵʱдÈëEditLogÎļþ£¬Í¨¹ýÕâÖÖ·½Ê½¿ÉÒÔ±£Ö¤HDFSÔªÊý¾ÝµÄ¾ø¶Ô°²È«¿É¿¿¡£
ÊÂʵÉÏ£¬³ýNamespaceÍ⣬NameNode»¹¹ÜÀí·Ç³£ÖØÒªµÄÔªÊý¾ÝBlocksMap£¬ÃèÊöÊý¾Ý¿éBlockÓëDataNode½ÚµãÖ®¼äµÄ¶ÔÓ¦¹ØÏµ¡£NameNode²¢Ã»ÓжÔÕⲿ·ÖÔªÊý¾ÝͬÑù²Ù×÷³Ö¾Ã»¯£¬ÔÒòÊÇÿ¸öDataNodeÒѾ³ÖÓÐÊôÓÚ×Ô¼º¹ÜÀíµÄBlock¼¯ºÏ£¬½«ËùÓÐDataNodeµÄBlock¼¯ºÏ»ã×ܺ󼴿ɹ¹Ôì³öÍêÕûBlocksMap¡£
HA with QJM¼Ü¹¹Ï£¬NameNodeµÄÕû¸öÖØÆô¹ý³ÌÖÐʼÖÕÒÔSBN£¨StandbyNameNode£©½ÇÉ«Íê³É¡£ÓëǰÊöÁ÷³Ì¶ÔÓ¦£¬Æô¶¯¹ý³Ì·ÖÒÔϼ¸¸ö½×¶Î£º
¼ÓÔØFSImage£»
»Ø·ÅEditLog£»
Ö´ÐÐCheckPoint£¨·Ç±ØÐë²½Ö裬½áºÏʵ¼ÊÇé¿öºÍ²ÎÊýÈ·¶¨£¬ºóÐøÏêÊö£©£»
ÊÕ¼¯ËùÓÐDataNodeµÄ×¢²áºÍÊý¾Ý¿é»ã±¨¡£
ĬÈÏÇé¿öÏ£¬NameNode»á±£´æÁ½¸öFSImageÎļþ£¬Óë´Ë¶ÔÓ¦£¬Ò²»á±£´æ¶ÔÓ¦Á½´ÎCheckPointÖ®ºóµÄËùÓÐEditLogÎļþ¡£Ò»°ãÀ´Ëµ£¬NameNodeÖØÆôºó£¬Í¨¹ý¶ÔFSImageÎļþÃû³ÆÅжϣ¬Ñ¡Ôñ¼ÓÔØ×îеÄFSImageÎļþ¼°»Ø·Å¸ÃCheckPointÖ®ºóÉú³ÉµÄËùÓÐEditLog£¬Íê³Éºó¸ù¾Ý¼ÓÔØµÄEditLogÖвÙ×÷ÌõÄ¿Êý¼°¾àÉÏ´ÎCheckPointʱ¼ä¼ä¸ô£¨ºóÐøÏêÊö£©È·¶¨ÊÇ·ñÐèÒªÖ´ÐÐCheckPoint£¬Ö®ºó½øÈëµÈ´ýËùÓÐDataNode×¢²áºÍÔªÊý¾Ý»ã±¨½×¶Î£¬µ±Õⲿ·ÖÊý¾ÝÊÕ¼¯Íê³Éºó£¬NameNodeµÄÖØÆôÁ÷³Ì½áÊø¡£
´ÓÏßÉÏNameNodeÀú´ÎÖØÆôʱ¼äÊý¾Ý¿´£¬¸÷½×¶ÎºÄʱռ±È»ù±¾½Ó½üÈçͼ2Ëùʾ¡£

ͼ2 NameNodeÖØÆô¸÷½×¶ÎºÄʱռ±È
¾¹ýÓÅ»¯£¬ÔÚÔªÊý¾Ý×ÜÁ¿540M£¨Ä¿Â¼Ê÷240M£¬Êý¾Ý¿é300M£©£¬³¬¹ý4K¹æÄ£µÄ¼¯ÈºÉÏÖØÆôNameNode×Üʱ¼ä~35min£¬ÆäÖмÓÔØFSImageºÄʱ~15min£¬Ãë¼¶»Ø·ÅEditLog£¬Êý¾Ý¿é»ã±¨ºÄʱ~20min£¬»ù±¾Äܹ»Âú×ãÉú²ú»·¾³µÄÐèÇó¡£
2.1 ¼ÓÔØFSImage
ÈçǰÊö£¬FSImageÎļþ¼Ç¼ÁËHDFSÕû¸öĿ¼Ê÷NamespaceÏà¹ØµÄÔªÊý¾Ý¡£´ÓHadoop-2.4.0Æð£¬FSImage¿ªÊ¼²ÉÓÃGoogle
Protobuf±àÂë¸ñʽÃèÊö£¨HDFS-5698£©£¬ÏêϸÃèÊöÎļþ¼ûfsimage.proto¡£¸ù¾ÝÃèÊöÎļþºÍʵÏÖÂß¼£¬FSImageÎļþ¸ñʽÈçͼ3Ëùʾ¡£

ͼ3 FSImageÎļþ¸ñʽ
´Ófsimage.protoºÍFSImageÎļþ´æ´¢¸ñʽÈÝÒ׿´µ½£¬³ýÁ˱ØÒªµÄÎļþÍ·²¿Ð£Ñ飨MAGIC£©ºÍβ²¿ÎļþË÷Òý£¨FILESUMMARY£©Í⣬Ö÷Òª°üº¬ÒÔϺËÐÄÊý¾Ý£º
NS_INFO£¨NameSystemSection£©£º¼Ç¼HDFSÎļþϵͳµÄÈ«¾ÖÐÅÏ¢£¬°üÀ¨NameSystemµÄID£¬µ±Ç°ÒѾ·ÖÅä³öÈ¥µÄ×î´óBlock
IDÒÔ¼°Transaction IDµÈÐÅÏ¢£»
INODE£¨INodeSection£©£ºÕû¸öĿ¼Ê÷ËùÓнڵãÊý¾Ý£¬°üÀ¨
INodeFile/INodeDirectory/INodeSymlink µÈËùÓÐÀàÐͽڵãµÄÊôÐÔÊý¾Ý£¬ÆäÖмǼÁËÈç½ÚµãID£¬½ÚµãÃû³Æ£¬·ÃÎÊȨÏÞ£¬´´½¨ºÍ·ÃÎÊʱ¼äµÈµÈÐÅÏ¢£»
INODE_DIR£¨INodeDirectorySection£©£ºÕû¸öĿ¼Ê÷ÖÐËùÓнڵãÖ®¼äµÄ¸¸×Ó¹ØÏµ£¬ÅäºÏINODE¿É¹¹½¨ÍêÕûµÄĿ¼Ê÷£»
FILES_UNDERCONSTRUCTION £¨FilesUnderConstructionSection£©£ºÉÐδÍê³ÉдÈëµÄÎļþ¼¯ºÏ£¬Ö÷ÒªÎªÖØÆôÊ±ÖØ½¨Lease¼¯ºÏ£»
SNAPSHOT£¨SnapshotSection£©£º¼Ç¼SnapshotÊý¾Ý£¬¿ìÕÕÊÇHadoop 2.1.0ÒýÈëµÄÐÂÌØÐÔ£¬ÓÃÓÚÊý¾Ý±¸·Ý¡¢»Ø¹ö£¬ÒÔ·ÀÖ¹ÒòÓû§Îó²Ù×÷µ¼Ö¼¯Èº³öÏÖÊý¾ÝÎÊÌ⣻
SNAPSHOT_DIFF£¨ SnapshotDiffSection£©£ºÖ´ÐпìÕÕ²Ù×÷µÄĿ¼/ÎļþµÄDiff¼¯ºÏÊý¾Ý£¬ÓëSNAPSHOTÒ»Æð¹¹½¨½ÏÍêÕûµÄ¿ìÕÕ¹ÜÀíÄÜÁ¦£»
SECRET_MANAGER £¨SecretManagerSection£©£º¼Ç¼DelegationKe
yºÍ DelegationTokenÊý¾Ý£¬¸ù¾ÝDelegationKey¼°ÓÉDelegationToken¹¹Ôì³öµÄDelegationTokenIdentifier·½±ã½øÒ»²½¼ÆËãÃÜÂ룬ÒÔÉÏÊý¾Ý¿ÉÒÔÍêÉÆËùÓкϷ¨Token¼¯ºÏ£»
CACHE_MANAGER£¨CacheManagerSection£©£º¼¯ÖÐʽ»º´æÌØÐÔÈ«¾ÖÐÅÏ¢£¬¼¯ÖÐʽ»º´æÌØÐÔÊÇHadoop-2.3.0ΪÌáÉýÊý¾Ý¶ÁÐÔÄÜÒýÈëµÄÐÂÌØÐÔ£»
STRING_TABLE£¨StringTableSection£©£º×Ö·û´®µ½IDµÄÓ³Éä±í£¬Î¬»¤Ä¿Â¼/ÎļþµÄPermission×Ö·ûµ½IDµÄÓ³É䣬½ÚÊ¡´æ´¢¿Õ¼ä¡£
NameNodeÖ´ÐÐCheckPointʱ£¬×ñÑProtobuf¶¨Òå¼°ÉÏÊöÎļþ¸ñʽÃèÊö£¬ÖØÆô¼ÓÔØFSImageʱ£¬Í¬Ñù°´ÕÕProtobuf¶¨ÒåµÄ¸ñʽ´ÓÎļþÁ÷ÖжÁ³öÏàÓ¦Êý¾Ý¹¹½¨Õû¸öĿ¼Ê÷Namespace¼°ÆäËûÔªÊý¾Ý¡£½«FSImageÎļþ´Ó³Ö¾Ã»¯É豸¼ÓÔØµ½ÄÚ´æ²¢¹¹½¨³öĿ¼Ê÷½á¹¹ºó£¬Êµ¼ÊÉϲ¢Ã»ÓÐÍêÈ«»Ö¸´ÔªÊý¾Ýµ½×îÐÂ״̬£¬ÒòΪÿ´ÎCheckPointÖ®ºó»¹¿ÉÄÜ´æÔÚ´óÁ¿HDFSд²Ù×÷¡£
2.2 »Ø·ÅEditLog
NameNodeÔÚÏìÓ¦¿Í»§¶ËµÄдÇëÇóǰ£¬»áÊ×ÏȸüÐÂÄÚ´æÏà¹ØÔªÊý¾Ý£¬È»ºóÔÙ°ÑÕâЩ²Ù×÷¼Ç¼ÔÚEditLogÎļþÖУ¬¿ÉÒÔ¿´µ½ÄÚ´æ×´Ì¬Êµ¼ÊÉÏÒª±ÈEditLogÊý¾Ý¸ü¼°Ê±¡£
¼Ç¼ÔÚEditLogÖ®ÖеÄÿ¸ö²Ù×÷ÓÖ³ÆÎªÒ»¸öÊÂÎñ£¬¶ÔÓ¦Ò»¸öÕûÊýÐÎʽµÄÊÂÎñ±àºÅ¡£ÔÚµ±Ç°ÊµÏÖÖжà¸öÊÂÎñ×é³ÉÒ»¸öSegment£¬Éú³É¶ÀÁ¢µÄEditLogÎļþ£¬ÆäÖÐÎļþÃû³Æ±ê¼ÇÁËÆðÖ¹µÄÊÂÎñ±àºÅ£¬ÕýÔÚдÈëµÄEditLogÎļþ½ö±ê¼ÇÆðʼÊÂÎñ±àºÅ¡£EditLogÎļþµÄ¸ñʽ·Ç³£¼òµ¥£¬Ã»ÔÙͨ¹ýGoogle
ProtobufÃèÊö£¬Îļþ¸ñʽÈçͼ4Ëùʾ¡£

ͼ4 EditLogÎļþ¸ñʽ
Ò»¸öÍêÕûµÄEditLogÎļþ°üÀ¨Ëĸö²¿·ÖÄÚÈÝ£¬·Ö±ðÊÇ£º
LAYOUTVERSION£º°æ±¾ÐÅÏ¢£»
OP_START_LOG_SEGMENT£º±êʶÎļþ¿ªÊ¼£»
RECORD£ºË³ÐòÖð¸ö¼Ç¼HDFSд²Ù×÷µÄÊÂÎñÄÚÈÝ£»
OP_END_LOG_SEGMENT£º±ê¼ÇÎļþ½áÊø¡£
NameNode¼ÓÔØFSImageÍê³Éºó£¬¼´¿ªÊ¼¶Ô¸ÃFSImageÎļþÖ®ºó£¨Í¨¹ý±È½ÏFSImageÎļþÃû³ÆÖаüº¬µÄÊÂÎñ±àºÅÓëEditLogÎļþÃû³ÆµÄÆðʼÊÂÎñ±àºÅ´óСȷ¶¨£©Éú³ÉµÄËùÓÐEditLogÑϸñ°´ÕÕÊÂÎñ±àºÅ´ÓСµ½´óÖð¸ö×ñÑÉÏÊöµÄ¸ñʽ½øÐÐÿһ¸öHDFSд²Ù×÷ÊÂÎñ»Ø·Å¡£
NameNode¼ÓÔØÍêËùÓбØÐèµÄEditLogÎļþÊý¾Ýºó£¬ÄÚ´æÖеÄĿ¼Ê÷¼´»Ö¸´µ½ÁË×îÐÂ״̬¡£
2.3 DataNode×¢²á»ã±¨
¾¹ýÇ°ÃæÁ½¸ö²½Ö裬Ö÷ÒªµÄÔªÊý¾Ý±»¹¹½¨£¬HDFSµÄÕû¸öĿ¼Ê÷±»ÍêÕû½¨Á¢£¬µ«ÊDz¢Ã»ÓÐÕÆÎÕÊý¾Ý¿éBlockÓëDataNodeÖ®¼äµÄ¶ÔÓ¦¹ØÏµBlocksMap£¬ÉõÖÁ¶ÔDataNodeµÄÇé¿ö¶¼²»ÕÆÎÕ£¬ËùÒÔÐèÒªµÈ´ýDataNode×¢²á£¬²¢Íê³É¶Ô´ÓDataNode»ã±¨ÉÏÀ´µÄÊý¾Ý¿é»ã×Ü¡£´ý»ã×ܵÄÊý¾ÝÁ¿´ïµ½Ô¤Éè±ÈÀý£¨dfs.namenode.safemode.threshold-pct£©ºóÍ˳öSafemode¡£
NameNodeÖØÆô¾¹ý¼ÓÔØFSImageºÍ»Ø·ÅEditLogºó£¬ËùÓÐDataNode²»¹Ü½ø³ÌÊÇ·ñ·¢Éú¹ýÖØÆô£¬¶¼±ØÐë¾¹ýÒÔÏÂÁ½¸ö²½Ö裺
DataNodeÖØÐÂ×¢²áRegisterDataNode£»
DataNode»ã±¨ËùÓÐÊý¾Ý¿éBlockReport¡£
¶ÔÓÚ½Úµã¹æÄ£½Ï´óºÍÔªÊý¾ÝÁ¿½Ï´óµÄ¼¯Èº£¬Õâ¸ö½×¶ÎµÄºÄʱ»á·Ç³£¿É¹Û¡£Ö÷ÒªÓÐÈýµãÔÒò£º
´¦ÀíBlockReportµÄÂß¼±È½Ï¸´ÔÓ£¬Ïà¶ÔÆäËûRPC²Ù×÷ºÄʱ½Ï³¤¡£Í¼5¶Ô±ÈÁËBlockReportºÍAddBlockÁ½ÖÖ²»Í¬RPCµÄ´¦Àíʱ¼ä£¬¾¡¹ÜAddBlock²Ù×÷Ò²Ïà¶Ô¸´ÔÓ£¬µ«ÊǶԱÈÀ´¿´£¬BlockReportµÄ´¦Àíʱ¼äÏÔÖø¸ßÓÚAddBlock´¦Àíʱ¼ä£»
NameNode¶Ôÿһ¸öBlockReportµÄRPCÇëÇó´¦Àí¶¼ÐèÒª³ÖÓÐÈ«¾ÖËø£¬Ò²¾ÍÊÇ˵¶ÔÓÚBlockReportÀàÐÍRPCÇëÇóʵ¼ÊÉÏÊÇ´®Ðд¦Àí£»
NameNodeÖØÆôʱËùÓÐDataNode¼¯ÖÐÔÚͬһʱ¼ä¶Î½øÐÐBlockReportÇëÇó¡£

ͼ5 BlockReportºÍAddBlockÁ½¸öRPC´¦Àíʱ¼ä¶Ô±È
֮ǰÎÒÃÇÔÚNameNodeÄÚ´æÈ«¾°Ò»ÎÄÖÐÏêϸÃèÊö¹ýBlockÔÚNameNodeÔªÊý¾ÝÖеĹؼü×÷Óü°ÓëNamespace/DataNode/BlocksMapµÄ¸´ÔÓ¹ØÏµ£¬´ÓÖÐÒ²¿ÉÒÔ¿´³ö£¬Ã¿¸öÐÂÔöBlockÐèҪά»¤¶à¸ö¹ØÏµ£¬¸üºÎ¿öÖØÆô¹ý³ÌÖÐËùÓÐBlock¶¼ÐèÒª½¨Á¢Í¬Ñù¸´ÔÓ¹ØÏµ£¬ËùÒÔºÄʱÏà¶Ô½Ï¸ß¡£
Èý¡¢ÖØÆôÓÅ»¯
¸ù¾ÝÇ°Ãæ¶ÔNameNodeÖØÆô¹ý³ÌµÄ¼òµ¥ÊáÀí£¬ÔÚ¸÷¸ö½×¶Î¿ÉÒÔÊʵ±µÄʵʩÓÅ»¯ÒÔ¼Ó¿ìNameNodeÖØÆô¹ý³Ì¡£
HDFS-7097 ½â¾öÖØÆô¹ý³ÌÖÐSBNÖ´ÐÐCheckPointʱ²»ÄÜ´¦ÀíBlockReportÇëÇóµÄÎÊÌâ
Fix£º2.7.0
Hadoop-2.7.0°æ±¾Ç°£¬SBN£¨StandbyNameNode£©ÔÚÖ´ÐÐCheckPoint²Ù×÷ǰ»áÏÈ»ñµÃÈ«¾Ö¶ÁÐ´ËøfsLock£¬ÔÚ´ËÆÚ¼ä£¬BlockReportÇëÇóÓÉÓÚ²»ÄÜ»ñµÃÈ«¾ÖÐ´Ëø»á³ÖÐø´¦Óڵȴý״̬£¬Ö±µ½CheckPointÍê³ÉºóÊÍ·ÅÁËfsLockËøºó²ÅÄܼÌÐø¡£NameNodeÖØÆôµÄµÚÈý¸ö½×¶Î£¬Í¬Ñù´æÔÚÕâÖÖÇé¿ö¡£¶øÇÒ¶ÔÓÚ¹æÄ£½Ï´óµÄ¼¯Èº£¬Ã¿´ÎCheckPointʱ¼äÔÚ·ÖÖÓ¼¶±ð£¬¶ÔÕû¸öÖØÆô¹ý³ÌÓ°Ïì·Ç³£´ó¡£Êµ¼ÊÉÏ£¬CheckPointÊǶÔĿ¼Ê÷µÄ³Ö¾Ã»¯²Ù×÷£¬²¢²»Éæ¼°BlocksMapÊý¾Ý½á¹¹£¬ËùÒÔCheckPointÆÚ¼äÊÇ¿ÉÒÔÈÃBlockReportÇëÇóÖ±½Óͨ¹ý£¬ÕâÑù¿ÉÒÔ½ÚÊ¡ÆÚ¼äBlockReportÅŶӵȴý´øÀ´µÄʱ¼ä¿ªÏú£¬HDFS-7097ÕýÊǽ«ËøÁ£¶È·ÅС½â¾öÁËCheckPoint¹ý³Ì²»ÄÜ´¦ÀíBlockReportÀàÐÍRPCÇëÇóµÄÎÊÌâ¡£
ÓëHDFS-7097Ïà¶Ô£¬ÁíÒ»ÖÖ˼·ҲֵµÃ½è¼ø£¬¾ÍÊÇÖØÆô¹ý³Ì¾¡¿ÉÄܱÜÃâ³öÏÖCheckPoint¡£´¥·¢CheckPointÓÐÁ½ÖÖÇé¿ö£ºÊ±¼äÖÜÆÚ»òHDFSд²Ù×÷ÊÂÎñÊý£¬·Ö±ðͨ¹ý²ÎÊý
dfs.namenode.checkpoint.period ºÍ dfs.namenode.checkpoint.txns
¿ØÖÆ£¬Ä¬ÈÏÖµ·Ö±ðÊÇ3600sºÍ1,000,000£¬¼´Ä¬ÈÏÇé¿öÏÂÒ»¸öСʱ»òÕßд²Ù×÷µÄÊÂÎñÊý³¬¹ý1,000,000´¥·¢Ò»´ÎCheckPoint¡£ÎªÁ˱ÜÃâÔÚÖØÆô¹ý³ÌÖÐÆµ·±Ö´ÐÐCheckPoint£¬¿ÉÒÔÊʵ±µ÷´ódfs.namenode.checkpoint.txns£¬½¨ÒéÖµ10,000,000
~ 20,000,000£¬´øÀ´µÄÓ°ÏìÊÇEditLogÎļþÀۼƵĸöÊý»áÉÔÓÐÔö¼Ó¡£´Óʵ¼ù¾ÑéÉÏ¿´£¬¶ÔÒ»¸öÓÐÒÚ¼¶±ðÔªÊý¾ÝÁ¿µÄNameNode£¬»Ø·ÅÒ»¸öEditLogÎļþ£¨Ä¬ÈÏ1,000,000д²Ù×÷ÊÂÎñ£©Ê±¼äÔÚÃë¼¶£¬µ«ÊÇÖ´ÐÐÒ»´ÎCheckPointʱ¼äͨ³£ÔÚ·ÖÖÓ¼¶±ð£¬×ÛºÏȨºâ¼õÉÙCheckPoint´ÎÊýºÍÔö¼ÓEditLogÎļþÊýÊÕÒæ±È½ÏÃ÷ÏÔ¡£
HDFS-6763 ½â¾öSBNÿ¼ä¸ô1minÈ«¾Ö¼ÆËãºÍÑéÖ¤QuotaÖµµ¼Ö½ø³ÌHangסÊýÃëµÄÎÊÌâ
Fix£º2.8.0
ANN£¨ActiveNameNode£©½«HDFSд²Ù×÷ʵʱдÈëJNµÄEditLogÎļþ£¬ÎªÍ¬²½Êý¾Ý£¬SBNĬÈϼä¸ô1min´ÓJNÀȡһ´ÎEditLogÎļþ²¢½øÐлطţ¬Íê³ÉºóÖ´ÐÐÈ«¾ÖQuota¼ì²éºÍ¼ÆË㣬µ±Namespace¹æÄ£±ä´óºó£¬È«¾Ö¼ÆËãºÍ¼ì²éQuota»á·Ç³£ºÄʱ£¬ÔÚ´ËÆÚ¼ä£¬Õû¸öSBNµÄNamenode½ø³Ì»á±»Hangס£¬ÒÔÖÁÓÚ°üÀ¨DNÐÄÌøºÍBlockReportÔÚÄÚµÄËùÓÐRPCÇëÇó¶¼²»Äܼ°Ê±´¦Àí¡£NameNodeÖØÆô¹ý³ÌÖÐÕâ¸öÎÊÌâÓ°ÏìÍ»³ö¡£
ʵ¼ÊÉÏ£¬SBNÔÚEditLog Tailer½×¶Î¼ÆËãºÍ¼ì²éQuotaÍêȫûÓбØÒª£¬HDFS-6763½«Õâ¶Î´¦ÀíÂß¼ºóÒÆµ½Ö÷´ÓÇл»Ê±½øÐУ¬½â¾öSBN½ø³Ì¼ä¸ô1min±»HangסµÄÎÊÌâ¡£
´ÓÓÅ»¯Ð§¹ûÉÏ¿´£¬¶ÔÒ»¸öÓµÓнӽüÎåÒÚÔªÊý¾ÝÁ¿£¬ÆäÖÐÁ½ÒÚÊý¾Ý¿éµÄNameNode£¬ÓÅ»¯Ç°Êý¾Ý¿é»ã±¨½×¶ÎºÄʱ~30min£¬ÆäÖд¥·¢³¬¹ý20´ÎÓÉÓÚ¼ÆËãºÍ¼ì²éQuotaµ¼Ö½ø³ÌHangס~20sµÄÇé¿ö£¬Õû¸öBlockReport½×¶Î´æÔÚ³¬¹ý5minÎÞЧʱ¼ä¿ªÏú£¬ÓÅ»¯ºó¿Éµ½~25min¡£
HDFS-7980 ¼ò»¯Ê×´ÎBlockReport´¦ÀíÂß¼ÓÅ»¯ÖØÆôʱ¼ä
Fix£º2.7.1
NameNode¼ÓÔØÍêÔªÊý¾Ýºó£¬ËùÓÐDataNode³¢ÊÔ¿ªÊ¼½øÐÐÊý¾Ý¿é»ã±¨£¬Èç¹û»ã±¨µÄÊý¾Ý¿éÏà¹ØÔªÊý¾Ý»¹Ã»ÓмÓÔØ£¬ÏÈÔÝ´æÏûÏ¢¶ÓÁУ¬µ±NameNodeÍê³É¼ÓÔØÏà¹ØÔªÊý¾Ýºó£¬ÔÙ´¦Àí¸ÃÏûÏ¢¶ÓÁС£¶ÔµÚÒ»´Î¿é»ã±¨µÄ´¦Àí±È½ÏÌØ±ð£¨NameNodeÖØÆôºó£¬ËùÓÐDataNodeµÄBlockReport¶¼»á±»±ê¼Ç³ÉÊ×´ÎÊý¾Ý¿é»ã±¨£©£¬ÎªÌá¸ß´¦ÀíËÙ¶È£¬½öÑéÖ¤¿éÊÇ·ñË𻵣¬Ö®ºóÅжϿé״̬ÊÇ·ñΪFINALIZED£¬ÈôÊǽ¨Á¢Êý¾Ý¿éÓëDataNodeµÄÓ³Éä¹ØÏµ£¬½¨Á¢ÓëĿ¼Ê÷ÖÐÎļþµÄ¹ØÁª¹ØÏµ£¬ÆäËûÐÅÏ¢Ò»¸ÅÔݲ»´¦Àí¡£¶ÔÓڷdzõ´ÎÊý¾Ý¿é»ã±¨£¬´¦ÀíÂß¼Òª¸´ÔӺܶ࣬¶Ô±¨¸æµÄÿ¸öÊý¾Ý¿é£¬²»½ö¼ì²éÊÇ·ñË𻵣¬ÊÇ·ñΪFINALIZED״̬£¬»¹»á¼ì²éÊÇ·ñÎÞЧ£¬ÊÇ·ñÐèҪɾ³ý£¬ÊÇ·ñΪUC״̬µÈµÈ£»Ñé֤ͨ¹ýºó½¨Á¢Êý¾Ý¿éÓëDataNodeµÄÓ³Éä¹ØÏµ£¬½¨Á¢ÓëĿ¼Ê÷ÖÐÎļþµÄ¹ØÁª¹ØÏµ¡£
³õ´ÎÊý¾Ý¿é»ã±¨µÄ´¦ÀíÂß¼¶ÀÁ¢³öÀ´£¬Ö÷ÒªÔÒòÓÐÁ½·½Ã棺
¼Ó¿ìNameNodeµÄÆô¶¯Ê±¼ä£»²âÊÔÊý¾ÝÏÔʾº¬~500MÔªÊý¾ÝµÄNameNodeÔÚ´¦Àí800K¸öÊý¾Ý¿éµÄ³õ´Î¿é»ã±¨µÄ´¦Àíʱ¼ä±ÈÕý³£¿é»ã±¨µÄ´¦Àíʱ¼ä¿É½µµÍÒ»¸öÊýÁ¿¼¶£»
Æô¶¯¹ý³ÌÖУ¬²»ÌṩÕý³£¶Áд·þÎñ£¬ËùÒÔֻҪȷ±£Õý³£Êý¾Ý£¨Õû¸öNamespaceºÍËùÓÐFINALIZED״̬Blocks£©ÎÞÎó£¬ÎÞЧºÍÈßÓàÊý¾Ý´¦ÀíÍêÈ«¿ÉÒÔÑÓºóµ½IBR£¨IncrementalBlockReport£©»òÏ´ÎBR£¨BlockReport£©¡£
Õâ±¾À´ÊǷdz£ºÏÀíºÍÕý³£µÄÉè¼ÆÂß¼£¬µ«ÊÇʵÏÖʱNameNodeÔÚÅжÏÊÇ·ñΪÊ×´ÎÊý¾Ý¿é¿é»ã±¨µÄÂß¼Ò»Ö±´æÔÚÎÊÌ⣬µ¼ÖÂÕâ¶Î·Ç³£ºÃµÄ¸Ä½øµãÂ߼ʵ¼ÊÉϳ¤ÆÚ²¢Î´ÕæÕýÖ´Ðе½£¬Ö±µ½HDFS-7980ÔÚHadoop-2.7.1ÐÞ¸´¸ÃÎÊÌâ¡£HDFS-7980µÄÓÅ»¯Ð§¹û·Ç³£Ã÷ÏÔ£¬²âÊÔÏÔʾ£¬¶Ôº¬80K
BlocksµÄBlockReport RPCÇëÇóµÄ´¦Àíʱ¼ä´Ó~500ms¿ÉÓÅ»¯µ½~100ms£¬´ÓÖØÆôÆÚÕû¸öBlockReport½×¶Î¿´£¬ÔÚ³¬¹ý600MÔªÊý¾Ý£¬ÆäÖÐ300MÊý¾Ý¿éµÄNameNodeÏÔʾ¸Ã½×¶Î´Ó~50minÓÅ»¯µ½~25min¡£
HDFS-7503 ½â¾öÖØÆôǰ´óɾ³ý²Ù×÷»áÔì³ÉÖØÆôºóËøÄÚдÈÕÖ¾½µµÍ´¦ÀíÄÜÁ¦
Fix£º2.7.0
ÈôNameNodeÖØÆôǰ²úÉú¹ý´óɾ³ý²Ù×÷£¬µ±NameNode¼ÓÔØÍêFSImage²¢»Ø·ÅÁËËùÓÐEditLog¹¹½¨Æð×îÐÂĿ¼Ê÷½á¹¹ºó£¬ÔÚ´¦ÀíDataNodeµÄBlockReportʱ£¬»á·¢ÏÖÓдóÁ¿Block²»ÊôÓÚÈκÎÎļþ£¬Hadoop-2.7.0°æ±¾Ç°£¬¶ÔÓÚÕâÀàÇé¿öµÄÊä³öÈÕÖ¾Âß¼ÔÚÈ«¾ÖËøÄÚ£¬ÓÉÓÚ´æÔÚ´óÁ¿IO²Ù×÷µÄºÄʱ£¬»áÑÏÖØÀ³¤´¦ÀíBlockReportµÄ´¦Àíʱ¼ä£¬Ó°ÏìNameNodeÖØÆôʱ¼ä¡£HDFS-7503µÄ½â¾ö°ì·¨·Ç³£¼òµ¥£¬°ÑÈÕÖ¾Êä³öÂß¼ÒÆ³öÈ«¾ÖËøÍâ¡£ÏßÉÏЧ¹ûÉÏ¿´¶ÔͬÀೡ¾°ÓÅ»¯±È½ÏÃ÷ÏÔ£¬²»¹ýÈç¹ûÖØÆôǰ²»´¥·¢´óµÄɾ³ý²Ù×÷Ó°Ïì²»´ó¡£
·ÀÖ¹Èȱ¸½ÚµãSBN£¨StandbyNameNode£©/À䱸½ÚµãSNN£¨SecondaryNameNode£©³¤Ê±¼äδÕý³£ÔËÐжѻý´óÁ¿EditlogÍÏÂýNameNodeÖØÆôʱ¼ä
Ñ¡ÔñHAÈȱ¸·½°¸SBN£¨StandbyNameNode£©»¹ÊÇÀ䱸·½°¸SNN£¨SecondaryNameNode£©¼Ü¹¹£¬Ö´ÐÐCheckPointµÄÂß¼¼¸ºõÒ»Ö£¬Èçͼ6Ëùʾ¡£Èç¹ûSBN/SNN·þÎñ³¤Ê±¼äδÕý³£ÔËÐУ¬CheckPoint²»Äܰ´ÕÕÔ¤ÆÚÖ´ÐУ¬ÕâÑù»á»ýѹ´óÁ¿EditLog¡£»ýѹµÄEditLogÎļþÔ½¶à£¬ÖØÆôNameNodeÐèÒª¼ÓÔØEditLogʱ¼äÔ½³¤¡£ËùÒÔ¾¡¿ÉÄܱÜÃâ³öÏÖSNN/SBN³¤Ê±¼äδÕý³£·þÎñµÄ״̬¡£

ͼ6 CheckPointÁ÷³Ì
ÔÚÒ»¸öÓÐ500MÔªÊý¾ÝµÄNameNodeÉϲâÊÔ¼ÓÔØÒ»¸ö200K´ÎHDFSÊÂÎñ²Ù×÷µÄEditLogÎļþºÄʱ~5s£¬°´ÕÕĬÈÏ2minµÄEditLog¹ö¶¯ÖÜÆÚ£¬Èç¹ûÒ»ÖÜʱ¼äSBN/SNNδÄÜÕý³£¹¤×÷£¬Ôò»áÀÛ»ý~5K¸öEditLogÎļþ£¬´ËºóÒ»µ©·¢ÉúNameNodeÖØÆô£¬½ö¼ÓÔØEditLogÎļþµÄʱ¼ä¾ÍÐèÒª~7h£¬Ò²¾ÍÊÇÕû¸ö¼¯Èº´æÔÚ³¬¹ý7h²»¿ÉÓ÷çÏÕ£¬ËùÒÔÇмÇÒª±£Ö¤SBN/SNN²»Äܳ¤Ê±¼ä¹ÊÕÏ¡£
HDFS-6425 HDFS-6772 NameNodeÖØÆôºóDataNode¿ìËÙÍ˳öblockContentsStale״̬·ÀÖ¹PostponedMisreplicatedBlocks¹ý´óÓ°Ïì¶ÔÆäËûRPCÇëÇóµÄ´¦ÀíÄÜÁ¦
Fix: 2.6.0£¬ 2.7.0
µ±¼¯ÈºÖдóÁ¿Êý¾Ý¿éµÄʵ¼Ê´æ´¢¸±±¾¸öÊý³¬¹ý¸±±¾Êýʱ£¨¿ç»ú·¿¼Ü¹¹ÏÂÕâÖÖÇé¿ö±È½Ï³£¼û£©£¬NameNodeÖØÆôºó»áѸËÙÌî³äµ½PostponedMisreplicatedBlocks£¬Ö±µ½Ïà¹ØÊý¾Ý¿éËùÔÚµÄËùÓÐDataNode»ã±¨Íê³ÉÇÒÍ˳öStale״̬ºó²ÅÄܱ»ÇåÀí¡£Èç¹ûPostponedMisreplicatedBlocksÊý¾ÝÁ¿½Ï´ó£¬Ã¿´ÎÈ«±éÀúÐèÒªÏûºÄ´óÁ¿Ê±¼ä£¬ÇÒÕû¸ö¹ý³ÌÒ²Òª³ÖÓÐÈ«¾ÖËø£¬ÑÏÖØÓ°Ïì´¦ÀíBlockReportµÄÐÔÄÜ£¬HDFS-6425ºÍHDFS-6772·Ö±ð½«¿ÉÄÜÔÚBlockReportÂß¼ÄÚ²¿±éÀú·Ç³£´óµÄÊý¾Ý½á¹¹PostponedMisreplicatedBlocksÓÅ»¯µ½Òì²½Ö´ÐУ¬²¢ÔÚNameNodeÖØÆôºóÈÃDataNode¿ìËÙÍ˳öblockContentsStale״̬±ÜÃâPostponedMisreplicatedBlocks¹ý´óÈëÊÖÓÅ»¯ÖØÆôЧÂÊ¡£
½µµÍBlockReportʱÊý¾Ý¹æÄ£
NameNode´¦ÀíBlockReportµÄЧÂʵÍÖ÷ÒªÔÒò»¹ÊÇÿ´ÎBlockReportËù´øµÄBlock¹æÄ£¹ý´óÔì³É£¬ËùÒÔ¿ÉÒÔͨ¹ýµ÷ÕûBlockÊýÁ¿ãÐÖµ£¬½«Ò»´ÎBlockReport·Ö³É¶àÅÌ·Ö±ð»ã±¨£¬ÒÔÌá¸ßNameNode¶ÔBlockReportµÄ´¦ÀíЧÂÊ¡£¿É²Î¿¼µÄ²ÎÊýΪ£ºdfs.blockreport.split.threshold£¬Ä¬ÈÏÖµ1,000,000£¬¼´µ±DataNode±¾µØµÄBlock¸öÊý³¬¹ý1,000,000ʱ²Å»á·ÖÅ̽øÐл㱨£¬½¨Ò齫¸Ã²ÎÊýÊʵ±µ÷С£¬¾ßÌåÊýÖµ¿É½áºÏNameNodeµÄ´¦ÀíBlockReportʱ¼ä¼°¼¯ÈºÖÐËùÓÐDataNode¹ÜÀíµÄBlockÁ¿·Ö²¼È·¶¨¡£
ÖØÆôÍê³Éºó¶Ô±È¼ì²éÊý¾Ý¿éÉϱ¨Çé¿ö
Ç°ÃæÌáµ½NameNode»ã×ÜDataNodeÉϱ¨µÄÊý¾Ý¿éÁ¿´ïµ½Ô¤Éè±ÈÀý£¨dfs.namenode.safemode.threshold-pct£©ºó¾Í»áÍ˳öSafemode£¬Ò»°ãÇé¿öÏ£¬µ±NameNodeÍ˳öSafemodeºó£¬ÎÒÃÇÈÏΪÒѾ¾ß±¸ÌṩÕý³£·þÎñµÄÌõ¼þ¡£µ«ÊǶԹæÄ£½Ï´óµÄ¼¯Èº£¬°´ÕÕÕâÖÖĬÈϲßÂÔ¼°Ê±Ö´ÐÐÖ÷´ÓÇл»ºó£¬ÈÝÒ׳öÏÖ¶Ìʱ¼ä¶ª¿éµÄÎÊÌâ¡£¿¼ÂÇÔÚ200MÊý¾Ý¿éµÄ¼¯Èº£¬Ä¬ÈÏÅäÖÃÏîdfs.namenode.safemode.threshold-pct=0.999£¬Ò²¾ÍÊǵ±NameNodeÊÕ¼¯µ½200M*0.999=199.8MÊý¾Ý¿éºó¼´¿ÉÍ˳öSafemode£¬´Ëʱʵ¼ÊÉÏ»¹ÓÐ200KÊý¾Ý¿éûÓÐÉϱ¨£¬Èç¹ûÇ¿ÐÐÖ´ÐÐÖ÷´ÓÇл»£¬»á³öÏÖ´óÁ¿µÄ¶ª¿éÎÊÌ⣬ֱµ½Êý¾Ý¿é»ã±¨Íê³É¡£Ó¦¶ÔµÄ°ì·¨±È½Ï¼òµ¥£¬³¢ÊÔµ÷´ódfs.namenode.safemode.threshold-pctµ½1£¬ÕâÑùÖ»ÓÐËùÓÐÊý¾Ý¿éÉϱ¨ºó²Å»áÍ˳öSafemode¡£µ«ÊÇÕâÖÖ°ì·¨Ò»Ñù²»Äܱ£Ö¤ÍòÎÞһʧ£¬Èç¹ûÆô¶¯¹ý³ÌÖÐÓÐDataNode»ã±¨ÍêÊý¾Ý¿éºó½ø³Ì¹Òµô£¬Í¬Ñù´æÔÚ¶Ìʱ¼ä¶ªÊ§Êý¾ÝµÄÎÊÌ⣬ÒòΪNameNode»ã×ÜÉϱ¨Êý¾Ý¿éʱ²¢²»¼ì²é¸±±¾Êý£¬ËùÒÔ¸üÎÈÍ׵Ľâ¾ö°ì·¨ÊÇÀûÓÃÖ÷´ÓNameNodeµÄJMXÊý¾Ý¶Ô±ÈËùÓÐDataNodeµ±Ç°»ã±¨Êý¾Ý¿éÁ¿µÄ²îÒ죬µ±²îÒì¶¼½ÏСºóÔÙÖ´ÐÐÖ÷´ÓÇл»¿ÉÒÔ±£Ö¤²»·¢ÉúÉÏÊöÎÊÌâ¡£
ÆäËû
³ýÁËÓÅ»¯NameNodeÖØÆôʱ¼ä£¬Êµ¼ÊÔËάÖл¹»áÓöµ½ÐèÒª¹ö¶¯ÖØÆô¼¯ÈºËùÓнڵã»òÕßÒ»´ÎÐÔÖØÆôÕû¼¯ÈºµÄÇé¿ö£¬²»Ç¡µ±µÄÖØÆô·½Ê½Ò²»áÑÏÖØÓ°Ïì·þÎñµÄ»Ö¸´Ê±¼ä£¬ËùÒÔºÏÀí¿ØÖÆÖØÆôµÄ½Ú×à»òÑ¡ÔñºÏÊʵÄÖØÆô·½Ê½ÓÈΪ¹Ø¼ü£¬HDFS¼¯ÈºÆô¶¯·½Ê½·ÖÎöÒ»ÎĶԼ¯ÈºÖØÆô·½Ê½½øÐÐÁËÏêϸµÄ²ûÊö£¬ÕâÀï¾Í²»ÔÙÕ¹¿ª¡£
¾¹ý¶à´ÎÓÅ»¯µ÷Õû£¬´ÓÏßÉÏNameNodeÀú´ÎµÄÖØÆôʱ¼ä¼à¿ØÖ¸±êÉÏ¿´£¬ÊÕÒæ·Ç³£Ã÷ÏÔ£¬Í¼7½ØÈ¡ÁËÆäÖм¸´ÎNameNodeÖØÆôʱԪÊý¾ÝÁ¿¼°ÖØÆôʱ¼ä¿ªÏú¶Ô±È£¬Í¼ÖÐÖ±¹ÛÏÔʾÔÚ500MÔªÊý¾ÝÁ¿¼¶Ï£¬ÖØÆôʱ¼ä´Ó~4000sÓÅ»¯µ½~2000s¡£

ͼ7 NameNodeÖØÆôʱ¼ä¶Ô±È
ÕâÀïÂÞÁÐÁËһС²¿·Öʵ¼ù¹ý³ÌÖпÉÒÔÓÐЧÓÅ»¯ÖØÆôNameNodeʱ¼ä»òÕßÖØÆôÈ«¼¯ÈºµÄµã£¬ÆäÖаüÀ¨ÁËÉçÇø³ÉÊìPatchºÍÏà¹Ø²ÎÊýÓÅ»¯£¬ËäȻʵÏÖÂß¼¶¼ºÜС£¬µ«ÊÇʵ¼ùÊÕÒæ·Ç³£Ã÷ÏÔ¡£µ±È»³ýÁËÉÏÊöÌáµ½£¬NameNodeÖØÆô»¹Óкܶà¿ÉÒÔÓÅ»¯µÄµØ·½£¬±ÈÈçÓÅ»¯FSImage¸ñʽ£¬²¢ÐмÓÔØµÈµÈ£¬ÉçÇøÒ²ÔÚ³ÖÐø¹Ø×¢ºÍÓÅ»¯£¬²¿·ÖÌÖÂÛµÄ˼·ҲֵµÃ¹Ø×¢¡¢½è¼øºÍ²Î¿¼¡£
ËÄ¡¢×ܽá
NameNodeÖØÆôÉõÖÁÈ«¼¯ÈºÖØÆôÔÚÕû¸öHadoop¼¯ÈºµÄÉúÃüÖÜÆÚÄÚÊÇ±È½ÏÆµ·±µÄÔËά²Ù×÷£¬ÓÅ»¯ÖØÆôʱ¼ä¿ÉÒÔ¼«´óÌáÉýÔËάЧÂÊ£¬±ÜÃâ¿ÉÄÜ´æÔڵķçÏÕ¡£±¾ÎÄͨ¹ý·ÖÎöNameNodeÆô¶¯Á÷³Ì£¬²¢½á |