Google MapReduce阅读笔记(三)

4.扩展与改进
4.1分区函数
用户通常会指定reduce任务输出文件数量R,map产出的中间数据集使用分区函数对数据进行再划分,之后再输入到后续任务执行。
默认的分区函数是哈希方法,hash(key) mod R,这种方法能够平衡负载。有时候用户有特殊的需求,例如希望每个主机(hostname)的URLs保持在同一个文件中。MapReduce库支持此类扩展,使用hash(hostname(url)) mod R分区函数就能满足上述需求。

4.2顺序保证
实现保证在给定分区中,kv数据的梳理是按照key增序处理的。

4.3合并函数(Combiner Function)
有时,map产生的中间key的重复数据比重很大,例如词频统计的应用,map将产生大量($word, 1)这样的kv数据,然后reduce把这些记录累加起来。
可以提供给用户一个合并函数,在map完成后,本地就做一次合并,生成($word, n),这样reduce处理的量就会减少很多。
合并函数在每个map任务上都会执行一次,一般来说,合并函数与reduce函数是一样的,它们的区别是,合并函数执行本地数据合并,结果生成在临时文件中;reduce函数执行最终的合并,结果生产在最终的文件里。

4.4输入输出类型
文本行是一种最常用的格式:key是偏移量,value是一行的内容;
当然也能够实现从数据库里读取记录。

4.5忽略损坏的记录
某些时候,部分记录损坏了,MapReduce可以跳过这些记录,部分数据的损坏可能不影响全局“统计”结果。

4.6计数器
MapReduce库使用计数器统计不同事件发生次数,例如,用户想统计已经处理了多少个单词。
为了支持这个特性,用户可在程序中创建命名的计数器对象,在Map和Reduce函数中增加相应的计数器的值。
worker会周期性的把这些计数器的值汇报给master,由master负责这些值的累积(提供查看进度的可能性)。

4.7其他
(1)map和reduce过程中,根据用户逻辑,可能会产出一些中间文件临时保存数据,没有提供类似“两阶段提交”的机制保障这种情况的原子性;
(2)本地执行:分布式bug难于调试,提供了MapReduce库的本地实现版本,可以方便的gdb,差错等;
(3)状态信息:master使用嵌入式http服务器可以显示状态信息:执行进度、已完成任务、成立百分比等;

5.性能测试
5.1集群配置
(1)1800台机器;
(2)双核2GCPU;
(3)4G内存;
(4)160G硬盘;
(5)千兆网卡;
(6)双层树形交换网络,100-200G传输带宽。

5.2grep
5.3排序
5.4备份

结论是:Google MapReduce很牛逼。

n.结束语
为什么Google MapReduce能成功:
(1)Google MapReduce库封装了并行处理、容错处理、本地数据优化、负载均衡等技术难点细节,使得库易于使用;
(2)大量需求能够通过这种模型解决:检索、排序、挖掘、机器学习等;
(3)实现并部署了千台机器组成的MapReduce,Google用它解决了很多问题。

经验:
(1)约束编程模式使得并行与分布式计算变得容易,也易于构造容错计算环境;
(2)网络带宽是稀有资源:大量优化用在减少网络传输上;
(3)多次执行相同的任务能减少“长尾”带了的负面影响,同时解决了机器失效导致的数据丢失问题。

评论关闭。