MapReduce阅读-下

MapReduce是一个应对实际任务重处理大规模数据集的编程模型与相关的实现,用户只需要指定map与reduce方面的代码,基础实时系统就可以为了将计算下发到集群中的不同主机,并会处理机器失效问题,负载均衡各主机的资源——内存、硬盘、网络带宽等。MapReduce的易用性使其在Google中得到广泛的应用。

Posted on May 7, 2017 in DistributedSystem, ReadPaper

4 Refinement

一些改进措施有:

1.用户可以自定义函数来分配中间级的键值对到R个reducenReduce

2.对中间级的键值对执行排序操作

3.对中间级键值对可以执行以下聚合函数以减低数据的传输量

4.自定义输入输出数据的格式

5.单机模式或者伪集群模式可以方便程序的调试

4.1 博客写的改进措施

1.Partitioning Function 
map任务的中间结果按照partitioning function分成了R个部分,通常,默认的函数hash(key) mod R可以提供相对均衡的划分。但有时应用需要按照自己的需求的来划分,比如,当Key是URL时,用户可能希望相同host的URL划分到一起,方便处理。这时候,用户可以自己提供partitioning function,例如hash(Hostname(url))

2.Ordering Guarantees 
对于reduce任务生成的结果,MapReduce保证其是按照Key排序的,方便reduce worker聚合结果,并且还有两个好处:

按照key随机读性能较好

用户程序需要排序时会比较方便

3.Combiner Function 
在有些情况下,map任务生成的中间结果中key的重复度很高,会造成对应的reduce任务通信量比较大。例如,word count程序中,可能和the相关的单词量特别大,组成了很多的(the, 1)K/V对,这些都会推送到某个reduce任务,会造成该reduce任务通信量和计算量高于其他的reduce任务。解决的方法是:

在map任务将数据发送到网络前,通过提供一个combiner函数,先把数据做聚合,以减少数据在网络上的传输量。

4.Input and Output Types 
MapReduce提供多种读写格式的支持,例如,文件中的偏移和行内容组成K/V对。

用户也可以自定义读写格式的解析,实现对应的接口即可。

5.Side-effects 
MapReduce允许用户程序生成辅助的输出文件,其原子性依赖于应用的实现。

6.Skipping Bad Records 
有时候,可能用户程序有bug,导致任务在解析某些记录的时候会崩溃。普通的做法是修复用户程序的bug,但有时候,bug是来自第三方的库,无法修改源码。

MapReduce的做法是通过监控任务进程的segementation violation和bus error信号,一旦发生,把响应的记录发送到master,如果master发现某条记录失败次数大于1,它就会在下次执行的时候跳过该条记录。

7.Local Execution 
因为Map和Reduce任务是在分布式环境下执行的,要调试它们是非常困难的。MapReduce提供在本机串行化执行MapReduce的接口,方便用户调试。

8.Status Information 
master把内部的状态通过网页的方式展示出来,例如,计算的进度,包括,多少任务完成了,多少正在执行,输入的字节数,输出的中间结果,最终输出的字节数等;网页还包括每个任务的错误输出和标准输出,用户可以通过这些来判断计算需要的时间等;除此之外,还有worker失败的信息,方便排查问题。

9.Counters 
MapReduce libaray提供一个counter接口来记录各种事件发生的次数。

例如,word count用户想知道总共处理了多少大写单词,可以按照如下方式统计

Counter* uppercase;
uppercase = GetCounter("uppercase");
map(String name, String contents):
    for each word w in contents:
        if (IsCapitalized(w)):
            uppercase->Increment();
        EmitIntermediate(w, "1");

master通过ping-pong消息来拉取worker的count信息,当MapReduce操作完成时,count值会返回给用户程序,需要注意的是,重复执行的任务的count只会统计一次。

有些counter是MapReduce libaray内部自动维护的,例如,输入的K/V对数量,输出的K/V对数量等。

Counter机制在有些情况很有用,比如用户希望输入和输出的K/V数量是完全相同的,就可以通过Counter机制来检查。