1、引言
互联网数据处理、科学计算、商业智能等领域都存在着海量数据处理需求,存在大量数据密集型应用[1]。Google提出了Map
Reduce [2]编程模型,开发人员只需要编写单个节点的处理任务,由计算平台来提供任务的并行处理及维护,大大降低了并行编程的难度。这种计算平台通常建立在分布式文件系统之上,可以实现很好的可扩展性和容错性,逐渐成为云计算平台的重要组成部分。
但是采用Map Reduce编程模型开发一个数据密集型应用,用户不仅需要对各个数据操作按照Map
Reduce进行实现,还要实现多个操作之间中间数据的传输,实现复杂的数据处理流程,另外采用Map Reduce编程模型编写的代码十分复杂,流程类的处理任务的代码量将急剧膨胀,难于维护。如何为这些计算平台提供高效的编程模型和开发工具成为重要的研究方向,模型驱动的方法可以提高编程的效率,也利于在模型层进行性能优化,在很多领域有成功经验,比如数据仓库领域的ETL(Extract-Transform-Load)工具都提供了可视化的数据流程设计工具。
Apache Hadoop平台实现了Map Reduce编程模型,作为一个成熟的开源平台被广泛采用,目前国内外的研究者也大都集中于Hadoop平台进行分布式数据并行处理的研究。
我们深入了研究面向Hadoop平台的模型驱动的分布式数据并行编程模型及性能优化关键技术。提出一个开发框架,首先可视化地建模数据处理流程,并将其转换为MapReduce任务构成的有向无环图,再映射到MapReduce的代码模型,最终实现自动生成MapReduce代码。提供一些预定义的数据操作组件,并定义了组件模型,支持用户自定义组件。基于该框架和Hadoop平台,我们实现了一个数据密集型应用开发优化平台OnceDICP(Once
Data Intensive Computing Platform)。本文重点介绍平台架构与模型转换部分技术,平台性能优化等部分将在后续的文章中介绍。
2、相关工作
MapReduce编程模型首先由Google的工程师提出,很多科研机构或企业都对MapReduce实现上做了大量的研究,Hadoop实现了可以在普通的商用机器集群上并行处理海量数据的MapReduce软件框架[3],Hive提供了基于SQL的简单查询语言Hive
QL来简化数据处理流程的操作,同时支持用户自定义的Map和Reduce操作[7]。Pig也是基于Hadoop平台提供了一种类SQL的声明式编程语言pigLatin[8],Sawzall则提供了一种类C语言的编程方式实现MapReduce,但是这些系统也存在以下几个问题:(1)没有统一的数据操作组件模型来支持用户自定义数据处理操作。(2)对于普通用户来说使用系统提供的简化MapReduce的编程语言仍然有困难,(3)使用通用的MapReduce流程引擎,由于不同流程的差异性,会导致不必要的判断而带来性能上的损失,(4)系统在MapReduce运行参数设置上对用户完全透明,这对于不同的流程执行效率会带来不稳定的影响。
ETL(Extract, Transform, Load)工作流是典型的数据处理流程,[4,5]将ETL工作流建模为有向无环图,给出了一个通用的框架,并采用LDL语言表示每个操作节点的处理逻辑。[6]则将ETL工作流采用UML来建模,对状态图进行扩展。数据处理流程并没有统一的学术定义,这些研究从不同角度给出了数据处理流程的建模方法。本文期望采用建模的方法支持用户的快速开发,提高数据处理流程开发的可维护性,因此要研究可以转换为云计算平台执行代码的数据处理流程模型。
云计算技术在国内也广受关注,有研究者在2008年就对数据密集型应用的编程模型进行了综述[10],[9]介绍了国内研究者开发的基于Hadoop的并行数据挖掘平台,该系统已用于中国移动通信企业TB级数据的挖掘。针对编程方法层次,国内研究者关注的还不多。
3、模型驱动开放框架
3.1模型驱动开发原理
在实际应用场景中,虽然相同的数据流程处理的过程相同,但是在数据量大小,数据格式,处理平台,硬件环境等都会存在很多差异,为了屏蔽这些差异,给数据处理系统带来最大的灵活性,可以使用模型驱动的开发方法,首先建立从数据处理流程业务功能角度定义的业务模型,从业务角度来描述流程的业务功能,然后再根据业务模型建立具体编程模型相关的执行模型,执行模型按照一定的计算模式(MapReduce,串行,并行)定义了流程执行调度策略,接着根据执行模型建立相应的代码模型(可以使用Java,C,C++等各种语言来实现),最后根据代码模型和执行模型使用代码生成技术来生成流程的实现代码。模型驱动的方法通过模型重用,对于同一个数据处理流程,可以在保持业务模型不变的情况下根据数据量大小等情况分别选择使用串行,并行或者MapReduce的方式的执行模型去执行数据处理流程等,给系统带来最大的灵活性和可重用性,同时通过对模型的按照一些规则进行自动的优化调整可以不断提升流程的运行效率。
图1 OnceDICP 架构
图1是OnceDICP的架构图,第一层次表示具体的数据密集型应用,第二层次描述了模型转换的过程,是本论文描述的主要内容,第三层次是我们对Hadoop进行修改后形成的Once
Hadoop版本,用于支撑系统的运行。
3.2模型定义
3.2.1数据流程业务模型
数据处理流程业务模型是从业务角度来描述数据处理流程功能的模型,它与具体的编程模型无关,由业务操作节点和节点间的数据流连接构成。业务模型是系统首先要建立的模型,具体的模型实例则由用户设计,系统从它出发进行后续的工作。从整体上来看,业务模型为一个有向无环图的结构G(V,E),每个节点都包含了一个业务操作,每个业务操作都引用了一个按照数据处理组件模型定义的组件ID,每条业务连接代表了业务操作间数据流向和依赖关系,下图是一个业务模型实例:
图2 数据流程业务模型示例
3.2.2执行模型
执行模型是一种和具体的编程模型、流程执行调度策略相关的流程模型,执行模型由业务模型转换而来,而业务模型只有在转换为执行模型以后才能按照一定的策略被调度运行。
基于MapReduce的数据流程的执行模型主要包含两个有向无环图的结构PG(V1,E2)和MG(V2,E2)。PG是子流程依赖图,由业务模型进行节点和连接变换后按照一定的算法转换而来,子流程依赖图的每个节点是一个子流程,边表示子流程之间的依赖关系,而每个子流程又是一个完全由线性连接的执行节点构成的有向无环图SG(V3,E3),每个节点代表了一个执行节点,每条边代表了执行节点之间的数据流向。MG为MapReduce任务依赖图,它由子流程依赖图按照一定的策略划分而来,MG的每个节点表示了一个MapReduce任务,每条边表示MapReduce任务之间的数据传递关系和依赖关系。
执行模型包含了所有对流程按照MapReduce的计算方式调度执行的所有信息,结合代码模型就可以生成流程的实现代码。
3.2.3代码模型
要生成流程的实现代码还需要定义流程的代码模型,代码模型根据执行模型定义了用来实现流程功能的代码结构,通过执行模型和代码模型,利用代码生成技术和代码生成算法就可以生成实现了数据处理流程的具体实现代码。
代码模型由代码结构模型和和每个部分的代码模板构成,代码模板的实现可以基于编程语言灵活定义,不同的编程语言定义的代码结构和代码模板都可以对应同一个执行模型。
码模型抽象出了每个流程公共的代码结构,同时通过使用代码模板的方式屏蔽了各个流程在各个部分实现上的差异,本文建立了一个使用Java语言定义的基于Hadoop提供的MapReduce编程接口的代码模型。?
代码结构:代码结构是每个流程公用的,它抽象了每个流程实现代码的公共结构,各个部分拼装在一起就能构成一个完整的流程代码。?
代码模板:每个模板都是一个以javajet为后缀的文件,通过Jet的解析可以生成一个能够根据执行模型信息动态生成代码的模板解析类。构成代码结构的每个部分都有相应的代码模板,通过使用执行模型中的子流程信息,执行节点信息,Map
Reduce任务信息,连接信息等,借助于代码生成技术可以动态的生成代码结构中每个部分对应的流程代码,从而屏蔽了每个流程的差异性,以一种统一的方式来实现流程代码。代码结构和每个部分对应的代码模板如图4所示。
3.3模型转换
3.3.1业务模型到执行模型的转换
用户设计的业务模型需要按照一定的算法转换为执行模型以后才可以被代码生成引擎用来生成实现代码。从业务模型到执行模型的转换主要包括三个步骤:
(1)业务操作节点和数据流连接变换
模型转换首先需要将每个业务操作节点转换为执行节点,每个数据流连接变成执行节点之间的连接,节点变换包括从业务操作节点继承组件ID信息,参数信息,输入输出信息,同时根据组件ID填充执行节点的MapReduce类型,输入输出数,输入输出地址计算,代码模板地址等信息,连接变换包括连接实现模板地址,连接名,连接起始执行节点,模式信息等的读取和设置。节点和连接变换的最终会生成一幅由执行节点和节点连接构成的有向无环图,以图2所示的业务模型为例,转换出来的图如图3所示:
图3 执行模型示例
(2)子流程的划分和子流程依赖图的生成
子流程划分主要是捕获经过第一步转换以后,有向无环图中的以线性方式连接而不存在分支或者聚合的一系列执行节点,并对捕获的节点组进行单独抽取出来,生成子流程。在图5的例子中,我们可以将流程图分为三个子流程组,他们分别为(按节点的标号来表示节点):组1:2,3,4;组2:1,5;组3:6,7,8,9;然后按照子流程之间的连接关系生成子流程依赖图,组3依赖于组1和组2。
(3)MapReduce任务的划分和任务依赖图的生成
MapReduce计算模型允许我们通过合并Map操作节点的方式来生成以mapper+/reducer/mapper*形式组织的MapReduce任务,从而减少流程MapReduce任务数,降低磁盘和数据传递消耗,提高效率。图3的流程按照这种方式划分,组1转换为map
+ map + map一个Map Reduce任务(mr1),组2转换为map + map一个Map Reduce任务(mr2),组3转变为map
+ map + reduce(mr3)和map + Reduce + Map(mr4)两个Map Reduce任务,其中mr3依赖于mr1和mr2的输出数据,mr4依赖于mr3的输出数据。与将每个节点当成一个MapReduce任务相比,减少了MapReduce任务数,减少了数据传递消耗,加大了执行并发度,对执行效率有非常大的改进。
3.3.2执行模型到代码模型的转换
图4 模型映射
代码生成算法使用数据处理流程的执行模型实例和MapReduce代码模型作为输入,输出数据处理流程的实现代码。在本文的代码生成算法中,使用Java语言和Hadoop平台提供的MapReduce接口做样例。如图4所示:
流程基本信息和相应的代码模板用来生成流程头部、执行入口和尾部代码,物理连接和流程依赖连接结合相应代码模板生成数据流连接内部类,执行节点结合相应的代码模板生成Map,Reduce操作相关代码。Hadoop任务信息和相应代码模板用来生成任务配置代码,任务依赖关系和相应代码模板用来生成流程执行调度代码。
4、OnceDICP的实现
系统OnceDICP的实现基于Eclipse插件技术和GMF建模技术以及Hadoop平台提供的Map-Reduce编程接口,并使用Jet代码生成技术来生成流程的执行代码,在Hadoop平台上运行。.系统的设计尽量使用了分层和可扩展机制,在数据源上,使用数据源适配器为HDFS,XML,关系数据库,普通文件等各种数据源或者用户自定义的数据源提供接口,在转换组件和流程的设计上使用GMF技术,
GMF提供了快速开发基于图形化编辑器GEF和EMF建模技术的开发框架,使用Eclipse插件技术实现数据操作组件和数据源的可扩展性,然后分别经过逻辑模型和物理模型转换以及代码生成器生成流程的MapReduce实现程序,最后利用Hadoop平台提供的各种机制优化,调度,和运行MapReduce任务。
图5 OnceDICP数据处理流程建模界面
5、结束语
本文提出了一种模型驱动的Map Reduce代码开发框架,并实现了一个数据密集型应用开发优化平台OnceDICP。在未来的工作中,将重点解决提高代码执行效率的问题,并从理论角度研究模型转换的正确性和完整性。
参考文献:
[1] Data-Intensive Supercomputing: The
case for DISC.http://www.cs.cmu.edu/~bryant/pubdir/cmu-cs-07-128.pdf
[2] Jeffrey Dean and Sanjay Ghemawat.
MapReduce: Simplified Data Processing on Large Clusters.
In OSDI’04: Proceedings of the 6th conference on Symposium
on Opearting Systems Design & Implementation, 2004
[3] Hadoop. http://lucene.apache.org/hadoop/,
2010
[4] P. Vassiliadis, A. Simitsis, E.
Baikousi: A taxonomy of ETL activities. In DOLAP, 2009,
pp.25-32
[5] P Vassiliadis, A Simitsis, P Georgantas,
M Terrovitis.A generic and customizable framework for
the design of ETL scenarios. Information Systems, 2005
[6] J Trujillo, S Luján-Mora. A UML
based approach for modeling ETL processes in data warehouses.
Conceptual Modeling-ER,2003
[7] Ashish Thusoo, Joydeep Sen Sarma,
Namit Jain, et al. Hive – A Warehousing Solution Over
a MapReduce Framework. In VLDB ’09: Proceedings of the
35th International Conference on Very Large Data Bases,
2009
[8] Christopher Olston, Benjamin Reed,
Utkarsh Srivastava, et al. Pig Latin: A Not-So-Foreign
Language for Data Processing. In Proc. of the SIGMOD
Conf. ,2008, pp.1099–1110
[9] 基于Hadoop的并行分布式数据挖掘平台PDMiner(Parallel
Distributed Miner).http://www.intsci.ac.cn/pdm/msminer.html
[10] 王鹏, 孟丹,詹剑锋,涂碧波. 数据密集型计算编程模型研究进展.
计算机研究与发展, 47(11),2010,pp.1993-200
|