第 1 章 分布式计算:背景与挑战

在大数据时代,全球数字数据每两年增加一倍。海量的数据给了数据科学家们更广阔的应用空间。利用 丰富的数据分析工具,从数据中挖掘出有价值的信息,让决策更加智慧,让生活更加便利,数据科学极 大地颠覆了人们传统的生活方式和商业模式。同时,大数据时代的到来使人们从担心没有数据、不知道 从哪获取数据,变成了面对如此大规模的数据无从下手、不知道如何应用。数据量的激增对计算速度提 出了更高的要求。

分布式这一概念在当下早已不新鲜。从21世纪初互联网的大规模崛起,分布式就成为了现在海量数据计 算的基石。如果你的个人计算机的中央处理器(CPU)是多核的话,那么你就已经在使用分布式计算的 一个特例了——并行计算。把一个复杂的任务分割成若干小任务,分配给不同的计算核心同时计算,以达 到省时高效的目的,这就是分布式计算技术的核心理念。

1.1 分布式计算与并行计算

并行计算(parallel computing)是一个通常用于高性能计算(HPC)领域的术语。它具体指的是使用 多个处理器执行计算或模拟。超级计算机是为执行并行计算而设计的。这些系统不一定有共享内存。并 行系统使用MPI这样的工具将在超级计算机或者集群机器上的计算资源调度并实现多任务的同步计算。 并行计算在许多计算软件中都集成了一些基本的实现途径。比如R中的自带parallel包,Python标准 库中的multiprocessing是一个用与 threading 模块相似API的支持产生进程的包。这些程序模块允 许程序员充分利用机器上的多个核心。Unix 和 Windows 上都可以运行。结合OpenMP(Open Multi-Processing)等支持跨平台共享内存方式的多线程并发的编程API,使用现有编程语言可以在大 多数的处理器体系和操作系统中运行并行计算任务。具有并行计算能力的高性能计算平台往往被应用在 很多特定的科学领域,如超级计算机,密码破译,生物医学。

分布式计算(distributed computing)实际上是一个比并行计算更笼统的术语。人们可以将分布式计 算与并行计算的意义等同于并行计算,分布式特指的是将计算分布在许多不同的计算机之间。然而,分 布式计算处理的是并发性以外的其他方面。分布式计算具有并行计算所不具有的一些特性,包括计算一 致性、计算高可用性和高容错性能等。此外现在分布式计算平台的计算成本更低。像本书涉及到的 Hadoop或Spark这样的系统都是分布式计算系统,它们都有处理节点和网络故障的能力。不过,这两种 系统也都是为了执行并行计算而设计的。与MPI等HPC系统不同,这类新型系统即使其中一个计算节点出 现故障,也能继续进行海量计算。分布式计算主要应用在数据科学领域,如互联网、物联网、车联网、 数字金融。

在现代数据科学浪潮的冲击下,利用低成本硬件实现大规模分布式计算成为大数据应用的主流方向。世 界上各大数据科学公司都把分布式计算作为数据科学的核心技术与产品。最为大家熟知的有如亚马逊、 阿里巴巴各大云平台。在数据科学的应用中催生了大量分布式计算的优秀工具,如Hadoop, HDFS, Hive, Spark, Storm。

1.2 现代海量数据的存储方式

分布式计算需求的的另外一个原因是现代数据的分布式存储方式造成的。简单来说,就是存储设备分布 在不同的地理位置,数据就近存储,将数据分散在多个存储节点上,各个节点通过网络相连,对这些节 点的资源进行统一的管理,从而大大缓解带宽压力,同时也解决了传统的本地文件系统在文件大小、文 件数量等方面的限制。分布式存储的诞生有着很强的优越性,主要体现在灵活性、速度、成本等方面。

分布式存储系统使用强大的标准服务器(在CPU,RAM以及网络连接/接口中),它不再需要专门的盒子 来处理存储功能。而且允许标准服务器运行存储,这是一项重大突破,这意味着简化IT堆栈并为数据中 心创建单个构建块。通过添加更多服务器进行扩展,从而线性地增加容量和性能。

一个专门的存储服务器本质上是一个服务器,但是他只能用于存储,为了拥有快速存储系统,你要花费 的成本非常高。即使在今天大多数系统中,当你为存储系统进行扩展时,也不会提高整个系统的性能, 因为所有流量都必须通过“头节点”或主服务器(充当管理节点)。

但是在分布式存储系统中,任何服务器都有CPU,RAM,驱动器和网络接口,它们都表现为一个组。因此, 每次添加服务器时,都会增加总资源池,从而提高整个系统的速度。成本方面:分布式存储组织将最大 限度地降低基础设施成本高达90%!没错,是90%,因为驱动器和网络所花费的成本非常低,极大的提 高了服务器的使用效率,同时,数据中心所花费的电力、空调费、所占空间等费用也减少了,管理起来 更加方面,所需要的人也更少。这也是为什么如今各大公司都在部署分布式存储。

1.3 分布式计算挑战

不论是并行计算还是分布式计算,在数据科学进化浪潮中,软件扮演着非常积极的角色。分布式程序要 比串行程序难写得多,因为要把程序分割成几个子程序,而且需要子程序之间的同步与高效通信是非常 困难的事情。

在分布式计算发展之前,一些并行程序的标准已经成型。对于MPP和集群系统来说,在20世纪90年代中 期,一些应用程序接口就整合为一个统一标准,称之为MPI(Multi Point Interface)。对于共享内存 式的并行计算系统,在90年代后期也形成了两个标准:pthreads和OpenMP。在数据挖掘中常用的程序设 计语言和一些应用,比如C,Python以及R都不是并行语言,但是利用一些已有的程序接口且使用并行算 法,可以大大提高计算效率。

然而,并行计算并不是解决计算速度的万能药,并行计算机发展目前还存在很多问题。首先,计算机的 存储器访问速度与计算速度不平衡。处理器速度每年约提高60%,然而存储器的访问速度每年却只能提 高约9%。这使得处理器经常“空转”,数据传输跟不上。利用高速缓存等方式虽然在一定程度上可以缓解 数据传输问题,但是由于其容量有限,加上高昂的费用,使其难以得到广泛应用。其次,并行计算机的 规模越来越大,结构也越来越复杂,不同并行计算机结构各异,处理器数目数以万计,数据存储方式、 通信模式迥异,同构异构并存,这使得为超级计算机编写程序变得更加困难。另外,并行计算机耗能极 大,“天河二号”每年花掉的电费高达亿元人民币!超级计算机占地面积庞大、功耗高,并不能够广泛地 使用。