[2][paper] map reduce at 2004

Posted WhateverYoung

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[2][paper] map reduce at 2004相关的知识,希望对你有一定的参考价值。

2004 map reduce google

2020年1月底,新年伊始之际,一场始自武汉开始的疫情随着春运蔓延到全国,每天看着地图开始慢慢沦陷,心中忐忑不安,打破不安开始学习很久之前就想学习的东西,分布式mit6.824课程,课程阅读分布式领域的论文,讲解,开发作业最终完成shared-KV storage,希望2020年可以顺利完成该课程,可以在分布式领域有些基础,开篇的论文是google Jeffrey大神于2004写成的map reduce论文,后面大数据hadoop生态也始于此,目前已经成为业界大数据离线计算的事实标准,包括hdfs/mr/spark/hive,阅读本文,通过了解map reduce的设计思路,学习分布式领域的核心思想。

摘要

MR是用来并行处理大型数据集的编程模型,用户来开发简单的map和reduce函数处理K-V数据对,很多现实问题可以用该编程模型得到解决。按照该方式编写的程序可以交由框架自动在大规模集中并行计算,最终计算时间取决于输入数据的规模和切分,错误容忍以及系统额外的通信开销。在mr编程模型下,没有分布式经验的人也可以利用起大规模分布式集群的计算能力。该系统运行在商业集群环境下,具备水平扩展性,一个典型的mr计算任务处理TB级别的数据使用成百台计算进行分布式计算,每天100x的jobs在1000x机器集群中执行。

1 简介

谷歌拥大量就大数据驱动的业务,不同的团队为了处理大量数据,开发了许多领域相关的分布式计算系统,包括爬虫类、网页访问日志分析等等,计算得到需要的衍生数据,索引,图结构,搜索和分析用户点击需要的结构化数据。总结特点如下,输入数据量极大,需要分布式存储和分布式计算才能在有意义的时间内解决,核心是解决并行计算、输入数据的分布式划分以及处理分布式中的错误容忍问题。每个系统中都有相同部分代码,如何调度分配计算资源,存储资源以及处理分布式容错问题。
于是作者设计一层抽象,集中处理领域无关的分布式计算问题,包括输入分布和划分,并行计算,错误容忍和负载均衡问题,受到List语言中map reduce函数式编程的启发,大部分问题可以归结到这个模式下,首先map遍历输入的逻辑record(K/V),得到中间结果K/V,然后执行reduce遍历中间KV,得到最终的KV结果,用户自定义map和reduce算子,系统负责其他部分,简明扼要的接口拥有普适性,带来了巨大的能量,在一个使用廉价x86服务器集群中,使得自动化分布式并行,横向扩展和错误容忍得到解决。
第二部分介绍编程模型和几个例子,第三部分作者在google集群和workload中一个具体的实现,第四部分介绍了一些具体的实现技巧,第五部分给出不同的workload下的性能分析,第六部分介绍一个具体的使用案例,索引系统,第七部分介绍相关的工作和未来的计划。

2 编程模型

模型假设:(TODO需要一个sample来具体说明,比如lab1中是有的)

map 输入K1-V1,得到list(K2,V2),本地根据K聚合一次,保证K有序且不重复

reduce 输入K2,list(V2),得到list(V2)

3 实现

基于GFS,流程上主要是input files/workers/intermediate files/workers/output files/master,过程如下:

  1. MR library首先将输入文件split为M份,每份16M-64M,将用户自定义程序复制到集群中所有节点
  2. 其中一个程序为master,其他为workers,master分配任务给workers,总共M个map task和R个reduce task供分配,master选取空闲的worker分发map任务或者reduce任务
  3. worker得到map任务读取input对应的split,解析出KV对输入到用户自定义map函数处理,得到结果存储到buffer memory中
  4. 周期性从buffer中flush到local disk,写入时通过分片函数分片为R个regions,本地文件的位置发送给master,master会把位置信息和reduce任务一起发送给执行reduce任务的worker
  5. worker接收到reduce任务,使用rpc网络读取临时文件,读取所有过程文件后,对K进行排序,内存不足时使用外部排序
  6. reduce worker对排序好的KV对进行迭代处理,为每一个唯一key执行reduce函数,并将结果写入最终的输出文件中
  7. 当所有任务结束后,master返回用户程序,用户可以得到计算结果,结果存储在R个文件中,一般会作为下一个MR任务的输入

错误容忍

  • worker失效,master通过周期性心跳监控worker是否活着,一旦失去联系,标记worker失效,相关的map task重新回到初始态(idle->in-process->completed),可以调度给其他worker,reduce task同样处理,一种情况是,执行完的task worker失效,此时中间数据不可达,仍旧会重新执行map task,reduce存在gfs,无此问题
  • 同一个map任务多次执行,master只会记录一个,不会有问题
  • master失效,周期性写checkpoint供恢复,job返回失败,供客户端重试

其他

  • 输入尽可能本地load,gfs中记录该信息,调度map任务选择chunk所在节点调度,来保证局部性,三副本保证可用性
  • M和R需要远大于worker数目,保证动态负载均衡,maybe M=200,000,R=5,000,workers=2,000
  • backup task防止最后的几个task时间过长

4 一些细节

  • 分片函数,hash(key),hash(Hostname(key))…
  • order保障,保证R个中间文件中每个按照升序排列Key,增加map worker原地combiner的操作减少网络传输
  • 跳过坏数据,有些时候少一些数据参与计算不影响大局
  • 本地执行,debug,profiling,testing
  • status info
  • 计数器,worker周期性上报给master,展示给用户

5 性能表现

体现了backup的作用,以及随机杀死workers,体现了系统的错误容忍能力,大规模计算的性能体现了水平扩展性

6 经验

在索引系统中落地和一些改造

7 相关其他系统 8 结论

  • 对用户屏蔽了并行计算、容错、负载均衡、本地性,易于使用
  • MR模型可以解决相当一部分问题
  • 水平扩展性好

some inspiration

  • 计算靠近数据,本地性

阅读参考资料和博客

以上是关于[2][paper] map reduce at 2004的主要内容,如果未能解决你的问题,请参考以下文章

Multi-threaded Map Reduce in Rust

Python之路Python作用域匿名函数函数式编程map函数filter函数reduce函数

[5][paper] gfs at 2003

paper阅读 Real-time Personalization using Embeddingsfor Search Ranking at Airbnb

paper阅读 Real-time Personalization using Embeddingsfor Search Ranking at Airbnb

map和reduce方法理解