Dryad 微软的分布式运算框架

作者:刘旭晖 Raymond 转载请注明出处

Email:colorant at 163.com

BLOG:http://blog.csdn.net/colorant/

Dryad的论文是微软早在2007年就发布的,Tez的核心思想来源于Dryad,差不多可以算是Dryad的开源实现吧。最近正好看到几个有趣的项目是基于Tez实现的,于是顺便追本溯源,学习了一下Dryad的理论基础

==
目标问题 ==

Dryad的设计目标和当时先后出现的各种分布式运算框架一样,是为了简化大规模分布式编程的难度,提供给用户一个简单通用的分布式运算框架。和其它分布式运算框架解决的问题类似,不外乎就是用户不需要考虑分布式运算所涉及的众多繁琐的问题,例如资源分配,并发调度,系统容错等等,而只需要关注核心运算逻辑。

==
核心思想 ==

按照官方定义,Dryad是一个通用的粗颗粒度的分布式计算和资源调度引擎,这里所说的粗颗粒度,自然指的是针对批量数据进行处理的这种应用模式,当然批处理的粒度可大可小。

Dryad的核心数据模型由Vertex计算节点和Channel数据通道两部分组成,用户通过实现自定义的Vertex节点来执行定制的运算逻辑,而节点之间通过各种形式的数据通道传输数据,用户的运算逻辑本身通常是顺序执行的,而与分布式相关的逻辑则由Dryad框架来实现。

如图所示的是Dryad的系统架构框图。Dryad的作业管理模块JM在应用程序内部维护了一个基于DAG图模型的计算节点依赖关系图,作业管理模块通过命名服务器NS来获取可用的服务器列表,而后通过在这些服务器上运行的守护进程Daemon来调度和执行计算节点Vertex。各个计算节点之间通过例如文件,管道,网络等形式的数据通道交换数据。

表面上看,从整体的概念来说,Dryad和MapReduce十分相似,所不同的就是MapReduce的用户逻辑分为Map和Reduce两个阶段,在Dryad里就只有不分阶段的Vertex一个概念。不过这一点恰恰就是它与MapReduce区别的关键。

从用户使用的角度来说,MapReduce强制定义了Map和Reduce两个阶段,以及两阶段之间的数据输入输出格式。用户程序通过套用这种模型来抽象自身的运算逻辑,带来的好处是,简化了用户编程接口,降低编程难度,同时在这种模型的基础上MapReduce框架可以自动完成各种调度优化和容错处理工作。但是固定的编程模型自然也就在一定程度上限制了它的通用性,比如MR模型中所有的计算节点只能接受统一格式的一组输入数据,也只能输出一组数据,无论是否需要,用户逻辑都必须由匹配的Map和Reduce阶段组成等等。

为了具备更大的通用性,Dryad从模型上不区分运算阶段,从框架的角度上也不定义各个计算节点之间的数据交换格式,而是由具体的需要相互通讯的计算节点自己处理数据的格式兼容问题。这样做在一定程度上当然增加了用户的编程难度,例如就可能需要针对具体计算节点的实现,编写各种Channel数据通道的实现(当然可以通过实现一些通用的数据通道供用户匹配使用来解决部分问题)但是带来的好处也是显而易见的,就是更加灵活的编程模型。

用户自定义调度拓扑图

Dryad的核心特性之一,是允许用户自己构建DAG调度拓扑图,这个特性正是基于上述的原因而具备了实现的可能性和价值。MapReduce通过隐藏调度逻辑,简化用户编程。与之相反,Dryad期望通过适当增加的编程复杂度,暴露给用户更加灵活的调度编程接口,让用户能够更有效的优化运行逻辑,从而达到提升程序性能的目的。

Dryad运行库实现了一个简单的图形描述语言(graph description language)用来构建调度拓扑图,基本的操作原语和例子如下图所示:

构建一个具体的DAG的例子:

GraphBuilder XSet =moduleX^N;

GraphBuilder DSet =moduleD^N;

GraphBuilder MSet =moduleM^(N*4);

GraphBuilder SSet =moduleS^(N*4);

GraphBuilder YSet =moduleY^N;

GraphBuilder HSet =moduleH^1;

GraphBuilder XInputs= (ugriz1 >= XSet) || (neighbor >= XSet);

GraphBuilder YInputs= ugriz2 >= YSet;

GraphBuilder XToY =XSet >= DSet >> MSet >= SSet;

for (i = 0; i <N*4; ++i)

{
XToY = XToY || (SSet.GetVertex(i) >=YSet.GetVertex(i/4));}

GraphBuilder YToH =YSet >= HSet;

GraphBuilderHOutputs = HSet >= output;

GraphBuilder final =XInputs || YInputs || XToY || YToH || HOutputs;

上述代码构建的DAG图如下所示

动态优化调度逻辑

Dryad的另一个特点是允许用户动态的改变DAG调度拓扑图,这是通过在计算节点中反馈实际所处理的数据的相关信息给作业管理模块来实现的。之所以需要这么做,是因为在很多情况下,最优的调度拓扑结构往往取决于实际的输入数据,中间计算结果或者当时的运行环境,因此无法在编程的时候或者程序启动的时候提前给出最优结构。

例如图示的一个Aggregation类型的操作,在实际执行的时候,我们通过数据的本地性信息,可以动态的在原有的拓扑图中(A->B)添加一层额外的计算节点(A->Z->B),比如将同一个机架上的数据汇总到同一个中间节点上作一次Aggregation,然后再提交给原拓扑图中的后续节点处理。此外,也可以通过获取实际的数据规模信息,动态调整各个计算节点的并发度来适配程序实际运行情况等等。

当然,这些动态调整的代码逻辑本身需要用户根据自己的业务逻辑来实现,因此在一定程度上对用户来说也是需要付出额外的努力的

==
实现 ==

Dryad的具体实现是否优化合理,实际性能如何,一方面由于它不是开源项目,另一方面我个人也不了解微软的整套软件体系,所有也就无从谈起了,不过有空可以结合Tez这个开源版本的实现来具体分析一下。

==
思考 ==

Dryad的编程模型相对于MapReduce来说固然更加灵活,但是同时也带来了更高的编程门槛。此外,因为数据流程和交互过程更加灵活多变,大概会有很多在MapReduce里适用的各种框架级的优化工作或者通用的处理方法无法在Dryad的框架中应用,因此在易用性上势必受到影响,而如果用户代码不能自己完成这些优化工作的话,应该也会对应用程序的实际性能产生一定的影响。这好比Hadoop2采用Yarn框架来支持更加通用的编程模型,但是要和MapReduce一样,在Yarn的基础上构建自己的模型相关的调度模块,依然需要付出很大的努力,当然不能把Dryad的模型与Yarn简单的资源调度模型直接对比,毕竟Dryad的编程模型还是与MapReduce一样,属于更高层次的概念。

在易用性方便,Dryad的DAG图描述语言固然灵活,但在许多常用case的场合下也显得琐碎,比如并发度的设置等问题,许多情况下应该可以自动决定,各种常用处理流程的DAG拓扑图也相对固定,因此也就需要一些高层封装来简化编程,比如构建在Dryad上的Nebula,用户使用脚本语言的形式编程,Dryad的众多使用细节和动态优化逻辑都被封装在Nebula的方法操作中(例如Filter/Aggregate等),这点思想和Spark中RDD的方法封装调用DAGScheduler作业调度相关操作的思想很接近,即暴露给用户的接口是要做什么,而不是要怎么做。

另外微软的DryadLINQ是LINQ在Dryad上的实现,这里暴露给用户的也是更高层的应用接口,前面提到的各种需要解决的问题同样交给DryadLINQ的框架来处理。

从Paper的描述来看,当时的Dryad在并发,负载,HA等等大规模集群需要考虑的问题方面的处理方式还很简陋,当然经过这么多年的发展,应该在这些方面会有改善和发展,目前的具体情况就不得而知了

Dryad的开源实现Tez所面临的问题大概也是类似,Tez提供了各种通用的channel的实现(如针对MapReduce的应用模式的通道)来简化用户编程难度,但使用Tez依然比使用MapReduce要困难,Tez的稳定性和性能优化方面显然也还有很长的路要走。而Stinger等基于Tez的上层框架显然是希望在借助Tez在调度逻辑上提供的优化空间来提高性能的同时,通过更加高级的编程接口来保证易用性。

Dryad 微软的分布式运算框架,布布扣,bubuko.com

时间: 2024-12-19 12:24:22

Dryad 微软的分布式运算框架的相关文章

分布式服务框架之远程通讯技术及原理分析

在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI.MINA.ESB.Burlap.Hessian.SOAP.EJB和JMS等,这些名词之间到底是些什么关系呢,它们背后到底是基于什么原理实现的呢,了解这些是实现分布式服务框架的基础知识,而如果在性能上有高的要求的话,那深入了解这些技术背后的机制就是必须的了. 1 基本原理 要实现网络机器间的通讯,首先得来看看计算机系统网络通信的基本原理,在底层层面去看,网络通信需要做的就是将流从

分布式服务框架Dubbo

随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 单一应用架构 当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本. 此时,用于简化增删改查工作量的 数据访问框架(ORM) 是关键. 垂直应用架构  当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率. 此时,用于加速前端页面开发的 Web框架(MVC) 是关键. 分布式服

jeesz分布式企业框架 javaWeb分布式架构 springmvc+mybatis+shiro dubbo zookeeper redis kafka app服务

平台简介 Jeesz是一个分布式的框架,提供项目模块化.服务化.热插拔的思想,高度封装安全性的Java EE快速开发平台. Jeesz本身集成Dubbo服务管控.Zookeeper注册中心.Redis分布式缓存技术.FastDFS分布式文件系统.ActiveMQ异步消息中间件.Nginx负载均衡等分布式技术 使用Maven做项目管理,项目模块化,提高项目的易开发性.扩展性 以spring Framework为核心容器,Spring MVC为模型视图控制器,MyBatis为数据访问层, Apach

分布式服务框架 Zookeeper -- 管理分布式环境中的数据

安装和配置详解 Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务.状态同步服务.集群管理.分布式应用配置项的管理等.本文将 从使用者角度详细介绍 Zookeeper 的安装和配置文件中各个配置项的意义,以及分析 Zookeeper 的典型的应用场景(配置文件的管理.集群管理.同步锁.Leader 选举.队列管理等),用 Java 实现它们并给出示例代码. 单机模式 单 机安装非常简单,只要获取

分布式服务框架下,如何做到服务化最佳实践?

“升级服务框架后,性能.可靠性等问题日益明显.服务化之后面临的诸多挑战,怎样分析才能给出实践最优解? 在服务化之前,业务通常都是本地API调用,本地方法调用性能损耗较小.服务化之后,服务提供者和消费者之间采用远程网络通信,增加了额外的性能损耗,业务调用的时延将增大,同时由于网络闪断等原因,分布式调用失败的风险也增大.如果服务框架没有足够的容错能力,业务失败率将会大幅提升. 除了性能.可靠性等问题,跨节点的事务一致性问题.分布式调用带来的故障定界困难.海量微服务运维成本增加等也是分布式服务框架必须

详解应对平台高并发的分布式调度框架TBSchedule

tbschedule是一款非常优秀的高性能分布式调度框架,非常高兴能分享给大家.这篇文章是我结合多年tbschedule使用经验和研读三遍源码的基础上完成的,期间和阿里空玄有过不少技术交流,非常感谢空玄给予的大力支持.我写这篇文章的目的一是出于对tbschedule的一种热爱,二是现在是一个资源共享.技术共享的时代,希望把它展现给大家(送人玫瑰,手留余香),能给大家的工作带来帮助. 一.tbschedule初识 时下互联网和电商领域,各个平台都存在大数据.高并发的特点,对数据处理的要求越来越高,

5个强大的Java分布式缓存框架推荐

在开发中大型Java软件项目时,很多Java架构师都会遇到数据库读写瓶颈,如果你在系统架构时并没有将缓存策略考虑进去,或者并没有选择更优的缓存策略,那么到时候重构起来将会是一个噩梦.本文主要是分享了5个常用的Java分布式缓存框架,这些缓存框架支持多台服务器的缓存读写功能,可以让你的缓存系统更容易扩展. 1.Ehcache – Java分布式缓存框架 Ehcache是一个Java实现的开源分布式缓存框架,EhCache 可以有效地减轻数据库的负载,可以让数据保存在不同服务器的内存中,在需要数据的

【转】轻量级分布式 RPC 框架

第一步:编写服务接口 第二步:编写服务接口的实现类 第三步:配置服务端 第四步:启动服务器并发布服务 第五步:实现服务注册 第六步:实现 RPC 服务器 第七步:配置客户端 第八步:实现服务发现 第九步:实现 RPC 代理 第十步:发送 RPC 请求 总结 附录:Maven 依赖 RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样. RPC 可基于 HTTP 或 TCP 协议,Web Service 就是基于 H

【推荐】微服务大型分布式企业框架 dubbo + springmvc + mybatis + ehcache + redis Jeesz分布式架构

框架简介--主要定位于互联网企业架构,已内置企业信息化系统的基础功能和高效的代码生成工具,包括:系统权限组件.数据权限组件.数据字典组件.核心工具 组件.视图操作组件.工作流组件组件.代码生成等.采用分层设计.双重验证.提交数据安全编码.密码加密.访问验证.数据权限验证.平台简介 是一个分布式的框架,提供项目模块化.服务化.热插拔的思想,高度封装安全性的Java EE快速开发平台. 本身集成Dubbo服务管控.Zookeeper注册中心.Redis分布式缓存技术.FastDFS分布式文件系统.A