1.4 经典分布式计算系统
1.4.1 WWW
如图1-16所示,WWW是目前为止最大的分布式系统,WWW是环球信息网(World Wide Web)的缩写,中文名称为“万维网”“环球网”等,通常被简称为Web。它是一个由许多互相链接的超文本组成的系统,通过互联网访问。在该系统中,每个有用的事物都被称为一种“资源”,并且由一个全局的统一资源标识符(Uniform Resource Identifier,URI)标识。这些资源通过超文本传输协议(Hypertext Transfer Protocol,HTTP)传送给用户,而用户通过点击链接来获得资源。万维网并不等同于互联网,万维网只是互联网所能提供的服务之一,是依靠互联网运行的一项服务。
图1-16 WWW系统示意图
WWW是建立在客户机/服务器模型之上的,以超文本标注语言(标准通用标记语言下的一个应用)与超文本传输协议为基础,能够提供面向Internet服务的、一致的用户界面的信息浏览系统。其中WWW服务器采用超文本链路来链接信息页,这些信息页既可放置在同一个主机上,也可放置在不同地理位置的主机上。超文本链路由统一资源定位器(URL)维持,WWW客户端软件(即WWW浏览器)负责信息显示与向服务器发送请求。
1.4.2 SETI@home
SETI@home(Search for Extra Terrestrial Intelligence at home,寻找外星人)是一个利用全球联网的计算机共同搜寻地外文明的项目,本质上是一个由互联网上的多台计算机组成的处理天文数据的分布式计算系统。SETI@home由美国加州大学伯克利分校的空间科学实验室开发,它试图通过分析阿雷西博射电望远镜采集的无线电信号,搜寻能够证实地外智能生物存在的证据,该项目的参考网站为http://setiathome.berkeley. edu。
SETI@home是目前因特网上参加人数最多的分布式计算项目。如图1-17所示,在用户的个人计算机上,SETI@home程序通常在屏幕保护模式下或在后台运行。它利用的是多余的处理器资源,不影响用户正常使用计算机。SETI@home项目自1999年5月17日开始正式运行。至2004年5月,累计进行了近5×1021次浮点运算,处理了超过13亿个数据单元。截至2005年关闭之前,它吸引了543万用户,这些用户的计算机累计工作243万年,分析了大量积压数据,但是该项目没有发现外星文明的直接证据。SETI@home是迄今为止最成功的分布式计算试验项目。
图1-17 SETI@home系统客户端
1.4.3 BOINC
BOINC是Berkeley Open Infrastructure for Network Computing的首字母缩写,即伯克利开放式网络计算平台,是由美国加州大学伯克利分校于2003年开发的一个利用互联网计算机资源进行分布式计算的软件平台。BOINC最早是为了支持SETI@home项目而开发的,之后逐渐成为主流的分布式计算平台,用于众多的数学、物理、化学、生命科学、地球科学等学科类别的项目。如图1-18所示,BOINC平台采用传统的客户机-服务器构架:服务器部署于计算项目方的服务器,一般由数据库服务器、数据服务器、调度服务器和Web门户组成;客户机部署于志愿者的参与计算机节点,一般由分布在网络上的多个用户计算机组成,负责完成服务端分发的计算任务。客户机与服务器之间通过标准的互联网协议进行通信,实现分布式计算。
图1-18 BOINC平台的体系结构
BOINC是当前最为流行的分布式计算平台,提供了统一的前端和后端架构,一方面大大简化了分布式计算项目的开发,另一方面,对参加分布式计算的志愿者来说,参与多个项目的难度也大大降低。目前已经有超过50个基于BOINC平台的分布式计算项目,BOINC平台上的主流项目包括SETI@home、Einstein@Home、World Community Grid等。有关详细信息,请参考该项目网站http://boinc.ssl.berkeley.edu/。
1.4.4 OpenStack
OpenStack是一个开源的云计算管理平台项目,目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenStack是当前活跃的基础云实现软件,是一种可用的开源云计算解决方案,是一个构建云环境的工具集,基于OpenStack可以搭建私有云或公有云。从其名称中的Open可以看出其开源的理念、开放式的开发模式,从其名称中的Stack可以理解它是由一系列相互独立的子项目组合而成,协同合作完成某些工作。同时,OpenStack也是一个十分“年轻”的开源项目,2010年7月,NASA(美国国家航空航天局)联手Rackspace在建设NASA私有云的过程中基于Apache 2.0开源模式创建了OpenStack项目。
OpenStack本身是一个分布式系统,不但可以分布式部署各个服务,也可以分布式部署服务中的组件。这种分布式特性让OpenStack具备极大的灵活性、伸缩性和高可用性。OpenStack项目并不是单一的服务,其含有子组件,子组件内由模块来实现各自的功能。通过消息队列和数据库,各个组件可以互相调用、互相通信。这样的消息传递方式解耦了组件、项目之间的依赖关系,所以才能灵活地满足实际环境的需要,组合出合适的架构。
如图1-19所示,OpenStack包含许多组件。有些组件会首先出现在孵化项目中,待成熟后进入下一个OpenStack发行版的核心服务中,同时,也有部分项目是为了更好地支持OpenStack社区和项目开发管理,不包含在发行版代码中。OpenStack主要组件如下。
●Nova:提供计算服务。
●Keystone:提供认证服务。
●Glance:提供镜像服务。
●Quantum:提供仪表盘服务。
●Horizon:提供仪表盘服务。
●Swift:提供对象存储服务。
●Cinder:提供块存储服务。
●Heat:提供编排服务。
●Ceilometer:提供计费和监控服务。
●Trove:提供数据库服务。
●Sahara:提供数据处理服务。
图1-19 OpenStack的总体架构
1.4.5 Hadoop
Hadoop是一个由Apache基金会开发的分布式系统基础架构。Hadoop起源于开源网络搜索引擎Apache Nutch,2003年和2004年,谷歌分别发表论文描述了谷歌分布式文件系统GFS和分布式数据处理系统MapReduce。基于这两篇论文,Nutch的开发者开始着手开源版本的实现,实现了Hadoop系统的核心——分布式文件存储系统HDFS和分布式计算框架MapReduce。2006年,开发人员将HDFS和MapReduce移出Nutch,至此,用于数据存储和分析的分布式系统Hadoop诞生了。目前,Hadoop在工业界得到了广泛应用,包括EMC、IBM、Microsoft在内的国际公司都在直接或间接地使用包含Hadoop的系统,Hadoop成为公认的大数据通用存储和分析平台。Hadoop经过十多年的发展,形成了一个完整的分布式系统生态圈。如图1-20所示,Hadoop分布式系统包括核心的分布式文件存储系统HDFS和分布式计算框架MapReduce,以及用于集群资源管理的YARN。
图1-20 Hadoop的总体架构
Hadoop生态圈支持在用户不了解分布式底层细节的情况下,帮助用户开发分布式应用。Hadoop生态圈中有很多工具和框架,下面对几种典型应用进行介绍。
●Hadoop生态圈包括数据仓库Hive,这是一种可以存储、查询和分析存储在HDFS中的数据的工具。
●HBase是基于HDFS开发的面向列的分布式数据库,如果需要实时地随机访问超大规模数据集,就可以使用HBase。
●Pig为大型数据集的处理提供了更高层次的抽象,使用户可以使用更为丰富的数据结构,在MapReduce程序中进行数据变换操作。
●ZooKeeper为Hadoop提供了分布式协调服务,使集群具有更高的容错性。
接下来介绍Hadoop中用于数据存储的HDFS和HBase的分布式架构,以及用于集群资源管理的分布式管理器YARN。
如图1-21所示,HDFS集群按照管理节点-工作节点模式运行,其中NameNode为管理节点,DataNode为工作节点,SecondaryNameNode为辅助NameNode。NameNode与DataNode之间是一对多的关系。同时,HDFS通过心跳机制、负载均衡和DataNode替换策略等手段来保证可用性和高可靠性。其中:NameNode负责管理数据块映射、处理客户端的读写请求、配置副本策略、管理HDFS的名称空间;DataNode负责存储Client发来的数据块(block)、执行数据块的读写操作;SecondaryNameNode作为NameNode备份节点,分担NameNode的工作量,同时对NameNode进行冷备份。
图1-21 HDFS的分布式体系结构
如图1-22所示,HBase是一个在HDFS上开发的面向列的分布式数据库,服务依赖于ZooKeeper。HBase的分布式结构与HDFS相似,它用一个Master节点协调管理一个或多个Regionserver从属机。
●Master节点负责启动一个全新的安装、把区域分配给注册的Regionserver、恢复Regionserver的故障等,值得一提的是,Master的负载很低。
●Regionserver负责零个或多个区域的管理以及响应客户端的读写请求,同时负责区域划分。
●ZooKeeper集群负责管理hbase:meta目录表的位置以及当前集群主控机地址等重要信息。如果有服务器崩溃,ZooKeeper还能进行分配协调。
●Client包含访问HBase的接口,维护一些Cache来加快对HBase的访问。
图1-22 HBase分布式体系结构
图1-23是YARN(Yet Another Resource Negotiator)的分布式体系结构示意图。YARN是Hadoop的集群资源管理系统,随Hadoop 2.x一起发行,起初是为了改善MapReduce的性能而设计的,但现在YARN因其良好的通用性同样可以支持Spark、Tez等分布式计算框架。其中:Resource Manager是一个全局的资源管理器,管理整个集群的计算资源,并将这些资源分配给应用程序;Application Manager是应用程序级别的管理器,管理运行在YARN上的应用程序;Node Manager是YARN中每个节点上的代理管理器,管理Hadoop集群中的单个计算节点。
图1-23 YARN的分布式体系结构
1.4.6 Spark
Spark是一个快速、通用的大规模数据处理与计算框架,于2009年由Matei Zaharia在加州大学伯克利分校的AMPLab进行博士研究期间提出。与传统的数据处理框架不一样,Spark通过在内存中缓存数据集以及启动并行计算任务时的低延迟和低系统开销来实现高性能,能够为一些应用程序带来100倍的性能提升。Spark目前支持Java、Scala、Python和R等编程语言的接口供用户进行调度。
Spark的核心是建立在统一的抽象弹性分布式数据集(Resilient Distributed Datasets,RDD)基础上的,RDD允许开发人员在大型集群上执行基于内存的计算,同时屏蔽了Spark底层对数据的复杂抽象和处理,为用户提供了一系列方便、灵活的数据转换与求值方法。
为了针对不同的运算场景,Spark专门设计了不同的模块组件来提供支持,如图1-24所示。
●Spark SQL:Spark SQL是Spark中用于处理结构化数据的组件。
●Spark Streaming:Spark Streaming是Spark中用于处理实时流数据的组件。
●MLlib:MLlib是Spark中集成了常见的机器学习模型的组件,包括SVM、逻辑斯蒂回归、随机森林等模型。
●GraphX:GraphX是Spark提供图计算和并行图计算功能的组件。
图1-24 Spark软件栈
作为一个开源集群运算框架,Spark共支持4种集群运行模式:Standalone、基于Apahce Mesos、基于Hadoop YARN以及基于Kubernetes。Spark的整体架构如图1-25所示。每个Spark应用由驱动器程序(driver program)来发起各种并行操作,并通过其中的SparkContext对象进行协调。同时,SparkContext对象可以连接上述各种集群管理器,然后对连接的集群管理器进行整体的资源调度。连接成功之后,Spark会对工作节点中的执行器(executor)进行管理,将应用代码及相关资料信息发送到执行器,最终将任务(task)分配到每个执行器中执行。
图1-25 Spark整体架构
在过去的几年中,Spark发展极其迅猛,它一直在促进着Hadoop和大数据生态系统的演变,以便更好地支持当今大时代下的大数据分析需求。可以看到,Spark正在以前所未有的力量帮助广大的开发者、数据科学家以及企业更好地应对大数据处理方面的挑战。
1.4.7 Kubernetes
Kubernetes简称K8s,是一个全新的基于容器技术的分布式架构领先方案。Kubernetes是谷歌Borg系统的开源版本。Kubernetes基于容器技术,目的是实现资源管理的自动化,以及跨多个数据中心的资源利用率的最大化。Kubernetes是一个完备的分布式系统支撑平台,它具有完备的集群管理能力、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力,以及多粒度的资源配额管理能力。与此同时,Kubernetes还提供了完善的管理工具,这些工具涵盖开发、部署测试、运维监控在内的各个环节。因此,Kubernetes是一个全新的基于容器技术的分布式架构解决方案,并且是一个一站式的完备的分布式系统开发和支撑平台。
如图1-26所示,Kubernetes将集群中的机器划分为一个Master节点和多个工作节点(Node)。其中,在Master节点上运行着与集群管理相关的一组进程kube-apiserver、kube-controller-manager和kube-scheduler,这些进程实现了整个集群的资源管理、Pod调度、弹性伸缩、安全控制、系统监控和纠错等管理功能,并且都是自动完成的。Node作为集群中的工作节点,运行真正的应用程序,在Node上Kubernetes管理的最小运行单元是Pod。Node上运行着Kubernetes的kubelet、kube-proxy服务进程,这些服务进程负责Pod的创建、启动、监控、重启、销毁,以及实现软件模式的负载均衡器。
图1-26 Kubernetes架构图
1.4.8 其他分布式计算系统
除了以上经典的分布式系统外,还有很多其他分布式计算项目,它们通过分布式计算来构建分布式系统并实现特定项目目标。
●Climateprediction.net:模拟百年以来的全球气象变化,并计算未来地球气象,以对付未来可能遭遇的灾害性天气。
●Quake-Catcher Network:借助笔记本计算机中内置的加速度计,以及一个简易的小型USB微机电强震仪(传感器),创建一个大的强震观测网。可用于地震的实时警报或防灾、减灾等相关的应用。
●World Community Grid:帮助查找人类疾病的治疗方法和改善人类生活的相关公益研究,包括艾滋病、癌症、流感病毒等疾病及水资源复育、太阳能技术、水稻品种的研究等。
●Einstein@Home:2005年开始的项目,目的是找出脉冲星的引力波,验证爱因斯坦的相对论预测。
●FightAIDS@home:研究艾滋病的生理原理和相关药物。
●Folding@home:了解蛋白质折叠、聚合以及相关疾病。
●GIMPS:寻找新的梅森素数。
●Distributed.net:2002年10月7日,以破解加密术而著称的Distributed.net宣布,在经过全球33.1万名计算机高手共同参与并苦心研究4年之后,已于2002年9月中旬破解了以研究加密算法而著称的美国RSA数据安全实验室开发的64位密匙——RC5-64密匙。
上述分布式计算项目或系统只是其中部分经典系统,随着互联网的飞速发展,近年来涌现出很多著名的系统与项目,读者可以查阅相关论文和技术文档以深入学习其技术原理。下面列出分布式系统领域一些经典的系统(论文),供大家学习参考。
1)The Google File System。这是分布式文件系统领域具有划时代意义的论文,文中的多副本机制、控制流与数据流隔离和追加写模式等概念几乎成为分布式文件系统领域的标准,Apache Hadoop的HDFS就是GFS的模仿之作。
2)MapReduce:Simplified Data Processing on Large Clusters。这篇论文也来自Google,通过Map和Reduce两个操作大大简化了分布式计算的复杂度,使任何需要的程序员都可以编写分布式计算程序,其中用到的技术值得我们好好学习。Hadoop也根据这篇论文做了一个开源的MapReduce。
3)BigTable:A Distributed Storage System for Structured Data。Google在NoSQL领域的分布式表格系统,LSM树的最好使用范例,广泛用到了网页索引存储、YouTube数据管理等业务,Hadoop对应的开源系统为HBase。
4)The Chubby lock service for loosely-coupled distributed systems。Google的分布式锁服务,基于Paxos协议,这篇文章相比于前三篇可能知道的人较少,但是其对应的开源系统ZooKeeper几乎每个后端程序员都接触过,其影响力其实不亚于前3个系统。
5)Finding a Needle in Haystack:Facebook's Photo Storage。Facebook的在线图片存储系统,目前来看是对小文件存储的最好解决方案之一,Facebook目前通过该系统存储了超过300PB的数据。
6)Windows Azure Storage:a highly available cloud storage service with strong consistency。关于Windows Azure的总体介绍文章,是一篇很好的描述云存储架构的论文,其中通过分层来同时保证可用性和一致性的思路在现实工作中也给了我们很多启发。
7)GraphLab:A New Framework for Parallel Machine Learning。CMU基于图计算的分布式机器学习框架,目前已经成立了专门的商业公司,在分布式机器学习方面成绩显著,其单机版的GraphChi处理百万维度的矩阵分解只需要2~3min。
8)Resilient Distributed Datasets:A Fault-Tolerant Abstraction for In-Memory Cluster Computing。其实就是Spark——目前流行的内存计算模式,通过RDD和lineage大大简化了分布式计算框架,通常几行scala代码就可以解决原来上千行MapReduce代码才能搞定的问题,大有取代MapReduce的趋势。
9)Scaling Distributed Machine Learning with the Parameter Server。百度李沐的大作,目前在大规模分布式学习方面,各家公司主要都是使用ps,ps具备良好的可扩展性,使得大数据时代的大规模分布式学习成为可能,Google的深度学习模型也是通过ps训练实现的,是目前最流行的分布式学习框架,豆瓣的开源系统paracell也是ps的一个实现。
10)Dremel:Interactive Analysis of Web-Scale Datasets。Google的大规模(近)实时数据分析系统,号称可以在3s内响应1PB数据的分析请求,内部使用查询树来优化分析速度,其开源实现为Drill,在工业界实时数据分析方面也比较有影响力。
11)Pregel:a system for large-scale graph processing。Google的大规模图计算系统,相当长一段时间是Google PageRank的主要计算系统,对开源的影响也很大(包括GraphLab和GraphChi)。
12)Spanner:Google's Globally-Distributed Database。这是第一个全球意义上的分布式数据库。其中介绍了很多一致性方面的设计考虑,简单起见,还采用了GPS和原子钟来确保时间最大误差在20ns以内,保证了事务的时间序,同样在分布式系统方面具有很强的借鉴意义。
13)Dynamo:Amazon's Highly Available Key-value Store。Amazon的分布式NoSQL数据库,作用相当于BigTable对于Google,与BigTable不同的是,Dynamo保证CAP中的AP,C(一致性)通过vector clock保证,对应的开源系统为Cassandra。
14)S4:Distributed Stream Computing Platform。Yahoo出品的流式计算系统,目前最流行的两大流式计算系统之一,Yahoo的主要广告计算平台。
15)Storm @Twitter。Storm起源于Twitter开源的一个类似于Hadoop的实时数据处理框架,Hadoop是批量处理数据,而Storm处理的是实时数据流。Storm开启了流式计算的新纪元,是很多公司实现流式计算的首选。