Dryad 和 DryadLINQ 是微软研究院的两个项目,用于辅助 C#开发人员在在计算机集群或数据中心里处理大规模的数据。
Dryad 是一个在计算机集群或数据中心里并行地执行顺序程序的基础架构。如下图所示,并行计算过程被会被组织为一个有向无环图,程序是图的“节点”,而“边”则为程序之间相互通信所用的通道:
上图简单描述了程序之间的关系,如数据来源及输出的指向。这个图必须是无环的,以避免造成调度上的死锁。任务管理器(Job Manager,JM)获取图之后,便会在程序的输入通道准备完毕,并且有可用机器的时候对它进行调度。JM 从命名服务器(Name Server,NS)那里获得一个可用的机器,并通过一个维护进程(daemon,D)来调度这个程序。文件,共享内存,或 TCP 管道都可以作为程序(节点)之间通信用的通道。在运行过程中可以动态改变图的形状,并得到很好的容错性。在调试的时候,整个图也可以运行在单个系统上。微软已经在 AdCenter 的生产系统中使用了 Dryad。
DryadLINQ 是“一个把 LINQ 程序转化成分布式计算指令,以便运行于 PC 集群的编译器”。这个转化过程可以分解为以下几步:
- C#和 LINQ 数据对象转化为分布式的文件块。
- LINQ 查询转化为分布式 Dryad 任务。
- C#方法转化为运行于 Dryad 任务节点上的代码。
DryadLINQ 有如下功能:
- 声明式编程:计算指令要求使用类似 SQL 的高级语言进行表示。
- 自动并行化:DryadLINQ 编译器将顺序的声明式代码,转化为分布在大规模计算机集群中高度并行的查询计划。而对于单台机器中多核的使用,DryadLINQ 则依赖 PLINQ 并行框架。
- Visual Studio 集成:程序员在使用 DryadLINQ 时可以利用 VS 中大量的高级特性,如智能提示、代码重构、集成调试、构建以及原代码管理。
- .NET 集成:所有的.NET 类库,包括 Visual Basic,以及各种动态语言都可以自由使用。
- 类型安全:对分布式计算进行静态检查。
- 自动序列化:数据传输机制会自动处理所有的.NET 对象类型。
- 任务图的优化
- 静态:一系列丰富的查询优化规则,可以使查询计划有更好的局部性(locality)及更好的性能。
- 动态:对已经处理完的数据集进行统计,以此作为运行时的优化查询计划的依据。
评论