使用DryadLINQ
通过使用DryadLINQ编程使普通的程序员编写大型数据并行程序能够轻易的运行在大型计算机集群里。DryadLINQ开发的程序是一组顺序的LINQ代码它们可以针对数据集做任何无副作用的操作编译器会自动将其中数据并行的部分翻译成并行执行的计划并交由底层的Dryad平台完成计算从而生成每个节点要执行的代码和静态数据并为所需要传输的数据类型生成序列化代码。DryadLINQ使用和LINQ相同的编程模型并扩展了少量操作符和数据类型以适用于数据并行的分布式计算。并从两方面扩展了以前的计算模型SQL、MapReduce、Dryad等它是基于.NET强类型对象的、表达力更强的数据模型和支持通用的命令式和声明式编程混合编程从而延续了LINQ代码即数据treat code as data的特性。图8 DryadLINQ系统架构如图8所示LINQ本身是.NET引入的一组编程结构它用于像操作数据库中的表一样来操作内存中的数据集合。DryadLINQ提供的是一种通用的开发/运行支持而不包含任何与实际业务、算法相关的逻辑Dryad和DryadLINQ都提供有API。DryadLINQ使用动态的代码生成器将DryadLINQ表达式编译成.NET字节码。这些编译后的字节码会根据调度执行的需要被传输到执行它的机器上去。字节码中包含两类代码完成某个子表达式计算的代码和完成输入输出序列化的代码。DryadLINQ表达式代码示例片段如下CollectionT collection;bool IsLegal(Key k);string Hash(Key);var results from c in collectionwhere IsLegal(c.key)select new { Hash(c.key), c.value};这种表达式并不会被立刻计算而是等到需要其结果的时候才进行计算。DryadLINQ设计的核心是在分布式执行层采用了一种完全函数式的、声明式的表述用于表达数据并行计算中的计算。这种设计使得我们可以对计算进行复杂的重写和优化类似于传统的并行数据库。从而解决了传统分布式数据库SQL语句功能受限与类型系统受限问题以及MapReduce模型中的计算模型受限和没有系统级的自动优化等问题。另外在MapReduce编程方式下应用程序编写人员需要关注与自己的应用逻辑如何使用Map函数以及Reduce函数进行表达。在Dryad编程模式中应用程序的大规模数据处理被分解为多个步骤并构成有向无环图形式的任务组织由执行引擎去执行。这两种模式都提供了简单明了的编程方式使得应用程序开发人员能够很好的驾驭云计算处理平台对大规模数据进行处理。Dryad的编程方式可适应的应用也更加广泛通过DryadLinq所提供的高级语言接口使应用程序员可以快速进行大规模的分布式计算应用程序的编写。Dryad技术的应用虚拟化Virtualization是云计算的基石。也就是说企业实现私有云的第一步就是服务器基础架构进行虚拟化。基础设施虚拟化之后接下来就是要将现有应用迁移到虚拟环境中。云计算最重要的概念之一就是可伸缩性实现它的关键则是虚拟化、虚拟化就是在一台共享计算机上聚集多个操作系统和应用程序以便更好地利用服务器。当一个服务器负载超荷时可以将其中一个操作系统的一个实例以及它的应用程序迁移到一个新的、不相对闲置的服务器上。图9 实现云计算步骤Dryad结合Hyper-VWindows Server 2008的一个关键组成部分虚拟化技术可以实现TB级别的数据的在线迁移。中小型企业也可以针对企业内部小型群集服务器进行分布式应用系统编程以及制定私有云开发与应用解决方案等设计。Windows Azure是微软公有云最佳解决方案但是目前由于各种原因为时过早。使用现有Windows第三方产品实现私有云花费成本却很大。然而Dryad技术却给我们带来了不错的折中的选择当我们基于Windows Server平台运行应用系统或者网站时便可以基于Dryad分布式架构来开发与设计实现。当公有云时机成熟和各种条件完备时系统很轻易的升级到公有云企业而无需花费太多成本。写在最后通过以上介绍我们已经了解到Dryad是实现构建微软云计算基础设施重要核心技术之一。云计算可以看成是网络计算与虚拟化技术的结合。利用网络的分布式计算能力将各种IT资源筑成一个资源池然后结合成熟的存储虚拟化和服务虚拟化技术让用户实时透明地监控和调配资源。我们也体会到Dryad的诸多优点如DryadLINQ具有声明式编程并将操作的对象封装为.NET类方便数据操作、自动并行化、Visual Studio IDE和.Net类库集成、自动序列化和任务图的优化静态和动态主要通过Dryad API实现、对Join进行了优化得到了比BigTableMapReduee更快的Join速率和更易用的数据操作方式等。不过Dryad和DryadLINQ也同样具有局限性。它更适用于批处理任务而不适用于需要快速响应的任务这个数据模型更适用于处理流式访问而不是随机访问。虽然目前Dryad还是测试阶段尚未大规模普及但是微软已经在AdCenter的生产系统中使用Dryad。与 MapReduce不同的是DryadLINQ使用的是.NET的LINQ查询语言模型并且Dryad是针对运行Windows HPC Server的计算机集群设计而非兼顾Linux而目前Apache的Hadoop环境只支持Linux。目前而言高性能计算市场被Linux所占领但是笔者相信Dryad平台在将来一定具有很广泛的发展前景尤其对.NET开发人员来说也是一次很重要的技术革新机遇。