1.大数据面经之hadoop
2.代码设计完成hadoop单词计算功能是什么?
3.MapReduce ç¥è¯
大数据面经之hadoop
Hadoop 分析与实践
本文深入探讨Hadoop的关键组件与操作,从文件上传与管理到性能优化与高并发处理,全方位解析大数据技术中的Hadoop应用。文件上传与管理
在Hadoop分布式文件系统(HDFS)中,文件上传流程包含客户端与NameNode节点之间的交互。首先,领导信箱源码客户端向NameNode请求可用的DataNode节点。NameNode基于机架感应原则,选择不同机架的节点以确保数据副本的分布。客户端将文件分块,通常每个块大小为MB(Hadoop2.X版本)或MB(早期版本)。文件块被直接发送至DataNode进行写入,并在多个节点上复制以形成副本,确保数据冗余。数据块传输完成后,DataNode通知客户端和NameNode,最终确认文件上传完成。libevent源码管理异常处理与恢复
HDFS在文件上传过程中,若出现数据块损坏,系统设计有自我检测与恢复机制。只要文件存在多个副本,损坏的块将被自动检测并还原,保证数据完整性与可用性。文件系统管理与元数据维护
NameNode作为HDFS的核心,负责管理和维护文件系统的元数据,包括目录结构、文件位置和块状态等。启动时,NameNode加载Fsimage文件,构建整个namespace的内存镜像,并初始化文件和目录的元数据信息。加载完成后,NameNode进入等待状态,grpc指标源码等待DataNode发送blockReport,以构建每个文件对应的所有block和datanode列表。高可用性(HA)机制
NameNode的高可用性(HA)通过备用NameNode与工作NameNode共同实现,确保系统在主NameNode故障时能迅速切换至备用NameNode,维护系统连续性。它们通过共享数据的JournalNode来实现数据一致性。数据分块与输入分片 HDFS通过引入文件分块(block)机制,将文件分割为固定大小的块,每个块存储于datanode上。文件的大小与块大小一致时,块将完整占用空间。Hadoop作业在提交过程中,依据配置文件参数对输入数据进行分片,以优化任务执行效率。具体分片规则由InputSplitFormat决定,确保数据均衡分配。视频资料源码减少数据传输与性能优化
为了减少Hadoop Map端到Reduce端的数据传输量,可以采用本地处理策略,让Map完成后,Reduce直接处理同一台机器上的数据,尽可能避免网络通信。Hadoop的Shuffle过程在Map任务端保存分片数据,通过网络收集到Reduce端,优化数据传输路径,减少磁盘I/O对任务执行的影响,同时充分利用Map任务的内存缓冲区进行数据预处理,减少不必要的磁盘写入。Combiner与数据聚合 Combiner作为Map端的数据预聚合工具,用于在本地对Map输出的键值对进行预处理,减少网络传输量。其主要应用于数据类型一致、不影响最终计算结果的toast指标源码场景,如累加、最大值等操作,以提高Map任务的执行效率。调度策略与任务管理
Hadoop默认采用FIFO调度策略,按照作业优先级处理任务。此外,支持多种高级调度器,如Capacity Scheduler(支持多队列多用户)和Fair Scheduler(公平共享资源),以实现更精细的任务调度与资源分配,满足不同场景需求。数据倾斜解决策略 对于数据倾斜问题,一种常见解决方案是采用采样方法,识别数据倾斜的键,将数据划分为多个子集,分别进行处理,然后合并结果,以减少Reduce任务的负担。性能调优与集群扩展 Hadoop性能调优涉及多个层面,包括系统配置优化、程序编写优化与作业调度策略调整。通过合理设置参数如block大小、任务数、最大任务数等,可以提升集群性能。同时,通过横向扩展集群,增加节点数量,可以应对高并发与大数据量处理需求。并发处理与可靠性保障 Hadoop通过集群可靠性设计,如数据副本机制、故障检测与恢复、以及通过Hadoop脚本实现节点重启等措施,确保在高并发情况下,集群能够稳定运行,支撑大规模数据处理任务。结合Hadoop实现Join操作
Hadoop提供多种实现Join操作的方法,如Reduce Side Join、Map Side Join、SemiJoin等。Reduce Side Join在Map阶段完成Join操作,但网络通信量大;Map Side Join在Map端过滤数据,但受Map输出限制;SemiJoin通过过滤掉不会参与Join的记录,减少网络通信;Reduce Side Join与Bloom Filter结合,进一步优化Join操作。二次排序与结果优化 Hadoop支持二次排序,通过Buffer and In Memory Sort或Value-to-Key Conversion方法实现按值排序。Buffer and In Memory Sort方法在Reduce函数中构建排序,但可能引发内存溢出;Value-to-Key Conversion方法将key与部分value拼接为组合key,实现先按key后按value的排序,需自定义Partitioner。 本文通过详细解析Hadoop的关键组件与操作,旨在提供一个全面的指南,帮助用户深入了解并优化Hadoop系统在大数据处理中的应用,实现高效的数据存储、管理与分析。代码设计完成hadoop单词计算功能是什么?
Hadoop是一个开源的分布式计算框架,用于处理大规模数据集的并行计算。它以分布式存储和分布式计算的方式来处理数据,并通过将数据分割为多个块并在多个计算节点上并行处理来提高计算速度和效率。
在Hadoop中实现单词计数功能可以通过以下步骤完成:
1. 数据准备:将待处理的文本数据存储在Hadoop分布式文件系统(HDFS)中,确保数据在HDFS上的可访问性。
2. Map阶段:编写Map函数,该函数将文本数据作为输入,并将其分割为单词(tokenize)。每个单词作为键,值为1,表示出现一次。Map函数将每个键值对输出为中间结果。
3. Shuffle和Sort阶段:Hadoop框架会自动对Map输出的键值对进行分区、排序和合并操作,以便将相同的键值对发送到同一个Reduce任务进行处理。
4. Reduce阶段:编写Reduce函数,该函数接收相同键的一组值,并将这些值相加以获得单词的总计数。Reduce函数将每个单词和对应的总计数输出为最终结果。
5. 输出结果:将Reduce阶段得到的最终结果存储在HDFS上,或者输出到其他目标,如数据库、文件等。
需要注意的是,以上步骤仅是实现Hadoop中的基本单词计数功能的概述,具体的实现细节会涉及到编程语言选择(如Java)、Hadoop框架的API调用以及适当的配置和部署。
总的来说,使用Hadoop实现单词计数功能可以充分利用分布式计算的优势,加快数据处理速度,并且具有良好的扩展性和容错性,适用于处理大规模数据集的场景。
MapReduce ç¥è¯
客æ·ç«¯ï¼clientï¼æ交MapReduceä½ä¸
JobTracker
1.ä½ä¸è°åº¦ï¼å°ä¸ä¸ªä½ä¸ï¼Jobï¼åæè¥å¹²ä¸ªåä»»å¡ååå°taskTrakerä¸å»æ§è¡
2.ä»»å¡çæ§ï¼TaskTrackeråéå¿è·³ç»JobTrackeræ¥åèªå·±çè¿è¡ç¶æï¼ä»¥è®©JobTrackerè½å¤çæ§å°ä»
3.èµæºç®¡çï¼æ¯ä¸ªä»»å¡åJobTrackerç³è¯·èµæº
4.çæ§è¿ç¨ä¸åç°å¤±è´¥æè è¿è¡è¿æ ¢çä»»å¡ï¼å¯¹ä»è¿è¡éæ°å¯å¨
TaskTracker
主å¨åéå¿è·³ç»jobTracker并ä¸JobTrackeréä¿¡ï¼ä»èæ¥åå°JobTrackeråéè¿æ¥éè¦æ§è¡çä»»å¡
èµæºè¡¨ç¤ºæ¨¡å
ç¨äºæè¿°èµæºè¡¨ç¤ºå½¢å¼ï¼Hadoop1.0使ç¨â槽ä½ï¼slotï¼âç»ç»å个èç¹çèµæºï¼ä¸ºäºç®åèµæºç管çï¼Hadoopå°å个èç¹ä¸èµæºï¼CPUãå åãç½ç»IOãç£çIOççï¼çéååæè¥å¹²ä»½ï¼æ¯ä¸ä»½ç¨âslotâ表示ï¼åæ¶è§å®ä¸ä¸ªtaskå¯æ ¹æ®å®é æ åµéè¦å ç¨å¤ä¸ªâslotâã
ç®åç说ï¼hadoop1.0å°å¤ç»´åº¦çèµæºè¿è¡äºæ½è±¡ï¼ä½¿ç¨âslotâæ¥è¡¨ç¤ºï¼ä»èç®å对èµæºç管çã
èµæºåé 模å
èèµæºåé 模ååå³å®å¦ä½å°èµæºåé ç»å个ä½ä¸/ä»»å¡ï¼å¨Hadoopä¸ï¼è¿ä¸é¨åç±ä¸ä¸ªææå¼çè°åº¦å¨å®æã
æ´è¿ä¸æ¥è¯´ï¼slotç¸å½äºè¿è¡çâ许å¯è¯âï¼ä¸ä¸ªä»»å¡åªæè·å¾â许å¯è¯âåï¼æè½å¤è·å¾è¿è¡çæºä¼ï¼è¿ä¹æå³çï¼æ¯ä¸ä¸ªèç¹ä¸çslotçæ°éå³å®äºå½åèç¹è½å¤å¹¶åæ§è¡å¤å°ä¸ªä»»å¡ãHadoop1.0为äºåºåMapTaskè·ReduceTaskæ使ç¨èµæºçå·®å¼ï¼è¿ä¸æ¥å°slotå为MapSlotè·ReduceSlotï¼ä»ä»¬åå«åªè½è¢«MapTaskè·ReduceTask使ç¨ã
Hadoopé群管çåå¯æ ¹æ®å个èç¹ç¡¬ä»¶é ç½®ååºç¨ç¹ç¹ä¸ºå®ä»¬åé ä¸åçmap slotæ°ï¼ç±åæ°mapred.tasktracker.map.tasks.maximumæå®ï¼åreduce slotæ°ï¼ç±åæ°mapred.tasktrackerreduce.tasks.maximumæå®ï¼
éæèµæºé ç½®ã éç¨äºéæèµæºè®¾ç½®çç¥ï¼å³æ¯ä¸ªèç¹äºå é 置好å¯ç¨çslotæ»æ°ï¼è¿äºslotæ°ç®ä¸æ¦å¯å¨åæ æ³åå¨æä¿®æ¹ã
èµæºæ æ³å ±äº«ã Hadoop 1.0å°slotå为Map slotåReduce slot两ç§ï¼ä¸ä¸å è®¸å ±äº«ã对äºä¸ä¸ªä½ä¸ï¼åå¼å§è¿è¡æ¶ï¼Map slotèµæºç´§ç¼ºèReduce slot空é²ï¼å½Map Taskå ¨é¨è¿è¡å®æåï¼Reduce slot紧缺èMap slot空é²ãå¾ææ¾ï¼è¿ç§åºåslotç±»å«çèµæºç®¡çæ¹æ¡å¨ä¸å®ç¨åº¦ä¸éä½äºslotçå©ç¨çã
èµæºååç²åº¦è¿å¤§ãèµæºååç²åº¦è¿å¤§ï¼å¾å¾ä¼é æèç¹èµæºå©ç¨çè¿é«æè è¿ä½ ï¼æ¯å¦ï¼ç®¡çåäºå è§å好ä¸ä¸ªslot代表2GBå åå1个CPUï¼å¦æä¸ä¸ªåºç¨ç¨åºçä»»å¡åªéè¦1GBå åï¼åä¼äº§çâèµæºç¢çâï¼ä»èéä½é群èµæºçå©ç¨çï¼åæ ·ï¼å¦æä¸ä¸ªåºç¨ç¨åºçä»»å¡éè¦3GBå åï¼åä¼éå¼å°æ¢å å ¶ä»ä»»å¡çèµæºï¼ä»è产çèµæºæ¢å ç°è±¡ï¼å¯è½å¯¼è´é群å©ç¨çè¿é«ã
没å¼å ¥ææçèµæºé离æºå¶ãHadoop 1.0ä» éç¨äºåºäºjvmçèµæºé离æºå¶ï¼è¿ç§æ¹å¼ä»è¿äºç²ç³ï¼å¾å¤èµæºï¼æ¯å¦CPUï¼æ æ³è¿è¡é离ï¼è¿ä¼é æåä¸ä¸ªèç¹ä¸çä»»å¡ä¹é´å¹²æ°ä¸¥éã
主è¦æ¯InputFormatãInputFormatç±»æ2个éè¦çä½ç¨ï¼
1ï¼å°è¾å ¥çæ°æ®åå为å¤ä¸ªé»è¾ä¸çInputSplitï¼å ¶ä¸æ¯ä¸ä¸ªInputSplitä½ä¸ºä¸ä¸ªmapçè¾å ¥ã
2ï¼æä¾ä¸ä¸ªRecordReaderï¼ç¨äºå°InputSplitçå 容转æ¢ä¸ºå¯ä»¥ä½ä¸ºmapè¾å ¥çk,vé®å¼å¯¹ã
ç³»ç»é»è®¤çRecordReaderæ¯LineRecordReaderï¼å®æ¯TextInputFormat(FileInputFormatçåç±»)对åºçRecordReader; Mapè¯»å ¥çKeyå¼æ¯å移éï¼Valueæ¯è¡å 容ã
两个Mapperåèªè¾å ¥ä¸åæ°æ®ï¼ç±é®å¼å¯¹ææï¼å¯¹å®è¿è¡å å·¥ï¼å ä¸äºä¸ªå符nï¼ï¼ç¶åæå å·¥åçæ°æ®çé®è¿è¡åç»ï¼ç¸åçé®å°ç¸åçæºå¨ãè¿æ ·çè¯ï¼ç¬¬ä¸å°æºå¨åå°äºé®nk1ånk3ï¼ç¬¬äºå°æºå¨åå°äºé®nk2ã
æ¥ä¸æ¥åå¨è¿äºReducersä¸æ§è¡èåæä½ï¼è¿éæ§è¡çæ¯æ¯countï¼ï¼è¾åºå°±æ¯nk1åºç°äº2次ï¼nk3åºç°äº1次ï¼nk2åºç°äº3次ãä»å ¨å±ä¸æ¥çï¼MapReduceå°±æ¯ä¸ä¸ªåå¸å¼çGroupByçè¿ç¨ã
ä»ä¸å¾å¯ä»¥çå°ï¼Global Shuffle左边ï¼ä¸¤å°æºå¨æ§è¡çæ¯MapãGlobal Shuffleå³è¾¹ï¼ä¸¤å°æºå¨æ§è¡çæ¯Reduceã
Hadoopä¼å°è¾å ¥æ°æ®ååæçé¿çæ°æ®åï¼æ为æ°æ®åçãHadoopä¼ä¸ºæ¯ä¸ªåçæ建ä¸ä¸ªmapä»»å¡ã并è¡çå¤çåçæ¶é´è¯å®ä¼å°äºå¤çæ´ä¸ªå¤§æ°æ®åçæ¶é´ï¼ä½ç±äºå个èç¹æ§è½åä½ä¸è¿è¡æ åµçä¸åï¼æ¯ä¸ªåççå¤çæ¶é´å¯è½ä¸ä¸æ ·ï¼å æ¤ï¼ææ°æ®åçååçæ´ç»å¯ä»¥å¾å°æ´å¥½çè´è½½åè¡¡ã
ä½å¦ä¸æ¹é¢ï¼åç太å°çè¯ï¼ç®¡çåçåæ建mapä»»å¡çæ¶é´å°ä¼å¢å¤ãå æ¤ï¼éè¦å¨hadoopåç大å°åå¤çåçæ¶é´ä¹é´åä¸ä¸ªæè¡¡ã对大å¤æ°ä½ä¸æ¥è¯´ï¼ä¸ä¸ªåç大å°ä¸ºMBæ¯è¾åéï¼å ¶å®ï¼Hadoopçé»è®¤å大å°ä¹æ¯MBã
æ们ä¸é¢çå°äºhadoopçæ°æ®å大å°ä¸æä½³åç大å°ç¸åï¼è¿æ ·çè¯ï¼æ°æ®åçå°±ä¸å®¹æè·¨æ°æ®ååå¨ï¼å æ¤ï¼ä¸ä¸ªmapä»»å¡çè¾å ¥åç便å¯ä»¥ç´æ¥è¯»åæ¬å°æ°æ®åï¼è¿å°±é¿å äºåä»å ¶å®èç¹è¯»ååçæ°æ®ï¼ä»èèçäºç½ç»å¼éã
mapçä»»å¡è¾åºæ¯åå ¥å°æ¬å°ç£çèéHDFSçãé£ä¹ä¸ºä»ä¹å¢ï¼å 为mapä»»å¡è¾åºçæ¯ä¸é´ç»æï¼ä¸æ¦mapä»»å¡å®æå³ä¼è¢«å é¤ï¼å¦ææå®åå ¥HDFSä¸å¹¶å®ç°å¤ä»½å®¹éï¼æªå æç¹å¤§é¢å°åãå¦æä¸ä¸ªmapä»»å¡å¤±è´¥ï¼hadoopä¼åå¦ä¸ä¸ªèç¹éå¯mapä¸ä¸ªmapä»»å¡ã
èreduceä»»å¡å¹¶ä¸å ·å¤æ°æ®æ¬å°åä¼å¿ââå个reduceä»»å¡çè¾å ¥é常æ¥èªææmapperè¾åºãä¸è¬æåºè¿çmapè¾åºéè¦éè¿ç½ç»ä¼ è¾åéå°è¿è¡reduceä»»å¡çèç¹ï¼å¹¶å¨reduce端è¿è¡å并ãreduceçè¾åºé常éè¦åå¨å°HDFSä¸ä»¥å®ç°å¯é åå¨ãæ¯ä¸ªreduceè¾åºHDFSå第ä¸ä¸ªå¤æ¬ä¼åå¨å¨æ¬å°èç¹ï¼èå ¶å®å¤æ¬ååå¨å°å ¶å®èç¹ï¼å æ¤reduceè¾åºä¹éè¦å ç¨ç½ç»å¸¦å®½ã
1.è°æ´reduce个æ°æ¹æ³ï¼1ï¼
ï¼1ï¼æ¯ä¸ªReduceå¤ççæ°æ®éé»è®¤æ¯MB
ï¼2ï¼æ¯ä¸ªä»»å¡æ大çreduceæ°ï¼é»è®¤ä¸º
ï¼3ï¼è®¡ç®reduceræ°çå ¬å¼
2.è°æ´reduce个æ°æ¹æ³ï¼2ï¼
å¨hadoopçmapred-default.xmlæ件ä¸ä¿®æ¹ï¼è®¾ç½®æ¯ä¸ªjobçReduce个æ°
3.reduce个æ°å¹¶ä¸æ¯è¶å¤è¶å¥½
ï¼1ï¼è¿å¤çå¯å¨ååå§åreduceä¹ä¼æ¶èæ¶é´åèµæºï¼
ï¼2ï¼å¦å¤ï¼æå¤å°ä¸ªreduceï¼å°±ä¼æå¤å°ä¸ªè¾åºæ件ï¼å¦æ产çäºå¾å¤ä¸ªå°æ件ï¼é£ä¹å¦æè¿äºå°æ件ä½ä¸ºä¸ä¸ä¸ªä»»å¡çè¾å ¥ï¼åä¹ä¼åºç°å°æ件è¿å¤çé®é¢ï¼
å¨è®¾ç½®reduce个æ°çæ¶åä¹éè¦èèè¿ä¸¤ä¸ªååï¼å¤ç大æ°æ®å©ç¨éåçreduceæ°ï¼ä½¿å个reduceä»»å¡å¤çæ°æ®å¤§å°è¦åéï¼
å¨è¿è¡map计ç®ä¹åï¼mapreduceä¼æ ¹æ®è¾å ¥æ件计ç®è¾å ¥åçï¼input splitï¼ï¼æ¯ä¸ªè¾å ¥åçï¼input splitï¼é对ä¸ä¸ªmapä»»å¡ï¼è¾å ¥åçï¼input splitï¼åå¨ç并éæ°æ®æ¬èº«ï¼èæ¯ä¸ä¸ªåçé¿åº¦åä¸ä¸ªè®°å½æ°æ®çä½ç½®çæ°ç»ï¼è¾å ¥åçï¼input splitï¼å¾å¾åhdfsçblockï¼åï¼å ³ç³»å¾å¯åï¼æ们没æ设置åççèå´çæ¶åï¼åç大å°æ¯ç±blockå大å°å³å®çï¼åå®ç大å°ä¸æ ·ã
æ¯å¦æä¸ä¸ªMBçæ件ä¸ä¼ å°HDFSä¸ï¼å设blockå大å°æ¯MBï¼é£ä¹å®å°±ä¼è¢«åæä¸ä¸ªblockåï¼ä¸ä¹å¯¹åºäº§çä¸ä¸ªsplitï¼æ以æç»ä¼äº§çä¸ä¸ªmap taskãæååç°äºå¦ä¸ä¸ªé®é¢ï¼ç¬¬ä¸ä¸ªblockåéåçæ件大å°åªæ2MBï¼èå®çblockå大å°æ¯MBï¼é£å®å®é å ç¨Linux file systemçå¤å¤§ç©ºé´ï¼çæ¡æ¯å®é çæ件大å°ï¼èéä¸ä¸ªåç大å°ãæåä¸ä¸ªé®é¢æ¯ï¼ å¦æhdfså ç¨Linux file systemçç£ç空é´æå®é æ件大å°ç®ï¼é£ä¹è¿ä¸ªâå大å°âæå¿ è¦åå¨åï¼å ¶å®å大å°è¿æ¯å¿ è¦çï¼ä¸ä¸ªæ¾èæè§çä½ç¨å°±æ¯å½æ件éè¿appendæä½ä¸æå¢é¿çè¿ç¨ä¸ï¼å¯ä»¥éè¿æ¥block sizeå³å®ä½æ¶splitæ件ã
1ï¼æ¯ä¸ªè¾å ¥åçä¼è®©ä¸ä¸ªmapä»»å¡æ¥å¤çï¼mapè¾åºçç»æä¼æä¸æ¾å¨ä¸ä¸ªç¯å½¢å åç¼å²åºä¸ï¼è¯¥ç¼å²åºç大å°é»è®¤ä¸ºMï¼ç±io.sort.mbå±æ§æ§å¶ï¼ï¼å½è¯¥ç¼å²åºå¿«è¦æº¢åºæ¶ï¼é»è®¤ä¸ºç¼å²åºå¤§å°ç%ï¼ç±io.sort.spill.percentå±æ§æ§å¶ï¼ï¼ä¼å¨æ¬å°æ件系ç»ä¸å建ä¸ä¸ªæº¢åºæ件ï¼å°è¯¥ç¼å²åºä¸çæ°æ®åå ¥è¿ä¸ªæ件ã
2ï¼å¨åå ¥ç£çä¹åï¼çº¿ç¨é¦å æ ¹æ®reduceä»»å¡çæ°ç®å°æ°æ®åå为ç¸åæ°ç®çååºï¼ä¹å°±æ¯ä¸ä¸ªreduceä»»å¡å¯¹åºä¸ä¸ªååºçæ°æ®ãè¿æ ·åæ¯ä¸ºäºé¿å æäºreduceä»»å¡åé å°å¤§éæ°æ®ï¼èæäºreduceä»»å¡å´åå°å¾å°æ°æ®ï¼çè³æ²¡æåå°æ°æ®çå°´å°¬å±é¢ãå ¶å®ååºå°±æ¯å¯¹æ°æ®è¿è¡hashçè¿ç¨ãç¶å对æ¯ä¸ªååºä¸çæ°æ®è¿è¡æåºï¼å¦ææ¤æ¶è®¾ç½®äºCombinerï¼å°æåºåçç»æè¿è¡Combineræä½ï¼ä¸»è¦æ¯å¨map计ç®åºä¸é´æ件ååä¸ä¸ªç®åçå并éå¤keyå¼çæä½ï¼è¿æ ·åçç®çæ¯è®©å°½å¯è½å°çæ°æ®åå ¥å°ç£çã
3ï¼å½mapä»»å¡è¾åºæåä¸ä¸ªè®°å½æ¶ï¼å¯è½ä¼æå¾å¤ç溢åºæ件ï¼è¿æ¶éè¦å°è¿äºæ件å并ãå并çè¿ç¨ä¸ä¼ä¸æå°è¿è¡æåºåCombineræä½ï¼ç®çæ两个ï¼1.å°½éåå°æ¯æ¬¡åå ¥ç£ççæ°æ®éï¼2.å°½éåå°ä¸ä¸å¤å¶é¶æ®µç½ç»ä¼ è¾çæ°æ®éãæåå并æäºä¸ä¸ªå·²ååºä¸å·²æåºçæ件ã为äºåå°ç½ç»ä¼ è¾çæ°æ®éï¼è¿éå¯ä»¥å°æ°æ®å缩ï¼åªè¦å°mapred.compress.map.out设置为trueå°±å¯ä»¥äºã
4ï¼å°ååºä¸çæ°æ®æ·è´ï¼ç½ç»ä¼ è¾ï¼ç»ç¸å¯¹åºçreduceä»»å¡ãæ人å¯è½ä¼é®ï¼ååºä¸çæ°æ®æä¹ç¥éå®å¯¹åºçreduceæ¯åªä¸ªå¢ï¼å ¶å®mapä»»å¡ä¸ç´åå ¶ç¶TaskTrackerä¿æèç³»ï¼èTaskTrackeråä¸ç´åJobTrackerä¿æå¿è·³ãæ以JobTrackerä¸ä¿åäºæ´ä¸ªé群ä¸çå®è§ä¿¡æ¯ãåªè¦reduceä»»å¡åJobTrackerè·å对åºçmapè¾åºä½ç½®å°±okäºå¦ã
Reduce端ï¼
1ï¼Reduceä¼æ¥æ¶å°ä¸åmapä»»å¡ä¼ æ¥çæ°æ®ï¼å¹¶ä¸æ¯ä¸ªmapä¼ æ¥çæ°æ®é½æ¯æåºçãå¦æreduce端æ¥åçæ°æ®éç¸å½å°ï¼åç´æ¥åå¨å¨å åä¸ï¼ç¼å²åºå¤§å°ç±mapred.job.shuffle.input.buffer.percentå±æ§æ§å¶ï¼è¡¨ç¤ºç¨ä½æ¤ç¨éçå 空é´çç¾åæ¯ï¼ï¼å¦ææ°æ®éè¶ è¿äºè¯¥ç¼å²åºå¤§å°çä¸å®æ¯ä¾ï¼ç±mapred.job.shuffle.merge.percentå³å®ï¼ï¼å对æ°æ®å并å溢åå°ç£çä¸ã
2ï¼éç溢åæ件çå¢å¤ï¼åå°çº¿ç¨ä¼å°å®ä»¬å并æä¸ä¸ªæ´å¤§çæåºçæ件ï¼è¿æ ·åæ¯ä¸ºäºç»åé¢çå并èçæ¶é´ãå ¶å®ä¸ç®¡å¨map端è¿æ¯reduce端ï¼MapReduceé½æ¯åå¤å°æ§è¡æåºï¼å并æä½ï¼ç°å¨ç»äºæç½äºæäºäººä¸ºä»ä¹ä¼è¯´ï¼æåºæ¯hadoopççµéã
3ï¼å并çè¿ç¨ä¸ä¼äº§ç许å¤çä¸é´æ件ï¼åå ¥ç£çäºï¼ï¼ä½MapReduceä¼è®©åå ¥ç£ççæ°æ®å°½å¯è½å°å°ï¼å¹¶ä¸æåä¸æ¬¡å并çç»æ并没æåå ¥ç£çï¼èæ¯ç´æ¥è¾å ¥å°reduceå½æ°ã
Readé¶æ®µï¼MapTaskéè¿ç¨æ·ç¼åçRecordReaderï¼ä»è¾å ¥InputSplitä¸è§£æåºä¸ä¸ªä¸ªkey/value
Mapé¶æ®µï¼è¯¥èç¹ä¸»è¦æ¯å°è§£æåºçkey/value交ç»ç¨æ·ç¼åmap()å½æ°å¤çï¼å¹¶äº§çä¸ç³»åæ°çkey/valueã
Collectæ¶éé¶æ®µï¼å¨ç¨æ·ç¼åmap()å½æ°ä¸ï¼å½æ°æ®å¤çå®æåï¼ä¸è¬ä¼è°ç¨OutputCollection.collect()è¾åºç»æãå¨è¯¥å½æ°å é¨ï¼å®ä¼å°çæçkey/valueååºï¼è°ç¨Partitionerï¼ï¼å¹¶åå ¥ä¸ä¸ªç¯å½¢å åç¼å²åºä¸ã
Spillé¶æ®µï¼å³â溢åâï¼å½ç¯å½¢ç¼å²åºæ»¡åï¼MapReduceä¼å°æ°æ®åå ¥æ¬å°ç£çä¸ï¼çæä¸ä¸ªä¸´æ¶æ件ãéè¦æ³¨æçæ¯ï¼å°æ°æ®åå ¥æ¬å°ç£çä¹åï¼å è¦å¯¹æ°æ®è¿è¡ä¸æ¬¡æ¬å°æåºï¼å¹¶å¨å¿ è¦æ¶å¯¹æ°æ®è¿è¡combinerãå缩çæä½ã
溢åé¶æ®µè¯¦æ ï¼
å并é¶æ®µï¼å½æææ°æ®å¤çå®æåï¼MapTask对ææ临æ¶æ件è¿è¡ä¸æ¬¡å并ï¼ä»¥ç¡®ä¿æç»åªä¼çæä¸ä¸ªæ°æ®æ件ãå¨è¿è¡æ件å并è¿ç¨ä¸ï¼MapTask以ååºä¸ºåä½è¿è¡å并ã对äºæ个ååºï¼å®å°éç¨å¤è½®éå½å并çæ¹å¼ãæ¯è½®å并io.sort.factorï¼é»è®¤ï¼ä¸ªæ件ï¼å¹¶å°äº§ççæ件éæ°å å ¥å¾ å并å表ä¸ï¼å¯¹æ件æåºåï¼éå¤ä»¥ä¸è¿ç¨ï¼ç´å°æç»å¾å°ä¸ä¸ªå¤§æ件ã让ä¸ä¸ªMapTaskæç»åªçæä¸ä¸ªæ°æ®æ件ï¼å¯é¿å åæ¶æå¼å¤§éæ件ååæ¶è¯»å大éå°æ件产ççéæºè¯»å带æ¥çå¼éã