第一章:教程介绍< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-comfficeffice" /> 介绍欢迎来到Yahoo! Hadoop教程!这个系列教程将向你介绍Apache Hadoop系统的许多方向,还将向你展示:如何进行简单和高级的集群配置;如何使用分布式文件系统;如何使用分布式文件系统,如何开发复杂的Hadoop MapReduce应用,并且其它相关的分布式系统也提及。 本章的目标:1. 理解Hadoop适用的问题范围。 2. 理解Hadoop在看待这些问题时与其它分布式系统的不同。 大纲1. 介绍 2. 本章的目标 3. 大纲 4. 适用的问题范围 1. 大规模数据的挑战 2. 摩尔定律 5. Hadoop方法 1. 与现有其它技术比较 2. 数据分布 3. MapReduce:隔离的进程(s) 4. 水平的可扩展性(flat scability) 6. 教程的其它部分 适用问题范围Hadoop是一个大规模分布式批处理架构,虽然它在单台计算机上也能使用,但它的真正能力是在成百上千计算机上运行时才显现出来,Hadoop可以高效地将大量工作高效地分布到一组计算机上。 它能处理多大量的工作?Hadoop面对的处理工作比许多现在系统处理要高几个数量级,几百G的数据,只不过在Hadoop眼里不过是小数据量。实际上Hadoop是设计来对付“We级的”的数据,“Web级”数据大小范围在几百G到T级,甚至P级。在这种规模下,输入数据很可能甚至不能存入单个计算机的磁盘中,更不用说内在了,所以Hadoop中包括一个分布式文件系统,它将输入文件分成块,将这些块传输到你的集群中的计算机上保存,这样,原问题可以使用集群中所有计算机并行处理,那么得到计算结果的效率也就最高。 大规模的挑战进行大规模计算是很困难的,要处理大规模数据需要将数据分布到多台机器上并行处理,第当多台机器之间需要协作时,失败的几率就很升高。在单台机器环境中,失败并不是设计者经常关心的问题,因为机器崩溃了,反正是无法将程序恢复的。 但在分布式环境中,局部失败是经常会发生的,比如网络会因为交换机和路由器崩溃局部失败或全部失败;数据有可能因为意外的网络阻塞没有按时到达特定结点;运算结点可能因为过热导致磁盘崩溃或用完了内存或磁盘空间;数据可能出错,也可能传输时发生错误;不同实现或不同版本软件在使用协议时有细微的差别;时钟可能变的不同步;锁文件可能没释放;可能在分布式不可打断的传输时受到干扰,导致网络连接中途断开,等等。在上述每一种情况下,分布式系统的正常工作部分应该可以从失败中恢复,或使用户不需要关心这些错误,也可以继续正常工作。显然,提供这种弹性是软件工程的巨大挑战。 不同的分布式系统会着重处理不同的几种失败,而不太关注另外的失败类型。Hadoop没有提供安全模型,也没有防止恶意插入数据的安全机制,比如它无法控制一个在结点间的攻击,然而,它在硬件失败和数据阻塞方面的设计非常健壮,其它的分布式系统数据它们所要处理的问题(比如,高安全性)需求做出了不同的权衡。 在考虑上述的bugs和挑战之外,我们还需要意识到,计算硬件都只有有限的资源,主要的资源包括: 1. 处理器时间 2. 内存 3. 磁盘空间 4. 网络带宽 单台计算机通常只有几G内存,如果输入数据是TB级的,那就需要上千台计算机才能将这些数据放入内存,即便如此,但是单台计算机仍无法处理和寻址这些数据。 磁盘的空间要多的多,单台机器的磁盘空间现在有几TB左右,但在大规模计算中,计算机产生的中间数据通常是输入数据的几倍,这也就将占有输入数据的几倍磁盘空间。在处理过程中,一些结点磁盘满了,分布式系统也许需要把这些数据传输到其它可以保存这些溢出数据的结点上去。 最后,即使在内网名,带宽也仍是稀缺资源。假设一组结点用千兆以太网连接,也许它们之间的有很高的传输速度,但如果所有的结点同时传输几G的数据集合,这样很容易使交换机带宽饱和。另外,如果机器都分在多个主机架中,那么可用以数据传输的带宽就会更少,更严重的是,用这个信道的RPC请求或其它数据传输请求会延时或被丢弃。 故一个成功的分布式系统必须能高效地使用上述资源,更重要的是,它在分配这些资源时,应将系统视为一个整体,将尽可能多的时间用于核心计算。 多台机器之间的同步仍是分布式系统设计的最大挑战,如果结点在分布式系统中可以直接交互,那么设计者必须认识到交互模式所带来的危险,它很容易产生超出系统所能承受的RPC调用!进行多方数据交换也会引起死锁和竞争。最后,在面临部分结点失败时,保持继续计算的能力是一个更大的挑战,比如,一个系统中有100个结点,其中一个崩溃了,但其它99个结点仍能继续计算,理想情况下,系统只是损失了1%的计算能力,更进一步,如果在分布架构上采用了复杂的交互网络,那么决定如何重新计算失败结点的任务是最好,和通知网络拓扑的改变信息,也许是实现的重要部分。 摩尔定律为什么要用一个分布式系统呢?它们听起来麻烦比价值大,随着计算机硬件的快速的设计脚步,似乎单台计算机的硬件会提高到处理更大的数据量,毕竟摩尔定律(以Gordon Moore命名,Intel创始人)说道:集成电路上可容纳的晶体管数目,约每隔18-24个月便会增加一倍,性能也将提升一倍,而价格下降一半。但现在的事实是芯片的设计趋势改变了,虽然我们仍可以将单位区域的晶体管数量翻倍,但这已经不能提高单线程的计算速度了,新的CPU,如Intel Core 2和Itanium 2现在在架构上努力将一些小的CPUs或“核”嵌入到一个物理设备上,这会使多线程并行地处理与单线程相比两倍的数据,但是每个线程的速度还是和以前是一样的。 即使将成百上千的CPU核放到一台计算机上,它也无法很快地把数据传输到这些核去处理,单个磁盘读取速度大约为60-100MB/s,虽然磁盘的读取速度一直在提高,但却无法与处理器速度的提高相比,暂且乐观地假设速度为上限100MB/s,并假设有4个I/O通道,也就是有400MB/s的速度,那么一个4TB的数据集要用10,000秒去读大约4小时才能载入数据,但用100台只有两个I/O通道的机器做相同的工作,只需要3分钟。 Hadoop方法Hadoop方法设计目的是将许多普通计算机连接起来并行地处理大量信息。一个上面提到的1000-CPU的机器,比之1000个单核或250个四核机器的价格要高出许多,Hadoop将会将这些小型的低廉的机器连接起来成为一个性价比高的计算机集群。 与现有方法比较在大规模数据上进行分布式计算以前也是有的。Hadoop的独特之处在于它简单的编程模型,它可使用户很快地编写和测试分布式系统,和它高效,自动分布数据和工作到不同机器的方式,以及利用多核并行处理。 计算机的网络调度可以用其它系统,比如Condor,但Condor不能自动分布数据:必须管理一个单独的SAN,不止如此,多个结点的协作也必须管理交互系统,如MPI,这种编程模型极难掌握,并且会引起一些难以理解的错误。 数据分布在Hadoop集群中,数据被分布到集群的各个结点,Hadoop Distributed File System (HDFS)将大的数据文件分成块,将这些块交由集群中的结点处理,并且每个块都会复制到不同的几个机器上,所以一台机器崩溃不会导致数据丢失,监测系统会对结点崩溃做出反应,重新复制数据,即部分存储(partial storage)。即便文件块被复制分布到不同的机器,但它们形成了一个单一的命名空间,所以它们的内容还是全局可访问的。 在Hadoop的编程框架中,概念上来说,数据是面向记录的。每个输入文件都被以行或其它特定的应用逻辑格式分开。集群中的每个结点的每个进程都会处理这分开文件的一部分,Hadoop框架再根据分布式文件系统的信息调试进程到数据/记录的位置,因为文件以块的形式存在于分布式文件系统中,每个结点上的每个计算进程处理数据的一个子集。哪些数据要被一个结点处理是由数据本身的存放位置决定的。大部分数据是直接地从磁盘读入CPU,这减少了网络带宽的限制,也防止了不必要的网络传输。这种策略是将计算移动到数据,而不是将数据移动到计算,这使得Hadoop有丰很高的数据本地性,从而它就有着很高的性能。 < xmlnamespace prefix ="v" ns ="urn:schemas-microsoft-com:vml" />
图1.1 在数据载入时数据分布到各个结点 MapReduce:隔离的进程Hadoop限制了进程的通信量,因为每个任务所处理的单个记录与其它记录无关,这初看起来似是一个极大的限制,但它是整个框架更可靠,Hadoop不会运行任意一个程序并将它分布到整个集群,程序必须符合一个特定的编程模型,称为MapReduce。 在MapReduce中,Mapper任务是将记录分开,Mapper的输出会作为Reducer任务的输入,Reducer再将不同的Mapper结果合并。 在一个Hadoop集群中,不同的结点仍会相互通信,但是与其它传统的分布式系统通信有所不同,传统的作法是应用设计者要显式地通过socket或MPI缓冲将字节流从一个结点传到另一个结点,但在Hadoop上的通信是隐式的,数据片断都有着key值,通过它Hadoop就知道如何将相关信息位发送到一个目标结点。Hadoop在内部管理数据传输和集群拓扑。 通过限制结点之间的通信,Hadoop使分布式系统更可靠,单个结点崩溃可以通过其它结点重新开始任务的方式正常工作。因为用户级任务不需要结点之间显式地通信,所以不需要用户程序交换信息,同样结点不需要回滚到预定义的检测点去部分地重新开始计算,在Hadoop中其它正常结点继续运行,好似没有错误发生,并将部分重新开始程序这个挑战的方面留到Hadoop层处理。
图1.2 在结点上运行的Mapping和Reducing任务,其中记录也在图中有显示 水平的可扩展性与其它分布式系统相比,使用Hadoop的好处在于它的水平的可扩展性,在少量结点上,用Hadoop处理有限的数据时,不能展示Hadoop的性能,因为开始Hadoop程序相关的代价比较高,其它并行/分布程序方式,比如MPI (Message Passing Interface)可能在2台,4台或许10多台计算机上有更好的性能,尽管在少量机器上协同工作在这种系统上也许会取得更好的性能,但这种为性能所要付出的努力是非线性的增长。用其它分布式框架所写的程序在从十台机器的级别到成百上千台机器需要大量的重构工作,这也许要程序重写几次,并且其它框的基础元素会限制应用的规模大小。 但是特别设计的Hadoop有着水平的可扩展性,一个Hadoop程序写完后,在10个结点上运行,如果迁徙到更大的集群上运行,几乎不需要做什么工作,Hadoop平台会管理数据和硬件资源并提供与可用资源成比较的可靠性能。
|