第一章初识hadoop

第一章 初识hadoop

在发达的今天,当一头牛不能运动货物的时候,他们使用多头牛来运输,而不是养一个更大的牛。我们不应该尝试创造更大的电脑,而是更多的电脑。——grace hopper

数据

大数据处理和分析

要解决的第一个问题是 硬盘存储失败。

第二个问题是 大多数的分析任务应该能够通过某种途径集合成数据。从一个硬盘读出来的数据,可能需要和其它99个硬盘的数据集成。各种分布式系统允许从多种来源集成数据,但是准确的完成这件事情,确实个令人头疼的巨大挑战。Map reduce 提供了一个编程模型,它从磁盘的读和写操作来抽象问题。它把这种问题转换成一个键值的计算。Mapreduce 是由两部分计算组成的,map计算 和 reduce计算。

和其他算法系统的比较 

Mapreduce采用的方法,看起来可能像是一种粗鲁、暴力的方法。他的前提是:对于每次的查询,整个数据库(或者至少是数据库的一大部分内容)是加工过的。但,如下是他的能力:mapreduce是一个分批查询处理器,并且,它在你的整个大型数据中执行特别的查询及在短时间内获得查询结果是革新性的。它改变了你对数据的看法,解锁了(解密了)之前存储在磁带盒硬盘上的数据。他给了人们革新数据的机会。

MapreduceRDBMS的另一个大的区别:是他们操作的数据中结构化的数量。结构化的数据,被组织成实体,他有一个特定的格式,例如XML文档,或者符合一个预定规划的数据表。这是RDBMS的领域。另一方面,半结构化的数据,是松弛的,尽管他会有一个规定(模式),但常常被忽视,所以这个模式仅被用来作为数据结构的指导。例如:一个电子数据表,它的结构就是带单元格的网格,尽管每个单元格可能持有任何格式的数据。非结构化的数据没有任何特定的内部结构:例如,文本文档或者图片数据。Mapreduce 在非结构化数据和半结构化数据上面工作效果很好,因为,他最初被设计就是用来在处理数据的时候对数据进行解释。换句话说,mapredue的键和值不是数据的固有属性,但是,他们被人们用来分析数据。

关系型数据库经常序列化来维持它的完整性,并且移除冗余性。序列化给mapreduce带来了问题,因为,它需要读取一个非本地的记录操作,并且,mapreduce做的一个核心假设就是mapreduce能够高效的处理流的读写。

网站服务器的日志,是一批记录信息,但它不是序列化的,这是一个很好的例子。(例如,客户端的主机名每次都是全新指定的,尽管如此,相同的客户端会出现很多次。)这也是各种各样的日志文件尤其适合用Mapreduce分析的原因。

Mapreduce是一个线性的易于扩展的编程模型。程序员写两个函数:一个map函数,一个reduce函数。每一个函数都定义了一个一组键值对到另一组键值对的映射。这些函数不关注不在乎他们所操作的数据或群的大小,因此他们可以不必改变自己的代码即可适应小数据和大数据。更重要的是,如果你增加一倍输入的数据,这个工作会变慢一倍。但是,如果,你同时增加一倍群的数量,那么一个工作将会像原来运行的一样快。这不是通常的SQL查询。

然而,随着时间的推移,关系型数据库和mapreduce的区别有点模糊了。关系型数据库开始合并Mapreduce的一些观点(就像,aster数据和greenplum的数据库),并且从另一个方面来说,由于基于Mapreduce的更高级的查询语言(例如pighive)使mapreduce系统更加易于传统的数据库程序员接受。

网络计算

高性能计算和网络计算组织,已经做大数据处理很多年了,他们使用了消息传递接口(MPI)这样的接口。通俗的说,HPC的处理方法是分派任务到很多集群机器,他们共享一个文件系统,此文件系统命名为SAN。这个方法处理以密集计算为主的任务时是优秀的,但是,当节点去访问更大的数据(数百的十亿字节的数据,这样大的数据量,正是mapreduce大放异彩的开始)时,这种方法就遇到困难了,因为网络带宽会成为一个瓶颈,这样计算机节点就是闲置的了。

注释:2007年一月,David J. DeWitt and Michael Stonebraker 发表了”mapreduce:后退的一步”文章,这一文章引起了轰动,在这篇文章里面,他们批判了mapreduce,说他是一个关系型数据库的糟糕的替代品。许多评论家对此争论到,那样的言论是一个错误的比较(例如,mark说关系型数据库是一个锤子,mapreduce是一个螺丝刀)。David 还写了第二篇 文章”mapreduce 2”,这篇文章里面强调了其他人主要提到的观点。

Mapreduce尝试用计算机节点去收集数据,因此数据的访问就是很快的了,因为这些数据是本地的。(笔者发腾添加:读到这句话就对一些问题很明白了,mapreduce是让每个计算机节点单独访问网络,获取每个节点要处理的数据,而不是根节点从网上获取数据,然后将数据、任务分派到每个节点。这样的话,就没有了根节点宽带瓶颈这么一说了。Ko,继续翻译)这个特点,称作数据本地化,是mapreduce的核心部分,并且是mapreduce性能优越的原因。意识到,在数据环境中,网络宽带是最珍贵的资源,(到处拷贝数据很容易就使网络上的链接饱和了),mapreduce依靠准确的模拟网络拓扑结构,需要更长的时间来保存他的数据。(笔者注:这里说的也即是高延时了)。

MPI给了程序员更多的控制权,但是它需要程序员准确的掌握数据流的机制,MPI是通过低级C常规和构架曝光给程序员的,就像sockets,这个也和对数据分析的高级算法是一样的。而,mapreduce操作仅仅在更高的级别上,程序员只需考虑键值对函数就可以了,它的数据流是隐藏的。

在一个大的分布式计算中协调多线程是一个挑战。最困难的方面是优雅的处理局部的失败,——当你不知道一个远程的处理是否失败的时候,——此时你还要让整个计算进度继续向前。

Mapreduce使程序员摆脱了关注处理的失败,因为mapreduce实现了检测失败的map或reduce任务,把他们从新部署到健康度机器上。Mapreduce能够做到这点是因为,他是一个

分享nothing的架构,这意味着,每一个任务与其他的任务是没有依赖关系的。(这是一个轻微的过度简简单化,因为,mappers的输出时reducers的输入,但这是在mapreduce系统的控制下;在这种情况下,它需要更多的关心重新运行一个失败的reducer而不是一个失败的map计算,因为它需要确定它可以检索到需要的map计算的输出值,如果没有的话那么就运行相关的map计算来重新生成一次)。这样的话,从程序员的角度来讲,任务运行的顺序是不重要的。与mapreduce相比,MPI程序员就必须准确的管理他们自己的检查点和恢复,这样给了程序员更多的控制权,但,同时让程序员写代码更难了。

Mapreduce可能更像是一个严格的编程模型,在某种程度上,他是这样的:你被限制在了以某种方式联系的键值对,并且mappersreducers有限制的协调运行。(mappers传递键和值给reducers)。一个通常的问题是:你能用它做一些有用的或者不平凡的事情么?

答案是可定。Mapreduce是被google工程师发明用来构建产品索引的系统,因为工程师们发现他们一遍遍的解决同样的问题(并且,mapreduce是被 功能编程,分布式计算和数据库社区的老的观点 激发而来的),但是自从那开始,他被用在了其他的很多领域的应用中。Mapreduce可以用于很多领域的计算,这是令人很惊奇的事情,他可以用于的领域,从图像分析到表格问题计算,到机器学习计算。当然,他不能解决所有的问题,但是,他是一个通用的数据处理工具。

Volunteer Computing

Mapreduce被设计在信任的基础上运行最后几分钟或几小时的工作,在一个单独的数据处理中心运行着专门的硬件,他们有很高的集合宽带来联系。相反,Seti@home 在不信任的计算机上面进行永久的计算,这些计算机的网速是不稳定的,数据也不是本地化的。

Hadoopd的简史

Hadoop是由Doug Cuttingapache lucence(广泛使用的文本搜索库)的创造者创造的。Hadoop的原型是apache nutch,一个开源的网站搜索引擎,nutch也是lucence的一个子项目。

Apache hadoophadoop生态系统

尽管hadoop是因为他的mapreducehdfs而出名,这个名词也用于与他相关的工程中,在这个大伞下的分布式处理和大数据处理。


你可能感兴趣的:(Hadoop权威指南第二版翻译)