Map reduce:是一种海量数据并行编程模型,分为map和reduce两个函数。目的是把任务分给多个节点,然后汇总各个节点的中间结果,得到最终结果。
Map reduce的对象有一个特点:数据可以分为多个并行处理的数据集。
执行过程如下:
- 系统把数据分割成等大小的split(片),每个片进一步分解成<key,Val>对,然后分配用户定义的map任务。
- Mapper:根据map任务计算得到中间结果<key2,val2>然后根据key2进行汇总得到<key2,list(val2)>,然后将结果反馈给系统。
- Reducer:系统根据中间结果进行排序,然后汇总得到最终的结果并输出。
==================Map reduce的集群行为===================
- 任务调度:Job tracker把mapper reducer分配给task tracker(必须建立在Data node)之上。
- 本地计算:尽量让spliter小于block,这样让带有数据的data node自己进行计算,避免网络传输中的性能损失。
- shuffle:将计算的结果分成R分(取决于Reducer的个数),一般利用hash来执行。
- combine:为了节省带宽,在map的最后会执行combine(合并)操作,将许多相同key值的合并为一对<key,val>。
- 中间结果是存放在本地而不是HDFS,这样不会浪费HDFS的备份资源,而且它们是临时数据,用完之后就删除了。存放在本地之后通知job tracker文件的位置,job tracker安排reduce去进行reduce。
====================Map reduce的个数=====================
- 每个task都有一个资源池(slots),只有获得了slot才能执行。reduce的总数为datanode的总数乘以slot的个数。得到之后reduce的值小于该值,一个是为了避免reduce排队,另一个也是因为当有reduce宕机之后,可以立马分配 reduec。另外reduce的个数必须小于map的个数。