Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
º£Á¿Êý¾Ý½â¾ö˼·֮HashËã·¨
 
×÷Õߣºzengzhaozheng µÄBLOG À´Ô´£º51CTO ·¢²¼ÓÚ£º2014-12-30
  4591  次浏览      27
 

Ò»¡¢¸ÅÊö

±¾ÎĽ«´ÖÂÔ½²ÊöÒ»ÏÂHashËã·¨µÄ¸ÅÄîÌØÐÔ£¬Àï±ß»á½áºÏ·Ö²¼Ê½ÏµÍ³¸ºÔؾùºâʵÀý¶ÔHashµÄÒ»ÖÂÐÔ×öÉîÈë̽ÌÖ¡£ÁíÍ⣬̽ÌÖÒ»ÏÂHashËã·¨ÔÚº£Á¿Êý¾Ý´¦Àí·½°¸ÖеÄͨÓÃÐÔ¡£×îºó£¬´ÓÔ´´úÂë³ö·¢£¬¾ßÌå·ÖÎöÒ»ÏÂHashËã·¨ÔÚMapReduce¿ò¼ÜµÄÖеÄÓ¦Óá£

¶þ¡¢HashËã·¨

Hash¿ÉÒÔͨ¹ýÉ¢Áк¯Êý½«ÈÎÒⳤ¶ÈµÄÊäÈë±ä³É¹Ì¶¨³¤¶ÈµÄÊä³ö£¬Ò²¿ÉÒÔ½«²»Í¬µÄÊäÈëÓ³Éä³ÉΪÏàͬµÄÏàͬµÄÊä³ö£¬¶øÇÒÕâЩÊä³ö·¶Î§Ò²ÊǿɿØÖƵģ¬ËùÒÔÆðµ½Á˺ܺõÄѹËõÓ³ÉäºÍµÈ¼ÛÓ³É书ÄÜ¡£ÕâÐ©ÌØÐÔ±»Ó¦Óõ½ÁËÐÅÏ¢°²È«ÁìÓòÖмÓÃÜËã·¨£¬ÆäÖеȼÛÓ³ÉäÕâÒ»ÌØÐÔÔÚº£Á¿Êý¾Ý½â¾ö·½°¸ÖÐÆðµ½Ï൱´óµÄ×÷Óã¬ÌرðÊÇÔÚÕû¸öMapReduce¿ò¼ÜÖУ¬ÏÂÃæÕ½ڻá¶ÔÕâ¶þ·½ÃæÏêϸ˵¡£»°Ëµ£¬HashΪʲô»áÓÐÕâÖÖѹËõÓ³ÉäºÍµÈ¼ÛÓ³É书ÄÜ£¬Ö÷ÒªÊÇÒòΪHashº¯ÊýÔÚʵÏÖÉ϶¼Ê¹Óõ½ÁËȡģ¡£ÏÂÃæ¿´¿´¼¸ÖÖ³£ÓõÄHashº¯Êý£º

¡¤Ö±½ÓÈ¡Óà·¨£ºf(x):= x mod maxM ; maxMÒ»°ãÊDz»Ì«½Ó½ü 2^t µÄÒ»¸öÖÊÊý¡£

¡¤³Ë·¨È¡Õû·¨£ºf(x):=trunc((x/maxX)*maxlongit) mod maxM£¬Ö÷ÒªÓÃÓÚʵÊý¡£

¡¤Æ½·½È¡Öз¨£ºf(x):=(x*x div 1000 ) mod 1000000); ƽ·½ºóÈ¡ÖмäµÄ£¬Ã¿Î»°üº¬ÐÅÏ¢±È½Ï¶à¡£

Èý¡¢HashËã·¨ÔÚº£Á¿Êý¾Ý´¦Àí·½°¸ÖеÄÓ¦ÓÃ

µ¥»ú´¦Àíº£Á¿Êý¾ÝµÄ´óÌåÖ÷Á÷˼ÏëÊǺÍMapReduce¿ò¼ÜÒ»Ñù£¬¶¼ÊDzÉÈ¡·Ö¶øÖÎÖ®µÄ·½·¨£¬½«º£Á¿Êý¾ÝÇзÖΪÈô¸ÉС·ÝÀ´½øÐд¦Àí£¬²¢ÇÒÔÚ´¦ÀíµÄ¹ý³ÌÖÐÒª¼æ¹ËÄÚ´æµÄʹÓÃÇé¿öºÍ´¦Àí²¢·¢Á¿Çé¿ö¡£¶ø¸ü¼Ó×ÐϸµÄ´¦ÀíÁ÷³Ì´óÌåÉÏ·ÖΪ¼¸²½£¨¶Ô´ó¶àÊýÇé¿ö¶¼Ê¹Óã¬ÆäÖÐÉÙ²¿·ÖÇé¿öÒª¸ù¾ÝÄã×Ô¼ºµÄʵ¼ÊÇé¿öºÍÆäËû½â¾ö·½·¨×ö±È½Ï²ÉÓÃ×î·ûºÏʵ¼ÊµÄ·½·¨£©£º

µÚÒ»²½£º·Ö¶øÖÎÖ®¡£

²ÉÓÃHashȡģ½øÐеȼÛÓ³Éä¡£²ÉÓÃÕâÖÖ·½·¨¿ÉÒÔ½«¾Þ´óµÄÎļþ½øÐеȼ۷ָעÒ⣺·ûºÏÒ»¶¨¹æÂɵÄÊý¾ÝÒª±»·Ö¸îµ½Í¬Ò»¸öСÎļþ£©±ä³ÉÈô¸É¸öСÎļþÔÙ½øÐд¦Àí¡£Õâ¸ö·½·¨Õë¶ÔÊý¾ÝÁ¿¾Þ´ó£¬ÄÚ´æÊܵ½ÏÞÖÆÊ±Ê®·ÖÓÐЧ¡£

µÚ¶þ²½£ºÀûÓÃhashMapÔÚÄÚ´æÖнøÐÐͳ¼Æ¡£

ÎÒÃÇͨ¹ýHashÓ³É佫´óÎļþ·Ö¸îΪСÎļþºó£¬¾Í¿ÉÒÔ²ÉÓÃHashMapÕâÑùµÄ´æ´¢½á¹¹À´¶ÔСÎļþÖеĹØ×¢Ïî½øÐÐÆµÂÊͳ¼Æ¡£¾ßÌåµÄ×ö·¨Êǽ«Òª½øÐÐͳ¼ÆµÄItem×÷ΪHashMapµÄkey£¬´ËItem³öÏֵĴÎÊý×÷Ϊvalue¡£

µÚÈý²½£ºÔÚÉÏÒ»²½½øÐÐͳ¼ÆÍê±ÏÖ®ºó¸ù¾Ý³¡¾°ÐèÇóÍùÍùÐèÒª¶Ô´æ´¢ÔÚHashMapÖеÄÊý¾Ý¸ù¾Ý³öÏֵĴÎÊýÀ´½øÐÐÅÅÐò¡£ÆäÖÐÅÅÐòÎÒÃÇ¿ÉÒÔ²ÉÓöÑÅÅÐò¡¢¿ìËÙÅÅÐò¡¢¹é²¢ÅÅÐòµÈ·½·¨¡£

ÏÖÔÚÎÒÃÇÀ´¿´¿´¾ßÌåµÄÀý×Ó:

¡¾Àý×Ó1¡¿º£Á¿ÈÕÖ¾Êý¾Ý£¬ÌáÈ¡³öijÈÕ·ÃÎʰٶȴÎÊý×î¶àµÄÄǸöIP

˼·£ºµ±¿´µ½ÕâÑùµÄÒµÎñ³¡¾°£¬ÎÒÃÇÄÔ×ÓÀïÓ¦¸ÃÁ¢Âí»áÏëµ½ÕâЩº£Á¿Íø¹ØÈÕÖ¾Êý¾ÝÁ¿Óжà´ó£¿ÕâЩIPÓжàÉÙÖÐ×éºÏÇé¿ö£¬×î´óÇé¿öÏÂÕ¼¶àÉÙ´æ´¢¿Õ¼ä£¿½â¾öÕâÑùµÄÎÊÌâǰÎÒÃÇ×îÖØÒªµÄÏÈÒªÖªµÀÊý¾ÝµÄ¹æÄ££¬ÕâÑù²ÅÄÜ´Ó´óÌåÉÏÖÆ¶¨½â¾ö·½°¸¡£ËùÒÔÏÖÔÚ¼ÙÉèÕâЩÕâÐ©Íø¹ØÈÕÖ¾Á¿ÓÐ3T¡£ÏÂÃæ´óÌå°´ÕÕÎÒÃÇÉÏÃæµÄ²½ÖèÀ´¶Ô½â¾ö´Ë³¡¾°½øÐзÖÎö£º

£¨1£©Ê×ÏÈ£¬´ÓÕâЩº£Á¿Êý¾ÝÖйýÂ˳öÖ¸¶¨Ò»Ìì·ÃÎʰٶȵÄÓû§IP,²¢Öð¸öдµ½Ò»¸ö´óÎļþÖС£

£¨2£©²ÉÓá°·Ö¶øÖÎÖ®¡±µÄ˼ÏëÓÃHashÓ³É佫´óÎļþ½øÐзָµÍÊý¾Ý¹æÄ£¡£°´ÕÕIPµØÖ·µÄHash(IP)%1024Öµ£¬°Ñº£Á¿IPÈÕÖ¾·Ö±ð´æ´¢µ½1024¸öСÎļþÖУ¬ÆäÖÐHashº¯ÊýµÃ³öֵΪ·Ö¸îºóСÎļþµÄ±àºÅ¡£

£¨3£©Öð¸ö¶ÁСÎļþ£¬¶ÔÓÚÿһ¸öСÎļþ¹¹½¨Ò»¸öIPΪkey£¬³öÏÖ´ÎÊýΪvalueµÄHashMap¡£¶ÔÓÚÔõôÀûÓÃHashMap¼Ç¼IP³öÏֵĴÎÊýÕâ¸ö±È½Ï¼òµ¥£¬ÒòΪÎÒÃÇ¿ÉÒÔͨ¹ý³ÌÐò¶ÁСÎļþ½«IP·Åµ½HashMapÖÐkeyµÄÖ®ºó¿ÉÒÔÏÈÅжϴËIPÊÇ·ñÒѾ­´æÔÚÈç¹û²»´æÔÚÖ±½Ó·Å½øÈ¥£¬Æä³öÏÖ´ÎÊý¼Ç¼Ϊ1£¬Èç¹û´ËIPÒѾ­´æ´¢Ôò¹ýµÃÆä¶ÔÓ¦µÄvalueÖµÒ²¾ÍÊdzöÏֵĴÎÊýÈ»ºó¼Ó1¾Íok¡£×îºó£¬°´ÕÕIP³öÏֵĴÎÊý²ÉÓÃÅÅÐòËã·¨¶ÔHashMapÖеÄÊý¾Ý½øÐÐÅÅÐò£¬Í¬Ê±¼Ç¼µ±Ç°³öÏÖ´ÎÊý×î¶àµÄÄǸöIPµØÖ·£»

£¨4£©×ßµ½Õâ²½£¬ÎÒÃÇ¿ÉÒԵõ½1024¸öСÎļþÖгöÏÖ´ÎÊý×î¶àµÄIPÁË£¬ÔÙ²ÉÓ󣹿µÄÅÅÐòËã·¨ÕÒ³ö×ÜÌåÉϳöÏÖ´ÎÊý×î¶àµÄIP¾ÍokÁË¡£

Õâ¸öÎÒÃÇÐèÒªÌØ±ðµØÃ÷È·ÖªµÀһϼ¸µãÄÚÈÝ£º

µÚÒ»£ºÎÒÃÇͨ¹ýHashº¯Êý:Hash(IP)%1024½«´óÎļþÓ³Éä·Ö¸îΪÁË1024¸öСÎļþ£¬ÄÇôÕâ1024¸öСÎļþµÄ´óСÊÇ·ñ¾ùÔÈ£¿ÁíÍ⣬ÎÒÃDzÉÓÃHashMapÀ´½øÐÐIPƵÂʵÄͳ¼Æ£¬ÄÚ´æÏûºÄÊÇ·ñºÏÊÊ£¿

Ê×ÏÈÊǵÚÒ»¸öÎÊÌ⣬±»·Ö¸îµÄСÎļþµÄ´óСµÄ¾ùÔȳ̶ÈÊÇÈ¡¾öÓÚÎÒÃÇʹÓÃÔõôÑùµÄHashº¯Êý£¬¶Ô±¾³¡¾°¶øÑÔ¾ÍÊÇ£ºHash(IP)%1024¡£Éè¼ÆÁ¼ºÃµÄHashº¯Êý¿ÉÒÔ¼õÉÙ³åÍ»£¬Ê¹Êý¾Ý¾ùÔȵķָ1024¸öСÎļþÖС£µ«ÊǾ¡¹ÜÊý¾ÝÓ³Éäµ½ÁËÁíÍâһЩ²»Í¬µÄλÖ㬵«Êý¾Ý»¹ÊÇÔ­À´µÄÊý¾Ý£¬Ö»ÊÇ´úÌæºÍ±íʾÕâЩԭʼÊý¾ÝµÄÐÎʽ·¢ÉúÁ˱仯¶øÒÑ¡£

ÁíÍ⣬¿´¿´µÚ¶þ¸öÎÊÌ⣺ÓÃHashMapͳ¼ÆIP³öÏÖÆµÂʵÄÄÚ´æÊ¹ÓÃÇé¿ö¡£

ÒªÏëÖªµÀHashMapÔÚͳ¼ÆIP³öÏֵįµÂÊ£¬ÄÇôÎÒÃDZØÐë¶ÔIP×éºÏµÄÇé¿öÓÐËùÁ˽⡣32BitµÄIP×î¶à¿ÉÒÔÓÐ2^32ÖÖµÄ×éºÏ·½Ê½£¬Ò²¾ÍÊÇ˵ȥËùÓÐIP×î¶àÕ¼4G´æ´¢¿Õ¼ä¡£Ôڴ˳¡¾°ÖУ¬ÎÒÃÇÒѾ­¸ù¾ÝIPµÄhashÖµ½«´óÎļþ·Ö¸î³öÁË1024¸öСÎļþ£¬Ò²¾ÍÊÇ˵Õâ4GµÄIPÒѾ­±»·ÖÉ¢µ½ÁË1024¸öÎļþÖС£ÄÇôÔÚHashº¯ÊýÉè¼ÆºÏÀí×îperfectµÄÇé¿öÏÂÕë¶Ôÿ¸öСÎļþµÄHashMapÕ¼µÄÄÚ´æ´óС×î¶àΪ4G/1024+´æ´¢IP¶ÔÓ¦µÄ´ÎÊýËùÕ¼µÄ¿Õ¼ä£¬ËùÒÔÄÚ´æ¾ø¶Ô¹»Óá£

µÚ¶þ£ºHashȡģÊÇÒ»ÖֵȼÛÓ³É䣬»»¾ä»°ËµÍ¨¹ýÓ³Éä·Ö¸îÖ®ºóÏàͬµÄÔªËØÖ»»á·Öµ½Í¬Ò»¸öСÎļþÖÐÈ¥µÄ¡£¾Í±¾³¡¾°¶øÑÔ£¬ÏàͬµÄIPͨ¹ýHashº¯ÊýºóÖ»»á±»·Ö¸îµ½Õâ1024¸öСÎļþÖÐµÄÆäÖÐÒ»¸öÎļþ¡£

¡¾Àý×Ó2¡¿¸ø¶¨a¡¢bÁ½¸öÎļþ£¬¸÷´æ·Å50ÒÚ¸öurl£¬Ã¿¸öurl¸÷Õ¼64×Ö½Ú£¬ÄÚ´æÏÞÖÆÊÇ4G£¬ÈÃÄãÕÒ³öa¡¢bÎļþ¹²Í¬µÄurl£¿

˼·:»¹ÊÇÀÏÒ»Ì×£¬ÏÈHashÓ³Éä½µµÍÊý¾Ý¹æÄ££¬È»ºóͳ¼ÆÅÅÐò¡£

¾ßÌå×ö·¨£º

£¨1£©·ÖÎöÏÖÓÐÊý¾ÝµÄ¹æÄ£¡£

°´ÕÕÿ¸öurl64×Ö½ÚÀ´Ë㣬ÿ¸öÎļþÓÐ50ÒÚ¸öurl£¬ÄÇôÿ¸öÎļþ´óСΪ5G*64=320G¡£320GÔ¶Ô¶³¬³öÄÚ´æÏÞ¶¨µÄ4G£¬ËùÒÔ²»Äܽ«ÆäÈ«²¿¼ÓÔØµ½ÄÚ´æÖÐÀ´½øÐд¦Àí£¬ÐèÒª²ÉÓ÷ֶøÖÎÖ®µÄ·½·¨½øÐд¦Àí¡£

(2)HashÓ³Éä·Ö¸îÎļþ¡£ÖðÐжÁÈ¡Îļþa£¬²ÉÓÃhashº¯Êý£ºHash(url)%1000½«url·Ö¸îµ½1000¸öСÎļþÖУ¬Îļþ¼´Îªf1_1,f1_2,f1_3,...,f1_1000¡£ÄÇôÀíÏëÇé¿öÏÂÿ¸öСÎļþµÄ´óС´óԼΪ300m×óÓÒ¡£ÔÙÒÔÏàͬµÄ·½·¨¶Ô´óÎļþb½øÐÐÏàͬµÄ²Ù×÷Ôٵõ½1000¸öСÎļþ£¬¼ÇΪ£ºf2_1,f2_2,f2_3,...,f2_1000¡£

¾­¹ýÒ»·¬ÕÛÌÚºóÎÒÃǽ«´óÎļþ½øÐÐÁ˷ָÇÒ½«Ïàͬurl¶¼·Ö¸îµ½ÁËÕâ2×éСÎļþÖÐϱêÏàͬµÄÁ½¸öÎļþÖÐ,ÆäʵÎÒÃÇ¿ÉÒÔ½«Õâ2×éÎļþ¿´³ÉÒ»¸öÕûÌ壺f1_1&f2_1£¬f1_2&,f2_2,f1_3&f2_3,...,f1_1000&f2_1000¡£ÄÇôÎÒÃǾͿÉÒÔ½«ÎÊÌâת»¯³ÉΪÇóÕâ1000¶ÔСÎļþÖÐÏàͬµÄurl¾Í¿ÉÒÔÁË¡£½ÓÏÂÀ´£¬Çóÿ¶ÔСÎļþÖеÄÏàͬurl£¬Ê×ÏȽ«Ã¿¶Ô¶ÔСÎļþÖнÏСµÄÄǸöµÄurl·Åµ½HashSet½á¹¹ÖУ¬È»ºó±éÀú¶ÔÓ¦Õâ¶ÔСÎļþÖеÄÁíÒ»¸öÎļþ£¬¿´ÆäÊÇ·ñ´æ²Å¸Õ¸Õ¹¹½¨µÄHashSetÖУ¬Èç¹û´æÔÚ˵Ã÷ÊÇÒ»ÑùµÄurl£¬½«ÕâurlÖ±½Ó´æµ½½á¹ûÎļþ¾ÍokÁË¡£

¡¾Àý×Ó3¡¿ÓÐ10¸öÎļþ£¬Ã¿¸öÎļþ1G£¬Ã¿¸öÎļþµÄÿһÐдæ·ÅµÄ¶¼ÊÇÓû§µÄquery£¬Ã¿¸öÎļþµÄquery¶¼¿ÉÄÜÖØ¸´¡£ÒªÇóÄã°´ÕÕqueryµÄƵ¶ÈÅÅÐò¡£

¡¾Àý×Ó4¡¿ÓÐÒ»¸ö1G´óСµÄÒ»¸öÎļþ£¬ÀïÃæÃ¿Ò»ÐÐÊÇÒ»¸ö´Ê£¬´ÊµÄ´óС²»³¬¹ý16×Ö½Ú£¬ÄÚ´æÏÞÖÆ´óСÊÇ1M¡£·µ»ØÆµÊý×î¸ßµÄ100¸ö´Ê¡£

ÏñÀý×Ó3ºÍÀý×Ó4ÕâЩ³¡¾°¶¼¿ÉÒÔÓÃÎÒÃǵÄÒ»¹áÀÏÕÐÊý½â¾ö£ºÏÈHashÓ³Éä½µµÍÊý¾Ý¹æÄ££¬È»ºóͳ¼Æ¼ÓÔØµ½Äڴ棬×îºóÅÅÐò¡£¾ßÌå×ö·¨¿ÉÒԲο¼ÉÏÃæ2¸öÀý×Ó¡£

ËÄ¡¢HashËã·¨ÔÚMapReduce¿ò¼ÜÖеÄÓ¦ÓÃ

HashËã·¨ÔÚ·Ö²¼Ê½¼ÆËã¿ò¼ÜMapReduceÖÐÆðןËÐÄ×÷Óá£ÏÈÀ´¿´¿´ÏÂÃæÕû¸ömapreduceµÄÔËÐÐÁ÷³Ì£¬Ê×ÏÈÊÇԭʼÊý¾Ý¾­¹ýÇÐÆ¬½øÈëµ½mapº¯ÊýÖУ¬¾­¹ýmapº¯ÊýµÄÊý¾Ý»áÔÚÕû¸ö»·Ðλº³åÇøÀï±ß½øÐеÚÒ»´ÎÅÅÐò£¬½Ó×ÅmapµÄÊä³ö½á¹û»á¸ù¾ÝkeyÖµ(ĬÈÏÇé¿öÊÇÕâÑù£¬ÁíÍâ¿ÉÒÔ×Ô¶¨Òå)½øÐÐHashÓ³É佫Êý¾ÝÁ¿ÅÓ´óµÄmapÊä³ö·Ö¸îΪN·Ý£¨NΪreduceÊýÄ¿£©À´ÊµÏÖÊý¾ÝµÄ²¢Ðд¦Àí£¬Õâ¾ÍÊÇPartition½×¶Î£¬ÁíÍâMapReduce¿ò¼ÜÖÐPartitionµÄʵÏÖ·½Ê½ÍùÍùÄܹ»¾ö¶¨Êý¾ÝµÄÇãб¶È£¬ËùÒÔÔÚ´¦ÀíÊý¾Ýǰ×îºÃÒª¶ÔÊý¾ÝµÄ·Ö²¼Çé¿öÓÐËùÁ˽⡣

½ÓÏÂÀ´´ÓMapReudceµÄÔ´Âë½Ç¶ÈÀ´Ñо¿Ò»ÏÂPartitionµÄʵÏÖÔ­Àí£º

ÆäPartitionµÄʵÏÖÖ÷ÒªÓУºHashPartitioner¡¢BinaryPartitioner¡¢KeyFieldBasedPartitioner¡¢TotalOrderPartitionerÕ⼸ÖÖ£¬ÆäÖÐHashPartitionerÊÇĬÈϵġ£Ê×ÏÈÀ´¿´¿´HashPartitionerµÄºËÐÄʵÏÖ£º

/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.hadoop.mapreduce.lib.partition;
import org.apache.hadoop.mapreduce.Partitioner;
/** Partition keys by their {@link Object#hashCode()}. */
public class HashPartitioner<K, V> extends Partitioner<K, V> {
/** Use {@link Object#hashCode()} to partition. */
public int getPartition(K key, V value,
int numReduceTasks) {
return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}
}

ÎÒÃÇ¿´µ½µÚ25ÐУ¬ÔÚÕâÀïÎÒÃÇÓп´µ½Á˿ɰ®µÄHashȡģӳÉä·½·¨£¬ÕâÑù×öµÄÔ­Òò´ó¼Ò¿´µ½ÕâÀï¶¼Ó¦¸ÃÒѾ­ÁËÈ»ÓÚÐÄÁË¡£ÁíÍ⣬TotalOrderPartitioner¡¢BinaryPartitionerµÈ¼¸ÖÖPartitionerµÄʵÏÖ¶¼ÊÇ»ùÓÚHashȡģӳÉä·½·¨£¬Ö»ÊÇËûÃÇΪÁËʵÏÖ×Ô¼º×Ô¶¨ÒåµÄ¹¦ÄܶøÌí¼ÓÁËһЩÂß¼­£¬ÀýÈçÆäÖеÄTotalOrderPartitioner¿ÉÒÔʵÏÖÈ«ÅÅÐò¹¦ÄÜ¡£ÆäËû¼¸¸öPartitionµÄÔ´´úÂëÕâÀï¾Í²»ÌùÁË£¬ÓÐÐËȤµÄ¿ÉÒÔ×Ô¼º¿´¿´¡£

Îå¡¢HashËã·¨µÄÒ»ÖÂÐÔ

±¾²¿·ÖΪ±¾ÎÄ×îºóÒ»²¿·Ö£¬Ö®ËùÒÔÒª½éÉÜÕâÒ»²¿·ÖµÄÄÚÈÝÖ÷ÒªÊÇ´ÓHashËã·¨µÄÍêÕûÐÔ³ö·¢µÄ£¬Õⲿ·ÖµÄÄÚÈݺͺ£Á¿Êý¾ÝµÄ½â¾ö·½°¸¹ØÏµ²»´ó£¬Ö÷ÒªÊÇÓÃÓÚ·Ö²¼Ê½»º´æÉè¼Æ·½Ãæ¡£ÓÉÓÚ¹ØÓÚÕⲿ·ÖµÄÄÚÈÝÒѾ­ÓÐһЩ´óÄÃÃÇ×öÁ˺ÜÉîÈëµÄÑо¿²¢ÇÒ½²½âµØÏ൱ÍêÃÀ£¬Ð¡µÜÕâÀï¾ÍÖ±½ÓÒýÓÃÁË¡£ËùÒÔ±¾²¿·ÖÒýÓÃsparkliangµÄblog¡£

consistent hashingËã·¨ÔçÔÚ1997Äê¾ÍÔÚÂÛÎÄConsistent hashing and random treesÖб»Ìá³ö£¬Ä¿Ç°ÔÚcacheϵͳÖÐÓ¦ÓÃÔ½À´Ô½¹ã·º£»

1 »ù±¾³¡¾°

±ÈÈçÄãÓÐN¸öcache·þÎñÆ÷£¨ºóÃæ¼ò³Æcache£©£¬ÄÇôÈçºÎ½«Ò»¸ö¶ÔÏóobjectÓ³Éäµ½N¸öcacheÉÏÄØ£¬ÄãºÜ¿ÉÄÜ»á²ÉÓÃÀàËÆÏÂÃæµÄͨÓ÷½·¨¼ÆËãobjectµÄhashÖµ£¬È»ºó¾ùÔȵÄÓ³Éäµ½µ½N¸öcache£»hash(object)%N

Ò»Çж¼ÔËÐÐÕý³££¬ÔÙ¿¼ÂÇÈçϵÄÁ½ÖÖÇé¿ö£»

1 Ò»¸öcache·þÎñÆ÷m downµôÁË£¨ÔÚʵ¼ÊÓ¦ÓÃÖбØÐëÒª¿¼ÂÇÕâÖÖÇé¿ö£©£¬ÕâÑùËùÓÐÓ³Éäµ½cache mµÄ¶ÔÏó¶¼»áʧЧ£¬Ôõô°ì£¬ÐèÒª°Ñcache m´ÓcacheÖÐÒÆ³ý£¬ÕâʱºòcacheÊÇN-1̨£¬Ó³É乫ʽ±ä³ÉÁËhash(object)%(N-1)£»

2 ÓÉÓÚ·ÃÎʼÓÖØ£¬ÐèÒªÌí¼Ócache£¬ÕâʱºòcacheÊÇN+1̨£¬Ó³É乫ʽ±ä³ÉÁËhash(object)%(N+1)£»

1ºÍ2Òâζ×Åʲô£¿ÕâÒâζ×ÅͻȻ֮¼ä¼¸ºõËùÓеÄcache¶¼Ê§Ð§ÁË¡£¶ÔÓÚ·þÎñÆ÷¶øÑÔ£¬ÕâÊÇÒ»³¡ÔÖÄÑ£¬ºéË®°ãµÄ·ÃÎʶ¼»áÖ±½Ó³åÏòºǫ́·þÎñÆ÷£»

ÔÙÀ´¿¼ÂǵÚÈý¸öÎÊÌ⣬ÓÉÓÚÓ²¼þÄÜÁ¦Ô½À´Ô½Ç¿£¬Äã¿ÉÄÜÏëÈúóÃæÌí¼ÓµÄ½Úµã¶à×öµã»î£¬ÏÔÈ»ÉÏÃæµÄhashËã·¨Ò²×ö²»µ½¡£

ÓÐʲô·½·¨¿ÉÒԸıäÕâ¸ö×´¿öÄØ£¬Õâ¾ÍÊÇconsistent hashing...

2 hash Ëã·¨ºÍµ¥µ÷ÐÔ

HashËã·¨µÄÒ»¸öºâÁ¿Ö¸±êÊǵ¥µ÷ÐÔ£¨Monotonicity£©£¬¶¨ÒåÈçÏ£º

µ¥µ÷ÐÔÊÇÖ¸Èç¹ûÒѾ­ÓÐһЩÄÚÈÝͨ¹ý¹þÏ£·ÖÅɵ½ÁËÏàÓ¦µÄ»º³åÖУ¬ÓÖÓÐÐµĻº³å¼ÓÈ뵽ϵͳÖС£¹þÏ£µÄ½á¹ûÓ¦Äܹ»±£Ö¤Ô­ÓÐÒÑ·ÖÅäµÄÄÚÈÝ¿ÉÒÔ±»Ó³Éäµ½ÐµĻº³åÖÐÈ¥£¬¶ø²»»á±»Ó³Éäµ½¾ÉµÄ»º³å¼¯ºÏÖÐµÄÆäËû»º³åÇø¡£

ÈÝÒ׿´µ½£¬ÉÏÃæµÄ¼òµ¥hashËã·¨hash(object)%NÄÑÒÔÂú×ãµ¥µ÷ÐÔÒªÇó¡£

3 consistent hashing Ëã·¨µÄÔ­Àí

consistent hashingÊÇÒ»ÖÖhashËã·¨£¬¼òµ¥µÄ˵£¬ÔÚÒÆ³ý/Ìí¼ÓÒ»¸öcacheʱ£¬ËüÄܹ»¾¡¿ÉÄÜСµÄ¸Ä±äÒÑ´æÔÚkeyÓ³Éä¹ØÏµ£¬¾¡¿ÉÄܵÄÂú×ãµ¥µ÷ÐÔµÄÒªÇó¡£

ÏÂÃæ¾ÍÀ´°´ÕÕ5¸ö²½Öè¼òµ¥½²½²consistent hashingËã·¨µÄ»ù±¾Ô­Àí¡£

3.1 »·ÐÎhash ¿Õ¼ä

¿¼ÂÇͨ³£µÄhashËã·¨¶¼Êǽ«valueÓ³Éäµ½Ò»¸ö32ΪµÄkeyÖµ£¬Ò²¼´ÊÇ0~2^32-1´Î·½µÄÊýÖµ¿Õ¼ä£»ÎÒÃÇ¿ÉÒÔ½«Õâ¸ö¿Õ¼äÏëÏó³ÉÒ»¸öÊ×£¨0£©Î²£¨2^32-1£©Ïà½ÓµÄÔ²»·£¬ÈçÏÂÃæÍ¼1ËùʾµÄÄÇÑù¡£

ͼ1»·ÐÎhash¿Õ¼ä

3.2 °Ñ¶ÔÏóÓ³Éäµ½hash ¿Õ¼ä

½ÓÏÂÀ´¿¼ÂÇ4¸ö¶ÔÏóobject1~object4£¬Í¨¹ýhashº¯Êý¼ÆËã³öµÄhashÖµkeyÔÚ»·Éϵķֲ¼Èçͼ2Ëùʾ¡£

hash(object1) = key1;
¡­ ¡­
hash(object4) = key4;

ͼ2 4¸ö¶ÔÏóµÄkeyÖµ·Ö²¼

3.3 °Ñcache Ó³Éäµ½hash ¿Õ¼ä

Consistent hashingµÄ»ù±¾Ë¼Ïë¾ÍÊǽ«¶ÔÏóºÍcache¶¼Ó³É䵽ͬһ¸öhashÊýÖµ¿Õ¼äÖУ¬²¢ÇÒʹÓÃÏàͬµÄhashËã·¨¡£

¼ÙÉ赱ǰÓÐA,BºÍC¹²3̨cache£¬ÄÇôÆäÓ³Éä½á¹û½«Èçͼ3Ëùʾ£¬ËûÃÇÔÚhash¿Õ¼äÖУ¬ÒÔ¶ÔÓ¦µÄhashÖµÅÅÁС£

hash(cache A) = key A;
¡­ ¡­
hash(cache C) = key C;

ͼ3 cacheºÍ¶ÔÏóµÄkeyÖµ·Ö²¼

˵µ½ÕâÀ˳±ãÌáÒ»ÏÂcacheµÄhash¼ÆË㣬һ°ãµÄ·½·¨¿ÉÒÔʹÓÃcache»úÆ÷µÄIPµØÖ·»òÕß»úÆ÷Ãû×÷ΪhashÊäÈë¡£

3.4 °Ñ¶ÔÏóÓ³Éäµ½cache

ÏÖÔÚcacheºÍ¶ÔÏó¶¼ÒѾ­Í¨¹ýͬһ¸öhashËã·¨Ó³Éäµ½hashÊýÖµ¿Õ¼äÖÐÁË£¬½ÓÏÂÀ´Òª¿¼ÂǵľÍÊÇÈçºÎ½«¶ÔÏóÓ³Éäµ½cacheÉÏÃæÁË¡£

ÔÚÕâ¸ö»·ÐοռäÖУ¬Èç¹ûÑØ×Å˳ʱÕë·½Ïò´Ó¶ÔÏóµÄkeyÖµ³ö·¢£¬Ö±µ½Óö¼ûÒ»¸öcache£¬ÄÇô¾Í½«¸Ã¶ÔÏó´æ´¢ÔÚÕâ¸öcacheÉÏ£¬ÒòΪ¶ÔÏóºÍcacheµÄhashÖµÊǹ̶¨µÄ£¬Òò´ËÕâ¸öcache±ØÈ»ÊÇΨһºÍÈ·¶¨µÄ¡£ÕâÑù²»¾ÍÕÒµ½Á˶ÔÏóºÍcacheµÄÓ³Éä·½·¨ÁËÂ𣿣¡

ÒÀÈ»¼ÌÐøÉÏÃæµÄÀý×Ó£¨²Î¼ûͼ3£©£¬ÄÇô¸ù¾ÝÉÏÃæµÄ·½·¨£¬¶ÔÏóobject1½«±»´æ´¢µ½cache AÉÏ£»object2ºÍobject3¶ÔÓ¦µ½cache C£»object4¶ÔÓ¦µ½cache B£»

3.5 ¿¼²ìcache µÄ±ä¶¯

Ç°Ãæ½²¹ý£¬Í¨¹ýhashÈ»ºóÇóÓàµÄ·½·¨´øÀ´µÄ×î´óÎÊÌâ¾ÍÔÚÓÚ²»ÄÜÂú×ãµ¥µ÷ÐÔ£¬µ±cacheÓÐËù±ä¶¯Ê±£¬cache»áʧЧ£¬½ø¶ø¶Ôºǫ́·þÎñÆ÷Ôì³É¾Þ´óµÄ³å»÷£¬ÏÖÔÚ¾ÍÀ´·ÖÎö·ÖÎöconsistent hashingËã·¨¡£

3.5.1 ÒÆ³ýcache

¿¼ÂǼÙÉècache B¹ÒµôÁË£¬¸ù¾ÝÉÏÃæ½²µ½µÄÓ³Éä·½·¨£¬ÕâʱÊÜÓ°ÏìµÄ½«½öÊÇÄÇÐ©ÑØcache BÄæÊ±Õë±éÀúÖ±µ½ÏÂÒ»¸öcache£¨cache C£©Ö®¼äµÄ¶ÔÏó£¬Ò²¼´ÊDZ¾À´Ó³Éäµ½cache BÉϵÄÄÇЩ¶ÔÏó¡£

Òò´ËÕâÀï½öÐèÒª±ä¶¯¶ÔÏóobject4£¬½«ÆäÖØÐÂÓ³Éäµ½cache CÉϼ´¿É£»²Î¼ûͼ4¡£

ͼ4 Cache B±»ÒƳýºóµÄcacheÓ³Éä

3.5.2 Ìí¼Ócache

ÔÙ¿¼ÂÇÌí¼Óһ̨еÄcache DµÄÇé¿ö£¬¼ÙÉèÔÚÕâ¸ö»·ÐÎhash¿Õ¼äÖУ¬cache D±»Ó³ÉäÔÚ¶ÔÏóobject2ºÍobject3Ö®¼ä¡£ÕâʱÊÜÓ°ÏìµÄ½«½öÊÇÄÇÐ©ÑØcache DÄæÊ±Õë±éÀúÖ±µ½ÏÂÒ»¸öcache£¨cache B£©Ö®¼äµÄ¶ÔÏó£¨ËüÃÇÊÇÒ²±¾À´Ó³Éäµ½cache CÉ϶ÔÏóµÄÒ»²¿·Ö£©£¬½«ÕâЩ¶ÔÏóÖØÐÂÓ³Éäµ½cache DÉϼ´¿É¡£

Òò´ËÕâÀï½öÐèÒª±ä¶¯¶ÔÏóobject2£¬½«ÆäÖØÐÂÓ³Éäµ½cache DÉÏ£»²Î¼ûͼ5¡£

ͼ5 Ìí¼Ócache DºóµÄÓ³Éä¹ØÏµ

4 ÐéÄâ½Úµã

¿¼Á¿HashËã·¨µÄÁíÒ»¸öÖ¸±êÊÇÆ½ºâÐÔ(Balance)£¬¶¨ÒåÈçÏ£º

ƽºâÐÔ

ƽºâÐÔÊÇÖ¸¹þÏ£µÄ½á¹ûÄܹ»¾¡¿ÉÄÜ·Ö²¼µ½ËùÓеĻº³åÖÐÈ¥£¬ÕâÑù¿ÉÒÔʹµÃËùÓеĻº³å¿Õ¼ä¶¼µÃµ½ÀûÓá£

hashËã·¨²¢²»ÊDZ£Ö¤¾ø¶ÔµÄƽºâ£¬Èç¹ûcache½ÏÉٵϰ£¬¶ÔÏó²¢²»Äܱ»¾ùÔȵÄÓ³Éäµ½cacheÉÏ£¬±ÈÈçÔÚÉÏÃæµÄÀý×ÓÖУ¬½ö²¿Êðcache AºÍcache CµÄÇé¿öÏ£¬ÔÚ4¸ö¶ÔÏóÖУ¬cache A½ö´æ´¢ÁËobject1£¬¶øcache CÔò´æ´¢ÁËobject2¡¢object3ºÍobject4£»·Ö²¼ÊǺܲ»¾ùºâµÄ¡£

ΪÁ˽â¾öÕâÖÖÇé¿ö£¬consistent hashingÒýÈëÁË¡°ÐéÄâ½Úµã¡±µÄ¸ÅÄËü¿ÉÒÔÈç϶¨Ò壺

¡°ÐéÄâ½Úµã¡±£¨virtual node£©ÊÇʵ¼Ê½ÚµãÔÚhash¿Õ¼äµÄ¸´ÖÆÆ·£¨replica£©£¬Ò»Êµ¼Ê¸ö½Úµã¶ÔÓ¦ÁËÈô¸É¸ö¡°ÐéÄâ½Úµã¡±£¬Õâ¸ö¶ÔÓ¦¸öÊýÒ²³ÉΪ¡°¸´ÖƸöÊý¡±£¬¡°ÐéÄâ½Úµã¡±ÔÚhash¿Õ¼äÖÐÒÔhashÖµÅÅÁС£

ÈÔÒÔ½ö²¿Êðcache AºÍcache CµÄÇé¿öΪÀý£¬ÔÚͼ4ÖÐÎÒÃÇÒѾ­¿´µ½£¬cache·Ö²¼²¢²»¾ùÔÈ¡£ÏÖÔÚÎÒÃÇÒýÈëÐéÄâ½Úµã£¬²¢ÉèÖá°¸´ÖƸöÊý¡±Îª2£¬Õâ¾ÍÒâζ×ÅÒ»¹²»á´æÔÚ4¸ö¡°ÐéÄâ½Úµã¡±£¬cache A1, cache A2´ú±íÁËcache A£»cache C1, cache C2´ú±íÁËcache C£»¼ÙÉèÒ»ÖֱȽÏÀíÏëµÄÇé¿ö£¬²Î¼ûͼ6¡£

ͼ6 ÒýÈë¡°ÐéÄâ½Úµã¡±ºóµÄÓ³Éä¹ØÏµ

´Ëʱ£¬¶ÔÏ󵽡°ÐéÄâ½Úµã¡±µÄÓ³Éä¹ØÏµÎª£º

objec1->cache A2£»objec2->cache A1£»objec3->cache C1£»objec4->cache C2£»

Òò´Ë¶ÔÏóobject1ºÍobject2¶¼±»Ó³Éäµ½ÁËcache AÉÏ£¬¶øobject3ºÍobject4Ó³Éäµ½ÁËcache CÉÏ£»Æ½ºâÐÔÓÐÁ˺ܴóÌá¸ß¡£

ÒýÈë¡°ÐéÄâ½Úµã¡±ºó£¬Ó³Éä¹ØÏµ¾Í´Ó{¶ÔÏó->½Úµã}ת»»µ½ÁË{¶ÔÏó->ÐéÄâ½Úµã}¡£²éѯÎïÌåËùÔÚcacheʱµÄÓ³Éä¹ØÏµÈçͼ7Ëùʾ¡£

ͼ7 ²éѯ¶ÔÏóËùÔÚcache

¡°ÐéÄâ½Úµã¡±µÄhash¼ÆËã¿ÉÒÔ²ÉÓöÔÓ¦½ÚµãµÄIPµØÖ·¼ÓÊý×Öºó׺µÄ·½Ê½¡£ÀýÈç¼ÙÉècache AµÄIPµØÖ·Îª202.168.14.241¡£

ÒýÈë¡°ÐéÄâ½Úµã¡±Ç°£¬¼ÆËãcache AµÄhashÖµ£º

Hash(¡°202.168.14.241¡±);

ÒýÈë¡°ÐéÄâ½Úµã¡±ºó£¬¼ÆËã¡°ÐéÄâ½Ú¡±µãcache A1ºÍcache A2µÄhashÖµ£º

Hash(¡°202.168.14.241#1¡±);  // cache A1
Hash(¡°202.168.14.241#2¡±); // cache A2
   
4591 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

»ùÓÚEAµÄÊý¾Ý¿â½¨Ä£
Êý¾ÝÁ÷½¨Ä££¨EAÖ¸ÄÏ£©
¡°Êý¾Ýºþ¡±£º¸ÅÄî¡¢ÌØÕ÷¡¢¼Ü¹¹Óë°¸Àý
ÔÚÏßÉ̳ÇÊý¾Ý¿âϵͳÉè¼Æ ˼·+Ч¹û
 
Ïà¹ØÎĵµ

GreenplumÊý¾Ý¿â»ù´¡Åàѵ
MySQL5.1ÐÔÄÜÓÅ»¯·½°¸
ijµçÉÌÊý¾ÝÖÐ̨¼Ü¹¹Êµ¼ù
MySQL¸ßÀ©Õ¹¼Ü¹¹Éè¼Æ
Ïà¹Ø¿Î³Ì

Êý¾ÝÖÎÀí¡¢Êý¾Ý¼Ü¹¹¼°Êý¾Ý±ê×¼
MongoDBʵս¿Î³Ì
²¢·¢¡¢´óÈÝÁ¿¡¢¸ßÐÔÄÜÊý¾Ý¿âÉè¼ÆÓëÓÅ»¯
PostgreSQLÊý¾Ý¿âʵսÅàѵ
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

MySQLË÷Òý±³ºóµÄÊý¾Ý½á¹¹
MySQLÐÔÄܵ÷ÓÅÓë¼Ü¹¹Éè¼Æ
SQL ServerÊý¾Ý¿â±¸·ÝÓë»Ö¸´
ÈÃÊý¾Ý¿â·ÉÆðÀ´ 10´óDB2ÓÅ»¯
oracleµÄÁÙʱ±í¿Õ¼äдÂú´ÅÅÌ
Êý¾Ý¿âµÄ¿çƽ̨Éè¼Æ


²¢·¢¡¢´óÈÝÁ¿¡¢¸ßÐÔÄÜÊý¾Ý¿â
¸ß¼¶Êý¾Ý¿â¼Ü¹¹Éè¼ÆÊ¦
HadoopÔ­ÀíÓëʵ¼ù
Oracle Êý¾Ý²Ö¿â
Êý¾Ý²Ö¿âºÍÊý¾ÝÍÚ¾ò
OracleÊý¾Ý¿â¿ª·¢Óë¹ÜÀí


GE Çø¿éÁ´¼¼ÊõÓëʵÏÖÅàѵ
º½Ìì¿Æ¹¤Ä³×Ó¹«Ë¾ Nodejs¸ß¼¶Ó¦Óÿª·¢
ÖÐÊ¢Òæ»ª ׿Խ¹ÜÀíÕß±ØÐë¾ß±¸µÄÎåÏîÄÜÁ¦
ijÐÅÏ¢¼¼Êõ¹«Ë¾ PythonÅàѵ
ij²©²ÊITϵͳ³§ÉÌ Ò×ÓÃÐÔ²âÊÔÓëÆÀ¹À
ÖйúÓÊ´¢ÒøÐÐ ²âÊÔ³ÉÊì¶ÈÄ£Ðͼ¯³É(TMMI)
ÖÐÎïÔº ²úÆ·¾­ÀíÓë²úÆ·¹ÜÀí