¸üÐÂʱ¼ä:2018Äê10ÔÂ24ÈÕ16ʱ12·Ö À´Ô´:ÀÖÓã²¥¿Í ä¯ÀÀ´ÎÊý:
¡¡¡¡
¡¡¡¡1.MapTask¹¤×÷»úÖÆ
¡¡¡¡Õû¸öMap½×¶ÎÁ÷³Ì´óÌåÈçÉÏͼËùʾ¡£¼òµ¥¸ÅÊö£ºinput Fileͨ¹ýsplit±»Âß¼ÇзÖΪ¶à¸ösplitÎļþ£¬Í¨¹ýRecord°´ÐжÁÈ¡ÄÚÈݸømap(Óû§×Ô¼ºÊµÏÖµÄ)½øÐд¦Àí£¬Êý¾Ý±»map´¦Àí½áÊøÖ®ºó½»¸øOutputCollectorÊÕ¼¯Æ÷£¬¶ÔÆä½á¹ûkey½øÐзÖÇø(ĬÈÏʹÓÃhash·ÖÇø)£¬È»ºóдÈëbuffer£¬Ã¿¸ömap task¶¼ÓÐÒ»¸öÄڴ滺³åÇø£¬´æ´¢×ÅmapµÄÊä³ö½á¹û£¬µ±»º³åÇø¿ìÂúµÄʱºòÐèÒª½«»º³åÇøµÄÊý¾ÝÒÔÒ»¸öÁÙʱÎļþµÄ·½Ê½´æ·Åµ½´ÅÅÌ£¬µ±Õû¸ömap task½áÊøºóÔÙ¶Ô´ÅÅÌÖÐÕâ¸ömap task²úÉúµÄËùÓÐÁÙʱÎļþ×öºÏ²¢£¬Éú³É×îÖÕµÄÕýʽÊä³öÎļþ£¬È»ºóµÈ´ýreduce taskÀ´ÀÊý¾Ý¡£
¡¡¡¡Ïêϸ²½Ö裺
¡¡¡¡Ø Ê×ÏÈ£¬¶ÁÈ¡Êý¾Ý×é¼þInputFormat(ĬÈÏTextInputFormat)»áͨ¹ýgetSplits·½·¨¶ÔÊäÈëĿ¼ÖÐÎļþ½øÐÐÂß¼ÇÐÆ¬¹æ»®µÃµ½splits£¬ÓжàÉÙ¸ösplit¾Í¶ÔÓ¦Æô¶¯¶àÉÙ¸öMapTask¡£splitÓëblockµÄ¶ÔÓ¦¹ØÏµÄ¬ÈÏÊÇÒ»¶ÔÒ»¡£
¡¡¡¡Ø ½«ÊäÈëÎļþÇзÖΪsplitsÖ®ºó£¬ÓÉRecordReader¶ÔÏó(ĬÈÏLineRecordReader)½øÐжÁÈ¡£¬ÒÔ\n×÷Ϊ·Ö¸ô·û£¬¶ÁȡһÐÐÊý¾Ý£¬·µ»Ø
¡¡¡¡Ø ¶ÁÈ¡split·µ»Ø
¡¡¡¡Ø mapÂß¼ÍêÖ®ºó£¬½«mapµÄÿÌõ½á¹ûͨ¹ýcontext.write½øÐÐcollectÊý¾ÝÊÕ¼¯¡£ÔÚcollectÖУ¬»áÏÈ¶ÔÆä½øÐзÖÇø´¦Àí£¬Ä¬ÈÏʹÓÃHashPartitioner¡£
¡¡¡¡MapReduceÌṩPartitioner½Ó¿Ú£¬ËüµÄ×÷ÓþÍÊǸù¾Ýkey»òvalue¼°reduceµÄÊýÁ¿À´¾ö¶¨µ±Ç°µÄÕâ¶ÔÊä³öÊý¾Ý×îÖÕÓ¦¸Ã½»ÓÉÄĸöreduce task´¦Àí¡£Ä¬È϶Ôkey hashºóÔÙÒÔreduce taskÊýÁ¿È¡Ä£¡£Ä¬ÈϵÄȡģ·½Ê½Ö»ÊÇΪÁËÆ½¾ùreduceµÄ´¦ÀíÄÜÁ¦£¬Èç¹ûÓû§×Ô¼º¶ÔPartitionerÓÐÐèÇ󣬿ÉÒÔ¶©ÖƲ¢ÉèÖõ½jobÉÏ¡£
¡¡¡¡Ø ½ÓÏÂÀ´£¬»á½«Êý¾ÝдÈëÄڴ棬ÄÚ´æÖÐÕâÆ¬ÇøÓò½Ð×ö»·Ðλº³åÇø£¬»º³åÇøµÄ×÷ÓÃÊÇÅúÁ¿ÊÕ¼¯map½á¹û£¬¼õÉÙ´ÅÅÌIOµÄÓ°Ïì¡£ÎÒÃǵÄkey/value¶ÔÒÔ¼°PartitionµÄ½á¹û¶¼»á±»Ð´È뻺³åÇø¡£µ±È»Ð´Èë֮ǰ£¬keyÓëvalueÖµ¶¼»á±»ÐòÁл¯³É×Ö½ÚÊý×é¡£
¡¡¡¡»·Ðλº³åÇøÆäʵÊÇÒ»¸öÊý×飬Êý×éÖдæ·Å×Åkey¡¢valueµÄÐòÁл¯Êý¾ÝºÍkey¡¢valueµÄÔªÊý¾ÝÐÅÏ¢£¬°üÀ¨partition¡¢keyµÄÆðʼλÖá¢valueµÄÆðʼλÖÃÒÔ¼°valueµÄ³¤¶È¡£»·ÐνṹÊÇÒ»¸ö³éÏó¸ÅÄî¡£
¡¡¡¡»º³åÇøÊÇÓдóСÏÞÖÆ£¬Ä¬ÈÏÊÇ100MB¡£µ±map taskµÄÊä³ö½á¹ûºÜ¶àʱ£¬¾Í¿ÉÄÜ»á³Å±¬Äڴ棬ËùÒÔÐèÒªÔÚÒ»¶¨Ìõ¼þϽ«»º³åÇøÖеÄÊý¾ÝÁÙʱдÈë´ÅÅÌ£¬È»ºóÖØÐÂÀûÓÃÕâ¿é»º³åÇø¡£Õâ¸ö´ÓÄÚ´æÍù´ÅÅÌдÊý¾ÝµÄ¹ý³Ì±»³ÆÎªSpill£¬ÖÐÎÄ¿ÉÒëΪÒçд¡£Õâ¸öÒçдÊÇÓɵ¥¶ÀÏß³ÌÀ´Íê³É£¬²»Ó°ÏìÍù»º³åÇøÐ´map½á¹ûµÄÏ̡߳£ÒçдÏß³ÌÆô¶¯Ê±²»Ó¦¸Ã×èÖ¹mapµÄ½á¹ûÊä³ö£¬ËùÒÔÕû¸ö»º³åÇøÓиöÒçдµÄ±ÈÀýspill.percent¡£Õâ¸ö±ÈÀýĬÈÏÊÇ0.8£¬Ò²¾ÍÊǵ±»º³åÇøµÄÊý¾ÝÒѾ´ïµ½ãÐÖµ(buffer size * spill percent = 100MB * 0.8 = 80MB)£¬ÒçдÏß³ÌÆô¶¯£¬Ëø¶¨Õâ80MBµÄÄڴ棬ִÐÐÒçд¹ý³Ì¡£Map taskµÄÊä³ö½á¹û»¹¿ÉÒÔÍùʣϵÄ20MBÄÚ´æÖÐд£¬»¥²»Ó°Ïì¡£
¡¡¡¡Ø µ±ÒçдÏß³ÌÆô¶¯ºó£¬ÐèÒª¶ÔÕâ80MB¿Õ¼äÄÚµÄkey×öÅÅÐò(Sort)¡£ÅÅÐòÊÇMapReduceÄ£ÐÍĬÈϵÄÐÐΪ£¬ÕâÀïµÄÅÅÐòÒ²ÊǶÔÐòÁл¯µÄ×Ö½Ú×öµÄÅÅÐò¡£
¡¡¡¡Èç¹ûjobÉèÖùýCombiner£¬ÄÇôÏÖÔÚ¾ÍÊÇʹÓÃCombinerµÄʱºòÁË¡£½«ÓÐÏàͬkeyµÄkey/value¶ÔµÄvalue¼ÓÆðÀ´£¬¼õÉÙÒçдµ½´ÅÅ̵ÄÊý¾ÝÁ¿¡£Combiner»áÓÅ»¯MapReduceµÄÖмä½á¹û£¬ËùÒÔËüÔÚÕû¸öÄ£ÐÍÖлá¶à´ÎʹÓá£
¡¡¡¡ÄÇÄÄЩ³¡¾°²ÅÄÜʹÓÃCombinerÄØ?´ÓÕâÀï·ÖÎö£¬CombinerµÄÊä³öÊÇReducerµÄÊäÈ룬Combiner¾ø²»Äܸıä×îÖյļÆËã½á¹û¡£CombinerÖ»Ó¦¸ÃÓÃÓÚÄÇÖÖReduceµÄÊäÈëkey/valueÓëÊä³ökey/valueÀàÐÍÍêȫһÖ£¬ÇÒ²»Ó°Ïì×îÖÕ½á¹ûµÄ³¡¾°¡£±ÈÈçÀÛ¼Ó£¬×î´óÖµµÈ¡£CombinerµÄʹÓÃÒ»¶¨µÃÉ÷ÖØ£¬Èç¹ûÓúã¬Ëü¶ÔjobÖ´ÐÐЧÂÊÓаïÖú£¬·´Ö®»áÓ°ÏìreduceµÄ×îÖÕ½á¹û¡£
¡¡¡¡Ø ÿ´ÎÒçд»áÔÚ´ÅÅÌÉÏÉú³ÉÒ»¸öÁÙʱÎļþ(д֮ǰÅжÏÊÇ·ñÓÐcombiner)£¬Èç¹ûmapµÄÊä³ö½á¹ûÕæµÄºÜ´ó£¬Óжà´ÎÕâÑùµÄÒçд·¢Éú£¬´ÅÅÌÉÏÏàÓ¦µÄ¾Í»áÓжà¸öÁÙʱÎļþ´æÔÚ¡£µ±Õû¸öÊý¾Ý´¦Àí½áÊøÖ®ºó¿ªÊ¼¶Ô´ÅÅÌÖеÄÁÙʱÎļþ½øÐÐmergeºÏ²¢£¬ÒòΪ×îÖÕµÄÎļþÖ»ÓÐÒ»¸ö£¬Ð´Èë´ÅÅÌ£¬²¢ÇÒΪÕâ¸öÎļþÌṩÁËÒ»¸öË÷ÒýÎļþ£¬ÒԼǼÿ¸öreduce¶ÔÓ¦Êý¾ÝµÄÆ«ÒÆÁ¿¡£
¡¡¡¡ÖÁ´ËmapÕû¸ö½×¶Î½áÊø¡£
¡¡¡¡2.
¡¡¡¡
¡¡¡¡ReduceTask¹¤×÷»úÖÆ
¡¡¡¡Reduce´óÖ·ÖΪcopy¡¢sort¡¢reduceÈý¸ö½×¶Î£¬ÖصãÔÚǰÁ½¸ö½×¶Î¡£copy½×¶Î°üº¬Ò»¸öeventFetcherÀ´»ñÈ¡ÒÑÍê³ÉµÄmapÁÐ±í£¬ÓÉFetcherÏß³ÌÈ¥copyÊý¾Ý£¬Ôڴ˹ý³ÌÖлáÆô¶¯Á½¸ömergeỊ̈߳¬·Ö±ðΪinMemoryMergerºÍonDiskMerger£¬·Ö±ð½«ÄÚ´æÖеÄÊý¾Ýmergeµ½´ÅÅ̺ͽ«´ÅÅÌÖеÄÊý¾Ý½øÐÐmerge¡£´ýÊý¾ÝcopyÍê³ÉÖ®ºó£¬copy½×¶Î¾ÍÍê³ÉÁË£¬¿ªÊ¼½øÐÐsort½×¶Î£¬sort½×¶ÎÖ÷ÒªÊÇÖ´ÐÐfinalMerge²Ù×÷£¬´¿´âµÄsort½×¶Î£¬Íê³ÉÖ®ºó¾ÍÊÇreduce½×¶Î£¬µ÷ÓÃÓû§¶¨ÒåµÄreduceº¯Êý½øÐд¦Àí¡£
¡¡¡¡Ïêϸ²½Ö裺
¡¡¡¡Ø Copy½×¶Î£¬¼òµ¥µØÀÈ¡Êý¾Ý¡£Reduce½ø³ÌÆô¶¯Ò»Ð©Êý¾ÝcopyÏß³Ì(Fetcher)£¬Í¨¹ýHTTP·½Ê½ÇëÇómaptask»ñÈ¡ÊôÓÚ×Ô¼ºµÄÎļþ¡£
¡¡¡¡Ø Merge½×¶Î¡£ÕâÀïµÄmergeÈçmap¶ËµÄmerge¶¯×÷£¬Ö»ÊÇÊý×éÖдæ·ÅµÄÊDz»Í¬map¶ËcopyÀ´µÄÊýÖµ¡£Copy¹ýÀ´µÄÊý¾Ý»áÏÈ·ÅÈëÄڴ滺³åÇøÖУ¬ÕâÀïµÄ»º³åÇø´óСҪ±Èmap¶ËµÄ¸üΪÁé»î¡£mergeÓÐÈýÖÖÐÎʽ£ºÄÚ´æµ½ÄÚ´æ;ÄÚ´æµ½´ÅÅÌ;´ÅÅ̵½´ÅÅÌ¡£Ä¬ÈÏÇé¿öϵÚÒ»ÖÖÐÎʽ²»ÆôÓᣵ±ÄÚ´æÖеÄÊý¾ÝÁ¿µ½´ïÒ»¶¨ãÐÖµ£¬¾ÍÆô¶¯ÄÚ´æµ½´ÅÅ̵Ämerge¡£Óëmap ¶ËÀàËÆ£¬ÕâÒ²ÊÇÒçдµÄ¹ý³Ì£¬Õâ¸ö¹ý³ÌÖÐÈç¹ûÄãÉèÖÃÓÐCombiner£¬Ò²ÊÇ»áÆôÓõģ¬È»ºóÔÚ´ÅÅÌÖÐÉú³ÉÁËÖÚ¶àµÄÒçдÎļþ¡£µÚ¶þÖÖmerge·½Ê½Ò»Ö±ÔÚÔËÐУ¬Ö±µ½Ã»ÓÐmap¶ËµÄÊý¾Ýʱ²Å½áÊø£¬È»ºóÆô¶¯µÚÈýÖÖ´ÅÅ̵½´ÅÅ̵Ämerge·½Ê½Éú³É×îÖÕµÄÎļþ¡£
¡¡¡¡Ø °Ñ·ÖÉ¢µÄÊý¾ÝºÏ²¢³ÉÒ»¸ö´óµÄÊý¾Ýºó£¬»¹»áÔٶԺϲ¢ºóµÄÊý¾ÝÅÅÐò¡£
¡¡¡¡Ø ¶ÔÅÅÐòºóµÄ¼üÖµ¶Ôµ÷ÓÃreduce·½·¨£¬¼üÏàµÈµÄ¼üÖµ¶Ôµ÷ÓÃÒ»´Îreduce·½·¨£¬Ã¿´Îµ÷Óûá²úÉúÁã¸ö»òÕß¶à¸ö¼üÖµ¶Ô£¬×îºó°ÑÕâЩÊä³öµÄ¼üÖµ¶ÔдÈëµ½HDFSÎļþÖС£
¡¡¡¡3. Shuffle»úÖÆ
¡¡¡¡map½×¶Î´¦ÀíµÄÊý¾ÝÈçºÎ´«µÝ¸øreduce½×¶Î£¬ÊÇMapReduce¿ò¼ÜÖÐ×î¹Ø¼üµÄÒ»¸öÁ÷³Ì£¬Õâ¸öÁ÷³Ì¾Í½Ðshuffle¡£
¡¡¡¡shuffle: Ï´ÅÆ¡¢·¢ÅÆ——(ºËÐÄ»úÖÆ£ºÊý¾Ý·ÖÇø£¬ÅÅÐò£¬ºÏ²¢)¡£
¡¡¡¡
¡¡¡¡shuffleÊÇMapreduceµÄºËÐÄ£¬Ëü·Ö²¼ÔÚMapreduceµÄmap½×¶ÎºÍreduce½×¶Î¡£Ò»°ã°Ñ´ÓMap²úÉúÊä³ö¿ªÊ¼µ½ReduceÈ¡µÃÊý¾Ý×÷ΪÊäÈë֮ǰµÄ¹ý³Ì³Æ×÷shuffle¡£
¡¡¡¡1).Collect½×¶Î£º½«MapTaskµÄ½á¹ûÊä³öµ½Ä¬ÈÏ´óСΪ100MµÄ»·Ðλº³åÇø£¬±£´æµÄÊÇkey/value£¬Partition·ÖÇøÐÅÏ¢µÈ¡£
¡¡¡¡2).Spill½×¶Î£ºµ±ÄÚ´æÖеÄÊý¾ÝÁ¿´ïµ½Ò»¶¨µÄ·§ÖµµÄʱºò£¬¾Í»á½«Êý¾ÝдÈë±¾µØ´ÅÅÌ£¬ÔÚ½«Êý¾ÝдÈë´ÅÅÌ֮ǰÐèÒª¶ÔÊý¾Ý½øÐÐÒ»´ÎÅÅÐòµÄ²Ù×÷£¬Èç¹ûÅäÖÃÁËcombiner£¬»¹»á½«ÓÐÏàͬ·ÖÇøºÅºÍkeyµÄÊý¾Ý½øÐÐÅÅÐò¡£
¡¡¡¡3).Merge½×¶Î£º°ÑËùÓÐÒç³öµÄÁÙʱÎļþ½øÐÐÒ»´ÎºÏ²¢²Ù×÷£¬ÒÔÈ·±£Ò»¸öMapTask×îÖÕÖ»²úÉúÒ»¸öÖмäÊý¾ÝÎļþ¡£
¡¡¡¡4).Copy½×¶Î£º ReduceTaskÆô¶¯FetcherÏ̵߳½ÒѾÍê³ÉMapTaskµÄ½ÚµãÉϸ´ÖÆÒ»·ÝÊôÓÚ×Ô¼ºµÄÊý¾Ý£¬ÕâЩÊý¾ÝĬÈϻᱣ´æÔÚÄÚ´æµÄ»º³åÇøÖУ¬µ±ÄÚ´æµÄ»º³åÇø´ïµ½Ò»¶¨µÄ·§ÖµµÄʱºò£¬¾Í»á½«Êý¾Ýдµ½´ÅÅÌÖ®ÉÏ¡£
¡¡¡¡5).Merge½×¶Î£ºÔÚReduceTaskÔ¶³Ì¸´ÖÆÊý¾ÝµÄͬʱ£¬»áÔÚºǫ́¿ªÆôÁ½¸öÏ̶߳ÔÄÚ´æµ½±¾µØµÄÊý¾ÝÎļþ½øÐкϲ¢²Ù×÷¡£
¡¡¡¡6).Sort½×¶Î£ºÔÚ¶ÔÊý¾Ý½øÐкϲ¢µÄͬʱ£¬»á½øÐÐÅÅÐò²Ù×÷£¬ÓÉÓÚMapTask½×¶ÎÒѾ¶ÔÊý¾Ý½øÐÐÁ˾ֲ¿µÄÅÅÐò£¬ReduceTaskÖ»Ðè±£Ö¤CopyµÄÊý¾ÝµÄ×îÖÕÕûÌåÓÐЧÐÔ¼´¿É¡£
¡¡¡¡ShuffleÖеĻº³åÇø´óС»áÓ°Ïìµ½mapreduce³ÌÐòµÄÖ´ÐÐЧÂÊ£¬ÔÔòÉÏ˵£¬»º³åÇøÔ½´ó£¬´ÅÅÌioµÄ´ÎÊýÔ½ÉÙ£¬Ö´ÐÐËٶȾÍÔ½¿ì
¡¡¡¡»º³åÇøµÄ´óС¿ÉÒÔͨ¹ý²ÎÊýµ÷Õû, ²ÎÊý£ºio.sort.mb ĬÈÏ100M
×÷ÕߣºÀÖÓã²¥¿Í´óÊý¾ÝÅàѵѧԺ
Ê×·¢£ºhttp://cloud.itcast.cn
±±¾©Ð£Çø