对Google MapReduce论文一些小看法

对Google MapReduce论文一些小看法

     这是我第一次来写博客,以前都只在网上看过别人的博客,还没自己写过博客,这学期老师要我们写关
 于goole三篇论文的读后感,才来写下这篇博客,第一次写,也不知道博客有没有什么格式,规则之类的,
 我也就随便写写,想到哪就写到哪了.
      嗯,说实在的,我花一个小时左右看完Goole MapReduce,好多地方都没看懂,有些概念分开看还好像
 能理解一点,有的一合起来就看不太明白了,我就先按我的理解把那篇论文大致梳理一遍。

首先,它大致介绍了 MapReduce 是个什么东西,为什么它会出现,文章上说:

MapReduce 是一个编程模型,也是一个处理和生成超大数据集的算法模型的相关实现。

它是一个编程模型,主要用来处理海量的数据,在此之前也有许多程序员实现过成百上千的
专用的计算方法,这些计算方法来处理大量原始数据,但

由于输入的数据量巨大,因此要想在可接受的时间内完成运算,只有将这些计算分布在成百上千的主机上。如何处理并行计算、如何分发数据、如何处理错误?所有这些问题综合在一起,需要大量的代码处理,因此也使得原本简单的运算变得难以处理。

基于这些问题,就有了MapReduce 框架模型来解决这个问题。

然后开始详细介绍MapReduce这个模型,原理看上去很简单,但简单往往就是最有用的。具体原理如下:

利用一个输入 key/value pair 集合来产生一个输出的 key/value pair 集合。 MapReduce
库的用户用两个函数表达这个计算:Map 和 Reduce。 用户自定义的 Map 函数接受一个输入的 key/value pair
值,然后产生一个中间 key/value pair 值的集合。 MapReduce 库把所有具有相同中间 key 值 I 的中间 value
值集合在一起后传递给 reduce 函数。 用户自定义的 Reduce 函数接受一个中间 key 的值 I 和相关的一个 value
值的集合。Reduce 函数合并这些 value 值,形成一个较小的 value 值的集合。一般的,每次 Reduce 函数调用只产生 0
或 1 个输出 value 值。通常我们通过一个迭代器把中间 value 值提供给 Reduce
函数,这样我们就可以处理无法全部放入内存中的大量的 value 值的集合。

用它来做事的例子也有很多,比如计算一个大的文档集合中每个单词出现的次数,计算 URL 访问频率,倒转网络链接图,每个主机的检索词向量,倒排索引,分布式排序等等。

-接着它开始讲MapReduce的实现,虽然我是计算机专业的,但我还是看不懂它到底是怎样实现的。我大致的理解是MapReduce先把输进来的数据分为若干个片段,然后创建大量副本,然后将任务分配给各个设备去完成,完成任务后再唤醒用户程序,来输出。
它还讲了一个很关键的内容----容错问题, 因为 MapReduce
库的设计初衷是使用由成百上千的机器组成的集群来处理超大规模的数据,所以,这个库必须要能很好的处理机器故障。
这里有几个不同的可能出错的地方,和一些应对方法。
1.work故障,它的解决方法是再次执行那些不可访问的 worker 完成的工作,之后继续执行未完成的任务,直到最终完成这个 MapReduce 操作。
2.master 失败,它的解决方法是,如果 master 失效,就中止 MapReduce 运算。客户可以检查到这个状态,并且可以根据需要重新执行 MapReduce 操作。
还有关于存储位置的问题,这一直以来都是一个被关注的问题,MapReduce采用它的方法使的在一个足够大的 cluster 集群上运行大型 MapReduce 操作的时候,大部分的输入数据都能从本地机器读取,因此消耗非常少的网络带宽。
-仅仅只用那些技术可能还不是很完善,论文中也跟我们讲了许多技巧,一共讲了9个拓展功能,分别是分区函数 、 顺序保证 、 Combiner 函数 、输入和输出的类型、副作用、 跳过损坏的记录 、 本地执行、状态信息和计数器。其中跳过损坏记录这个拓展功能让我记忆尤新,它说的就是用户程序中可能会有bug,这就会导致函数在处理某些记录时crash掉,MapReduce 操作无法顺利完成。通常的做法是修复 bug 后再次执行 MapReduce 操作,但这样很费时而且有时候还不一定能找到那些bug,因为在很多时候忽略一些损坏的记录也是可以的,因此保证保证整个处理能继续进行,MapReduce会检测哪些记录导致确定性的crash,并且跳过这些记录不处理。这样就提高了办事效率。
接着它开始讲它的性能,这一部分内容好像涉及好多专业的计算机知识和数学知识,因此我又没看怎么懂。这里就不在说了,有兴趣可以去读读原文章。
’MapReduce模型发展到现在有许多应用:

1.大规模机器学习问题
2.Google News 和 Froogle 产品的集群问题
3.从公众查询产品(比如 Google 的 Zeitgeist)的报告中抽取数据。
4.从大量的新应用和新产品的网页中提取有用信息(比如,从大量的位置搜索网页中抽取地理位置信息)。
5.大规模的图形计算。

这些问题都是我们用常见的方法不是那么好解决的,MapReduce模型就为我们提供了优秀的解决方法。

在论文的结束语中,把文章总结的很好,也让我们学到了很多。

MapReduce 编程模型在 Google 内部成功应用于多个领域。我们把这种成功归结为几个方面:首先,由于 MapReduce 封装了并行处理、容错处理、数据本地化优化、负载均衡等等技术难点的细节,这使得 MapReduce 库易于使用。即便对于完全没有并行或者分布式系统开发经验的程序员而言;其次,大量不同类型的问题都
可以通过 MapReduce 简单的解决。比如,MapReduce 用于生成 Google 的网络搜索服务所需要的数据、用来排序、用来数据挖掘、用于机器学习,以及很多其它的系统;第三,我们实现了一个在数千台计算机组成的大型集群上灵活部署运行的 MapReduce。这个实现使得有效利用这些丰富的计算资源变得非常简单,因此也适合用来解决 Google 遇到的其他很多需要大量计算的问题。 我们也从 MapReduce 开发过程中学到了不少东西。首先,约束编程模式使得并行和分布式计算非常容易,也易于构造容错的计算环境;其次,网络带宽是稀有资源。大量的系统优化是针对减少网络传输量为目的的:本地优化策略使大量的数据从本地磁盘读取,中间文件写入本地磁盘、并且只写一份中间文件也节约了网络带宽;第三,多次执行相同的任务可以减少性能缓慢的机器带来的负面影响(alex 注:即硬件配置的不平衡),同时解决了由于机器失效导致的数据丢失问题。

······

大致说完这篇论文的时候,也让我想起了前段时间看的 《数学之美》,那本书也提到了Google 云计算还有Google 大脑和神经网络等等。MapReduce用的根本原理就是十分常见的分治算法:将一个复杂的问题,分为若干个简单的子问题进行解决。然后,对子问题的结果进行合并,得到原有问题的解。 将一个大任务分成晓得子任务,并完成子任务的计算,这个过程叫Map,将中间结果合并成最终结果,这个过程叫Reduce。

下面是有关Google大脑的一些知识:
Google大脑说穿了是一种大规模并行处理的人工神经网络。其创新之处也在于利用了云计算的并行处理技术。
Google大脑为什么要采用人工神经网络而不是其他机器学习的技术呢?
第一,从理论上讲,人工神经网络可以在多维空间“画出”各种形状的模式分类边界,因此它有很好的通用性。
第二,人工神经网络的算法非常稳定,几乎没有怎么变过。
第三,并非所有的机器学习算法都容易并行化,人工神经网络的训练算法相对简单,容易并行实现。
Google大脑在减少计算量方面做了两个改进。
首先是降低每一次迭代的计算量,采用随机梯度下降法。 第二是减少训练的迭代次数。采用L-BFGS方法,可以根据离最后目标的“远近”距离调整每次迭代的步长。

本文用到的参考资料:

  1. Google MapReduce 中文版
  2. 《数学之美》
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值