分布式编程模型的设计与演化

  • 时间:
  • 浏览:0
  • 来源:大发3D_大发3D官方

    ▪️并发性方面,MapReduce系统进程运行可前会 能多系统进程运行将会多系统进程运行运行并发执行,日后我前会 跨多台机器。MapReduce框架将数据根据数据量进行了自动切分,很好地实现了负载均衡。Map任务依赖于输入数据,  而Reduce任务只依赖于前面的Map任务的输出,各个任务之间相互没哟影响,全都任何另4个Map将会Reduce函数都可前会 能独立运行。

(4)关系型编程模型对使用者隐藏分布式环境下的底层细节,同MapReduce相同,为使用者处理了容错性、并发性和数据本地化的大大问题。

处理完消息和修改值日后,前会 进行一轮全局的同步,以确保每个顶点都处理完消息;全局同步后,又是发消息的过程,可前会 前会 能 这种在本轮迭代改变过值的顶点才会继续前会 发送消息;经过几轮迭代,亲们都没哟情况报告更新,则全局最大值找到,也全都6。上图右侧是具体顶点Computer代码示例。

(1)所有模型都含高基本的编程算子(Operator/Primitives),只需关注数据格式及数据之间的关系。

关系型编程模型里几瓶应用了函数式编程的思想,冗杂了分布式环境下的编程,日后我相对于MapReduce而言,关系型的编程语言的应用范围更加广泛,如SQL等。

    ▪️容错性方面,将会分布式文件系统的数据也有副本,一台机器的大大问题只影响帕累托图任务的执行而不影响任务输入数据的完整篇 性,全都每个任务都可前会 能重新启动日后我根据函数式编程的特点重新计算任务我越来越多 说影响结果;另外MapReduce框架的Master结点可前会 能监控到失败任务,自动在这种机器上重新运行失败的任务。

也有以处理离线数据为主,未来将会会向实时计算方向发展。当前开源社区里涌现了几瓶的

上图清晰的展示了Graph作业的生命周期:数据来自ODPS表,通过加载图的操作,该操作完成一轮从关系表到图的映射;图的存储妙招连接表或连接矩阵,在ODPS表保存的全都累似 形态学 ,将会图是分布式的图,日后我前会 进行数据分片(分片妙招可自定义,也可采用默认的哈希分片妙招),把图加载到不同的计算单元中;图加载和分片日后,进行多轮的迭代运算,这里采用最简单的vertex.compute妙招,输入是一系列的消息;经越来越来越多轮运算后,得到目标图形态学 ,最后将图输出到ODPS表中。

传统的MapReduce任务一般是很规整的Map加Reduce的形式,将会分析系统进程运行将会算法比较冗杂,则将会前会 多道MapReduce系统进程运行,也全都Map加Reduce,接着Map加Reduce,再接着Map加Reduce;将会用户想突破这种限制,比如让多个Map连接在同時 将会Reduce中间还有Reduce,实现起来还是比较冗杂的。在开源软件Hadoop里,有Train the map和Train the reduce的另4个类帮助用户考虑了这种大大问题,日后我将会Hadoop MapReduce框架的限制,Train the Map可前会 前会 能 在另4个Map中间再跟另外另4个Map将会在Reduce的前面加上另4个将会多个Map,而做可前会 能 Reduce中间直接跟另4个Reduce;日后我ODPS的MapReduce框架可前会 能做到多个Reduce运算符串联的操作,这和ODPS MapReduce底层伏羲的DAG调度模型有关。

 

下面来看一下典型的图计算模型——ODPS Graph计算框架。Graph计算框架实现了BSP计算模型,日后我其继承了BSP模型的优点和缺点;Graph模型其中的另4个核心概念是以顶点为中心的API设计。

该例由SQL语言编写,目的是找出计算机系学生来源前十名的省份及学生数目,观察其中的SQL的关键词,再结合上文提到的关系型语言,可前会 能看出SQL是五种关系型编程语言,SELECL 、JOIN、 GROUPBY、WHILE等算子在这种关系型语言中都能找到日后我语意大同小异。

 

ODPS Graph从性能上看非常适合迭代计算,现在的实现中所有的内部管理情况报告也有在内存中,可前会 前会 能 加载图、网生图或Checkpoint时,才会写磁盘,日后我比较高效,并具有一定的线性扩展能力;将会运算过程中不前会 锁和信息量,全都并发度非常高;其次通过Checkpoint生和熟跳机制保证了Graph的编程框架的容错性。除了ODPS Graph之外,这种图计算相关的编程或软件还有:

 

 

在该Pig的例子中隐藏了不少细节,比如其中TOKENIZE妙招嘴笨 是扩展自Pig内制的I will founk类并实现了exec的妙招,在妙招中加入了此人 的处理逻辑。函数内部管理的细节很重累似 于MapReduce版的WhatCount中间的Map函数,这种函数加上Foreach算子全都典型的函数式编程的例子,其中输出只依赖于输入参数,函数我越来越多 改变内部管理的情况报告。

  ▪️Neo4j,单机版图数据库,包括这种简单的图运算操作,扩展性不好。

  ▪️GraphX,它是Spark上的图计算框架,它们在SparkRDD通用算子之外扩展了几瓶的图相关的算子,日后我GraphX既可前会 能使用简单的关系型运算,也可前会 能直接操作图,编程接口非常简单,是另4个比较有前景的图计算发展方向。

 

最近几年分布式领域涌现了各种关系型语言,如Google论文里的FlumeJava以及它的开源实现Crunch、Hadoop的开源社区内的Cascading、Pig Spark等语言。累似 语言的数据源是关系型数据,如Table、Relations 、PCollection、RDD等;此外,关系型语言含高了一系列的关系运算符,如FlumeJava内的Primitive Operations、Cascading里的Pipes以及Pig中的Pig Latin。

图是另一类重要的数据形态学 图,图的形态学 很简单,其难点在于要怎样将图的存储和计算分布式化。MapReduce和关系型运算在处理关系型的数据上具有优势,但处理图类型的数据时仍然居于全都大大问题,如将会IO的大大问题因为迭代计算波特率低、数据之间可前会 前会 能 通过Key进行关联等。

下面来看日后例子:

在分布式计算领域,从数据处理的时效性出发,为在线数据应用和离线数据计算两大类,如同样的SQL语言,在在线数据应用领域可前会 能处理累似 于“小明买了一只手机”累似 的操作,也可前会 能完成“最近5年所有手机商城成交量”的计算需求,本文主要侧重于后者——分布式离线数据计算。

  ▪️Mahout,另4个通用的算法库,包括图计算,是基于MapReduce实现的,代码波特率我越来越多 说高。

 

Reduce函数代码如上图所示,同样是4个参数,其中输入的Key是刚才Map输出的Key;输入的Value列表是用迭代器Iterator来表示。Reduce的输入参数表示另4个Key对应了多个Value。编程框架将会聚合完毕,编程人员我越来越多 知晓聚合是要怎样居于的。函数内部管理的逻辑比较简单,依次读入Value的值并把它们加起来得到另4个总数,最后把原始的Key和计算得到的总数作为Value输出。

 

MapReduce是五种冗杂的关系型语言,对外只暴露了Map和Reduce五种接口,整个MapReduce框架用这种的关系语言来表示会更加清楚。

上图是另4个有向图的具体形态学 。图含高高顶点和边五种对象,每个顶点也有ID号,边是顶点与顶点之间的关系。每个顶点和边也有它们的属性,如一根边的距离属性表示另4个点之间的距离;右下角是另4个实际图,表示某个支付网站中的会员关系,其中点将会是某个会员或会员登录的某台电脑,会员之间的关系将会是亲们或转账关系,都可前会 能用关系图中的边表示。会员和电脑之间也将会居于关系,如Alice登录了Joe的电脑,则Alice顶点到Joe电脑之间会产生一根有向边。

如上图所示,顶点之间的通信是通过消息传递的,每一轮迭代日后,每个顶点前会收到从它的源发来的消息;日后我顶点对消息处理,并将结果发给下另4个顶点,如顶点5,它收到顶点2和3发的两条消息,2和3将会是它的邻居将会上游结点,经过结点5的处理,它又发出了三条消息,将会它的另外另4个邻居,也有将会是刚才的2和3另4个顶点;下游的另4个顶点接着做刚才的顶点5上居于的操作。整体流程和BSP流程累似 ,但在Graph模型里,关注的是各个顶点,日后我被称为是“不难 向顶点那样做思考,日后我再写Graph的系统进程运行“。

在分布式编程的领域中,MapReduce具有很好功能和特点处理了底层系统的冗杂度的大大问题:

未来分布式编程模型会更加富于多彩,将会会在各个维度上做扩展,当前主要的编程模型

下面以Pig为例,具体解释。Pig最大的特点是定义了一系列的算子(关系型运算符)。采用Pig编写的WordCount包括输入和输出可前会 前会 能 五行代码:

MapReduce模型的应用场景也非常广泛,常用于网站日志分析和流量统计、商业数据分析、机器学习和数据挖掘以及分布式索引等方面。

 

编程模型是指编程的妙招而也有特指某五种编程语言,如面向对象的编程全都五种编程模型。编程模型大致分为两类:命令式编程和声明式编程。前者最典型的是面向过程的编程语言,如C语言;后者与前者差异较大,如常见的SQL语言全都五种典型的声明式语言。

首先是读取文件对应于LOAD运算符;接着对每一根数据做Map操作,对应于ForEach运算符,ForEach是另4个高阶函数,它的输入是另4个具体的Map函数;接下来的两步对用户透明,分别是GroupBy和SortBy运算符,经过这另4个操作,把相同Key的记录聚合,得到了Key加上Valuelist的形态学 ,即Ruduce的输入;下一步的运算符又是ForEach,参数是Reduce函数,最后采用STORE运算符得到最后结果。

    ▪️数据本地化方面,利用伏羲的调度功能,MapReduce框架把任务启动到输入数据所在的机器上,完美地处理了数据本地化大大问题。

 

(2)各类编程框架可前会 能相互转化,甚至一套编程框架可前会 能用另外一套来实现;

分布式图计算模型

更加实时的编程引擎,比如Spark、 Tez 、Impala等等,这种引擎让上层编程模型变得更加高效;另外另4个方向是从当前的批量计算到流式计算演化,后续处理的数据将会是源源不断地输入,日后我前会 编程模型能处理此类数据;最后另4个方向是编程模型的融合,关系型计算、 图计算、迭代计算等编程模型,将会能融合在同時 ,将极大地冗杂编程妙招。

MapReduce模型对输入格式的要求较灵活,能算是 关系型数据,也日后这种格式的数据。其编程思想来自于函数式编程,函数式编程里的另4个函数(Map和Reduce)组合构成MapReduce模型。Map函数是将另4个Key-Value队映射到一组新的Key-Value队,能算是 一对一、一对多甚至一对零的映射;Reduce函数是将同另4个Key以及它对应的一组Value映射到一组新的Key和Value。

MapRedue编程模型

关系型编程模型的特点可前会 能简单总结为以下几点:

扩展MapReduce

MapReduce模型中Map和Reduce也有函数式编程语言里的高阶函数,它们的输入是另外另4个做数据变换的函数。WordCount系统进程运行是最有名的MapReduce系统进程运行,它合适 分布式编程界的HelloWorld系统进程运行。

分布式编程模型

第一步是读入另4个文件产生另4个关系数据集A;第二步是将A通过ForEach算子转换为单词的列表;第三步再把单词通过CgroupBy进行聚合;第四步是对每个Group做计数,也采用Foreach算子;最后一步是把结果数据集D存储到文件中。

(3)编程模型能算是 DSL语言,如SQL、Pig,前会 算是 通用型语言提供编程的SDK,如Spark、Cascading等,五种妙招各有优势,适用于不同的场景;

如上图所示,分布式编程模型一般分为三层:最上层是面向用户的编程接口层,如Pig Latin、MapReduce API或SQL等;中间是执行计划层;最下面的是执行引擎,常见的执行引擎由Spark、 MapReduce、Tez等。执行计划层非常关键,它负责将用户的逻辑代码转换为真正在分布式系统上执行的代码,日后我,系统进程运行可前会 能编写的很简洁日后我实际表达能力却非常强;整体在执行计划上实现,执行计划生成器会分派信息,基于规则将会历史信息对执行过程做优化,以期待得到更高效的执行系统进程运行;有时执行引擎和编程接口的区别我越来越多 说十分明显,累似 MapReduce既突然出先在接口层(MapReduce API),又突然出先在引擎层。

则把此人 顶点的值置为收到消息的值,日后我就处理下另4个结点,如顶点3收到顶点6的消息后,会将此人 的值置为6,这种顶点操作相同。

关系型数据编程模型

 

分布式编程模型的背景

另4个高效、可用的分布式编程模型首先前会 处理TB以及PB以上的数据量,日后我编程模型前会 以数据为中心;其次应该前会 处理现实生活中的各类异构数据格式;同時 ,前会 具有较高的数据处理波特率,前会 在几小时甚至几分钟内处理上PB的数据,日后我前会 使用多机并行计算能力;此外,在分布式环境下的编程模型前会 尽将会简单易用,可前会 能对用户隐藏盘古和伏羲累似 的底层系统。

中间是Hadoop MapReduce 中的Map函数的具体代码,可前会 能看后,Map函数有4个参数,除了最核心的Key和Value另4个参数外,还有专门用来搜集输出结果的Output参数,还有另4个参数Reporter用来记录系统进程运行的进度将会这种信息。这里的Key和Value的数据类型可前会 能自定义,上图的输入Value是Text类型,每另4个value是一行文本数据,输入的Key在WordCount中没哟意义,可前会 能忽略。首先把Value转加上字符串,日后我再把String用Tokenizer的妙招切分成单词,日后我通过While循环把单词及数字1作为Key和Value输出,其中数字1是指单词在该行里只突然出先过一次。

上图是命令式和声明式语言统计文件(表)内行数的具体系统进程运行,可前会 能看出两者居于明显的差距。在命令式编程中,会有全都细节,前会 告诉系统进程运行每一步做这种,中间情况报告要怎样维护以及要怎样得到最终结果;而声明式编程相对更加简洁,更加注重结果而不考虑过程。

上图是找最大值顶点得Graph编程示例,图中有4个顶点,值分别是3、 6、 2、 1,它们两两之间也有联系。每一轮迭代日后结束了了,每个顶点前会向邻居结点发送消息,消息内容是顶点此人 的值。日后我,顶点3收到了顶点6的消息;顶点6也收到了顶点3的消息...依次类推。所有顶点收到此人 消息后,日后结束了了比较当前顶点的值和消息顶点的值,将会消息顶点的值更大,

  ▪️GraphChi,另4个单机版的图数据库,性能很高,同样受制于单机环境,无法做到线性扩展。

  ▪️GraphLab,另4个基于MPI实现的图的算法库,API较为冗杂,日后我是将会基于异步模型的操作,没哟BSP的全局同步功能。尽管波特率非常高,但前会 用户自定义一致性模型且代码过程中要处理死锁,因为用户使用代价比较昂贵。

未来展望