天天看点

基于Google MapReduce, Google FileSystem和BigTable三篇论文的读后总结

MapReduce

MapReduce是ApacheHadoop的心脏。它是一个编程范例,支持跨Hadoop集群中的数百或数千个服务器的大规模可伸缩性。对于熟悉集群扩展数据处理解决方案的人来说,MapReduce概念相当容易理解。对于我自己,一个刚接触这个话题的人来说,很难掌握,因为它不是我以前接触过的典型内容。所以我在网上查询了一些我自己能够明白的描述方式,主要是基于英文的描述。以下大部分为在我的理解下,对它的中文解释和翻译。

术语“MapReduce”实际上指的是Hadoop程序执行的两个独立和不同的任务。第一个是map作业,它获取一组数据并将其转换为另一组数据,其中单个元素被分解为元组(键/值对)。Reduce作业将映射的输出作为输入,并将这些数据元组组合为一组较小的元组。正如名称MapReduce的序列所示,Reduce作业总是在Map作业之后执行。

有一个我在网上找到的关于MapReduce的一个简单的例子。假设有五个文件,每个文件包含两列(键和Hadoop术语中的值),它们代表一个城市以及该城市中记录的各个测量日的相应温度。当然,真正的应用程序不会非常简单,因为它可能包含数百万甚至数十亿行,而且它们可能根本不是格式整齐的行;实际上,不管需要分析的数据量多大或多小,这里要介绍的关键原则是什么保持不变。在这个例子中,城市是关键,温度就是价值。多伦多,20;惠特比,25;纽约,22;罗马,32;多伦多,4;罗马,33;纽约,18。在我们收集的所有数据中,我们希望在所有数据文件中找到每个城市的最高温度(注意,每个文件可能多次表示相同的城市)。使用MapReduce框架,我们可以将其分解成五个映射任务,其中每个映射器处理五个文件中的一个文件,映射器任务遍历数据并返回每个城市的最高温度。例如,上面数据的一个映射器任务产生的结果如下所示:(多伦多,20)(惠特比,25)(纽约,22)(罗马,33)让我们假设其他四个映射器任务(处理这里未显示的其他四个文件)产生以下中间结果:(多伦多,18)(惠特比,27)(纽约,32)(罗马,32)(多伦多,32)(惠特比,20)(纽约,33)(罗马,38)(多伦多,22)(惠特比,19)(纽约,20)(罗马,31)(多伦多,31)(惠特比,22)(纽约,19)(罗马,30)所有这些输出流都将被输入到reduce任务中,其中组合了输入结果和d为每个城市输出一个值,产生一个最终结果集如下:(多伦多,32)(惠特比,27)(纽约,33)(罗马,38)作为一个类比,可以把地图和减少任务看作在罗马时代进行人口普查的方式,人口普查局将向每个城市派遣人员。每个城市的每个人口普查人员都被要求计算该城市的人口数量,然后将结果返回首都。在那里,每个城市的结果将减少到一个单一的计数(所有城市的总和),以确定帝国的总人口。这种将人平行地映射到城市,然后组合结果(减少)的映射比发送单个人以串行方式计算帝国中的每个人的效率要高得多。

Google File System

谷歌是一家价值数十亿美元的公司。它是万维网之外的大功率播放器之一。公司依靠分布式计算系统为用户提供访问、创建和改变数据所需的基础设施。谷歌使用GFS来组织和操作巨大的文件,并允许应用开发者开发他们所需要的研究和开发资源。GFS是谷歌独有的,不出售。但它可以作为类似需求的组织的文件系统模型。一些GFS细节对谷歌以外的任何人来说仍然是个谜。例如,Google没有透露它使用多少台计算机来操作GFS。在Google的官方文件中,Google只说系统中有“数千”台计算机。但是,尽管有这种保密的面纱,谷歌已经充分利用了GFS的结构和运营的公众知识。

Google开发人员通常使用传统的计算机文件系统处理难以操作的大型文件。文件的大小促使程序员为GFS的设计做出许多决定。另一个大问题是可伸缩性,它指的是增加系统容量的容易程度。如果系统易于增加系统的容量,系统是可扩展的。系统的性能不应该随着它的增长而受到影响。Google需要一个非常大的计算机网络来处理它的所有文件,因此可伸缩性是一个首要问题。

由于网络如此庞大,监测和维护它是一项具有挑战性的任务。在开发GFS时,程序员决定尽可能多地自动化系统运行所需的管理任务。这是自主计算的一个关键原理,在这个概念中,计算机能够诊断问题并实时地解决问题,而不需要人工干预。GFS团队面临的挑战不仅是创建一个自动监控系统,而且还要设计它以便它能够跨巨大的计算机网络工作。

团队设计的关键是简化概念。他们得出的结论是,随着系统越来越复杂,问题也越来越多。即使系统的规模很大,简单的方法也更容易控制。基于这种理念,GFS团队决定用户可以访问基本的文件命令。这些命令包括打开、创建、读取、写入和关闭文件等命令。这个团队还包含了一些专门的命令:追加和快照。他们根据谷歌的需求创建了专门的命令。Append允许客户机向现有文件添加信息,而不用覆盖之前编写的数据。快照是一种创建计算机内容的快速复制的命令。

GFS上的文件往往非常大,通常在几千兆字节(GB)范围内。访问和操作大的文件将占用网络的大量带宽。带宽是系统将数据从一个位置移动到另一个位置的能力。GFS通过将文件分成每块64兆字节(MB)来解决这个问题。每个块接收一个称为块句柄的唯一64位标识号。虽然GFS可以处理较小的文件,但是它的开发人员没有为这些类型的任务优化系统。通过要求所有文件块大小相同,GFS简化了资源应用程序。很容易看出系统中哪些计算机接近容量,哪些计算机使用不足。将块从一个资源移植到另一个资源也很容易平衡整个系统的工作负载。

谷歌将GFS组织成计算机集群。集群只是一个计算机网络。每个集群可能包含成百上千的机器。在GFS集群中有三种实体:客户端、主服务器和块服务器。在GFS世界中,术语“客户端”指的是进行文件请求的任何实体。请求的范围从检索和操作现有文件到在系统上创建新文件。客户端可以是其他计算机或计算机应用程序。你可以把客户看作GFS的客户。主服务器充当集群的协调器。主服务器的职责包括维护操作日志,该日志跟踪主服务器集群的活动。操作日志有助于将服务中断保持在最小限度——如果主服务器崩溃,可以替换监视操作日志的服务器。主服务器还跟踪元数据,元数据是描述块的信息。元数据告诉主服务器这些块属于哪些文件,以及它们在整个文件内的位置。启动后,主机轮询集群中的所有组块。组块服务器通过告诉主服务器它们的库存内容来响应。从那时起,主服务器就跟踪集群中块的位置。在任何时候,每个集群只有一个活动主服务器(尽管在硬件故障的情况下,每个集群都有主服务器的多个副本)。这听起来像是解决瓶颈的好方法——毕竟,如果只有一台机器协调成千上万台计算机的集群,那不会导致数据通信堵塞吗?GFS通过将主服务器发送和接收的消息保持在非常小的范围来避免这种棘手的情况。主服务器根本不处理文件数据。这就留给了服务器。

CuCKServer是GFS的工作母马。它们负责存储64-MB文件块。CuxServer不向主服务器发送块。相反,它们直接向客户端发送请求的块。GFS将每个块复制多次,并将其存储在不同的块服务器上。每个副本被称为副本。默认情况下,GFS为每个块创建三个副本,但是用户可以更改设置,如果需要,可以创建更多或更少的副本。

BigTable

BigTable是一个分布式存储系统,其结构为一个大表:一个大小为PB,分布在几万台机器中的表。它被设计用于存储诸如数十亿个URL之类的条目,每个页面具有多个版本;超过100TB的卫星图像数据;数以亿计的用户;以及每秒执行数千次查询。BigTable是在Google开发的,自2005年以来,它已经在许多Google服务中使用。Apache项目在Hadoop核心之上创建了一个开源版本HBase。Apache Cassandra,最初是在Facebook上开发的,为搜索引擎提供动力,类似于BigTable,它具有可调的一致性模型,没有主服务器(中央服务器)。

BigTabe是用半结构化数据存储设计的。它是由行键、列键和时间戳索引的大地图。映射中的每个值都是由应用程序解释的字节数组。对行的每次读或写数据都是原子性的,而不管在该行中读或写多少不同的列。很容易画出一张简单的表格。

我了解到了BigTabe的几个特性:

1)map

映射是一个关联数组;一种允许快速查找对应键值的数据结构。BigTable是(key,value)对的集合,其中键标识行,值是一组列。

2)persistant

数据存储在磁盘上。

3)distributed

BigTable的数据分布在许多独立的机器中。在谷歌中,BigTabe是在GFS(谷歌文件系统)之上构建的。Apache开源版本的BigTable

HBase构建在HDFS(Hadoop分布式文件系统)或Amazon S3之上。该表在行之间划分,由服务器管理相邻行的组。行本身从不分布。

4)sparse

该表是稀疏的,这意味着表中不同的行可以使用不同的列,对于特定行,许多列是空的。

5)sorted

大多数关联数组不排序。一个密钥被散列到一个表中的一个位置。BigTabl通过键对数据进行排序。这有助于将相关数据紧密地放在一起,通常在同一台机器上——假设一个结构键以这种方式排序将数据聚集在一起。例如,如果将域名用作BigTable中的键,则将它们反向存储,以确保相关域紧密地结合在一起是有意义的。例如:

edu.rutgers.cs
edu.rutgers.nb
edu.rutgers.www
           

6)multidimensional

表是按行索引的。每行包含一个或多个命名列族。在创建表时定义列族。在一个列族中,可以有一个或多个命名列。列族中的所有数据通常是相同类型的。BigTable的实现通常将列家族中的所有列压缩在一起。列族中的列可以即时创建。行、列族和列在识别数据方面提供了三级命名层次结构。例如:

edu.rutgers.cs" : {  // row
  "users" : {  // column family
   "watrous": "Donald",  // column
   "hedrick": "Charles",  // column
   "pxk" : "Paul"   // column
  }
  "sysinfo" : {   // another column family
   "" : "SunOS 5.8"  // column (null name)
  }
 }

           

要从BigTable获取数据,需要在表单column-.:column中提供完全限定的名称。例如,用户:PXK或SysNFO:。后者显示空列名称。

7)time-based

时间是BigTABLE数据的另一个维度。每个列族可以保留列族数据的多个版本。如果应用程序没有指定时间戳,它将检索列族的最新版本。或者,它可以指定一个时间戳,并获得早于或等于该时间戳的最新版本。