跳转到主要内容
Chinese, Simplified

分布式计算框架的目标是为开发人员提供抽象,允许他们在将它们视为统一池时使用大量资源。该框架将提供一个协议来处理节点上的数据和任务分布,以及容错问题,例如重新启动失败的任务(无论是来自任务还是来自节点)。该框架不了解底层拓扑,必须应对基础架构演变。诸如MapReduce和Spark之类的流行框架还提供了一种编程模型,该模型允许将大型数据集推理为统一部分(位置透明性),并将其逻辑地分割为由群集节点独立处理的多个组件。数据集本身通常存储在分布式文件系统上,在处理任务的同一节点上;开发人员可以控制其分区,并创建一个应用于每个部分的计算管道。

MPI

消息传递接口是一种独立于语言的标准,允许程序与系统中的其他元素进行通信。 MPI在分布式计算系统中提供基本构建块,即允许程序访问计算机或远程机器中的分布式存储器的消息传递协议。但是,它需要用户在她的代码中实现消息传递,其中更高级别的框架(如Spark和Hadoop)可以透明地处理。结果是用户必须更多地了解底层基础架构,从而分散他们对程序的注意力。 MPI通常被归类为高性能计算(HPC)框架,而不是分布式计算框架,但它与后者共享许多属性。

Hadoop

Apache Hadoop是MapReduce论文的开源实现[1],该论文于2004年首次在OSDI上发布。该项目由Doug Cutting和Mike Cafarella于2006年开始,受雇于雅虎!当时。 Apache发行版的第一个正式版本于2011年发布。

Hadoop由三个主要构建块组成:分布式文件系统,HDFS(Google File System的开源实现[2]),MapReduce API和YARN [3],即调度程序。

MapReduce编程模型来自函数式编程:用户可以将函数应用(映射)到一组独立的数据段,然后聚合中间结果(reduce)。一个典型的例子是WordCount的实现,其中用户想要知道语料库中每个单词的出现次数。首先,文本被分成一定数量的分区,每个分区被映射到一个功能,该功能在其分配的分区中操作本地字数。然后,一旦完成map(),所有单独的中间结果将在reduce()阶段中连接和合并。

通常,Hadoop的Map Reduce实现将数据存储在HDFS中,这可确保有足够数量的块可用并传播到整个群集中。 YARN实现了一种称为延迟调度的技术[4],它试图通过降低网络I / O的成本来最大化数据局部性以增强性能。我们将在本章后面讨论进一步的数据局部性和延迟调度。

HDFS体系结构是主/从范例,其中主服务器保存有关数据放置和授权的所有信息,而从服务器存储数据块并定期向主服务器报告状态。为了确保容错和可用性,每个从站都有指定数量的副本(默认为3个),这些副本位于不同的物理位置,以增强其对物理故障的恢复能力。为了确保一致性,每组副本都有一个主副本,它验证(或拒绝)一段数据上的一系列突变。执行一组突变会使数据定义,这意味着该版本被确认为最终版本。

Spark

Apache Spark [5]属于新一代分布式计算框架。 Spark背后的一个关键动机是通过在内存计算中执行来增强迭代工作负载性能。原始Hadoop实现对于那些工作负载来说是非常低效的,主要是由于对将应用程序运送到其末端所需的大量磁盘访问。 Spark做了两个主要的贡献来解决这个问题:首先它引入了一种新型的数据结构,称为Resilient Distributed Dataset [6],它在内存计算中起着重要作用;第二,它提出了一个丰富的软件架构,可以轻松创建适用于各种类别的分布式计算程序,例如图形处理,机器学习和流媒体。

RDD是不可变的数据集合,用户可以从初始存储(HDFS,远程对象存储,本地文件等)创建数据,并通过转换进行修改。在某些时候,用户可以通过收集方法收集由这种转换生成的新数据。 RDD允许实现MapReduce模型的精炼版本,丰富各种可能的用户定义函数,并允许它们在数据集上创建真实的计算管道。 RDD是懒惰计算的,这意味着只有当用户想要收集数据时,才会应用转换。每个RDD都有一个谱系,这意味着应用于数据集初始切片的操作序列是已知和记录的。 Spark中的任务是对RDD的操作。每个操作在RDD的分区上,并且任务之间的关系是并发的或依赖的。任务(转换或集合)的本质定义了两种类型的依赖:narrow和wide。窄依赖性通常是RDD上两个连续map()函数的结果。广泛的依赖性通常会导致混乱,这意味着中间数据必须通过集群移动才能减少()。

在编译时,Spark分析应用于程序中RDD的操作,并生成有向非循环图。它试图在一个阶段中包含尽可能多的窄依赖关系,并且通常将广泛依赖关系的两端放入不同的阶段。优选地,通过称为延迟调度的技术将任务分配给持有所需数据的工作人员。它允许任务在不保存所需数据的情况下拒绝工人的报价。配置了不同的位置级别,节点,机架和群集位置,允许Spark逐渐增加任务对非位置的容忍度。即使在发生离散故障的情况下,通过重放RDD的谱系,框架也可以进行计算。

RDD可以在专用类型中实例化,具体取决于它们存储数据的计算类型。例如,存在图RDD,文件RDD和列存储RDD。

Article
知识星球
 
微信公众号
 
视频号