[云计算]大规模数据的的挑战

来源:互联网 发布:乐视影视mac版 编辑:程序博客网 时间:2024/04/24 03:48

大规模的挑战

进行大规模计算是很困难的,要处理大规模数据需要将数据分布到多台机器上并行处理,第当多台机器之间需要协作时,失败的几率就很升高。在单台机器环境中,失败并不是设计者经常关心的问题,因为机器崩溃了,反正是无法将程序恢复的。

但在分布式环境中,局部失败是经常会发生的,比如网络会因为交换机和路由器崩溃局部失败或全部失败;数据有可能因为意外的网络阻塞没有按时到达特定结点;运算结点可能因为过热导致磁盘崩溃或用完了内存或磁盘空间;数据可能出错,也可能传输时发生错误;不同实现或不同版本软件在使用协议时有细微的差别;时钟可能变的不同步;锁文件可能没释放;可能在分布式不可打断的传输时受到干扰,导致网络连接中途断开,等等。在上述每一种情况下,分布式系统的正常工作部分应该可以从失败中恢复,或使用户不需要关心这些错误,也可以继续正常工作。显然,提供这种弹性是软件工程的巨大挑战。

不同的分布式系统会着重处理不同的几种失败,而不太关注另外的失败类型。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集群中,数据被分布到集群的各个结点,HadoopDistributed File System (HDFS)将大的数据文件分成块,将这些块交由集群中的结点处理,并且每个块都会复制到不同的几个机器上,所以一台机器崩溃不会导致数据丢失,监测系统会对结点崩溃做出反应,重新复制数据,即部分存储(partial storage)。即便文件块被复制分布到不同的机器,但它们形成了一个单一的命名空间,所以它们的内容还是全局可访问的。

在Hadoop的编程框架中,概念上来说,数据是面向记录的。每个输入文件都被以行或其它特定的应用逻辑格式分开。集群中的每个结点的每个进程都会处理这分开文件的一部分,Hadoop框架再根据分布式文件系统的信息调试进程到数据/记录的位置,因为文件以块的形式存在于分布式文件系统中,每个结点上的每个计算进程处理数据的一个子集。哪些数据要被一个结点处理是由数据本身的存放位置决定的。大部分数据是直接地从磁盘读入CPU,这减少了网络带宽的限制,也防止了不必要的网络传输。这种策略是将计算移动到数据,而不是将数据移动到计算,这使得Hadoop有丰很高的数据本地性,从而它就有着很高的性能。

 

 

原创粉丝点击