一种构建基于MapReduce的动态脚本执行引擎的方法
【专利说明】—种构建基于MapReduce的动态脚本执行引擎的方法
[0001]
技术领域
[0002]本发明涉及系统开发技术领域,特别涉及一种构建基于MapReduce的动态脚本执行引擎的方法。
[0003]
【背景技术】
[0004]利用Apache Hadoop的MapReduce (一种大规模数据编程模型)框架能够将一个作业分发到分布式系统中多进程中。多任务的执行,大大提高对大任务的处理能力和执行效率。目前其主要的开发方法分为以下两种:
1.利用Hadoop自身提供的API开发,这个过程是MapReduce开发的最基本流程。将开发流程分为三个基本的部分,任务设置提交阶段(Main)、Map执行阶段和Reduce执行阶段。以上三个部分缺一不可。以上三个部分开发完成后还要进行三个步骤:编译、打包和上传到客户机执行。如果遇到三个部分的其中一个阶段出现执行异常,那么还要再次编译,打包,上传客户机执行,其过程比较繁琐。其次Hadoop发布的API经过不同的分支版本间迭代,各个包中的方法在不同版本中的使用方法差异较大,对开发人员要求较高。
[0005]2.利用Hadoop Streaming框架允许任何程序语言实现的程序在HadoopMapReduce中使用,方便已有程序向Hadoop平台移植。Hadoop Streaming的原理是用Java实现一个包装用户程序的MapReduce程序,该程序负责调用MapReduce Java接口获取key/value对输入。创建一个新的进程启动包装的用户程序,将数据通过管道传递给包装的用户程序处理,然后调用MapReduce Java接口将用户程序的输出切分成key/value对输出。只要按照标准输入输出格式进行编程,就可以满足Hadoop MapReduce的要求。因此单机程序稍加改动就可以在集群上进行使用。但Hadoop Streaming有使用的局限性,其一:只能处理文本数据,无法设置数据格式。其二:Streaming的Mapper和Reducer阶段都只能向标准输出写数据,不能设置多路输出。其三-Streaming的多路输入不能设置用不同的Mapper执行。
[0006]
【发明内容】
[0007]为了解决上述技术问题,本发明提供一种构建基于MapReduce的动态脚本执行引擎的方法,该方法中基于MapReduce的动态脚本引擎功能是将MapReduce开发过程中的三个阶段按照一个规范在一个简单的脚本中完成。并且不需要编译,打包,直接在客户机的VI编辑器下就能完成开发和任务的提交执行。并克服了 Hadoop Streaming的不足之处,能够灵活的自定义数据格式,自定义输入和输出,自定义输入对应执行的Mapper。
[0008]本发明公开的一种构建基于MapReduce的动态脚本执行引擎的方法,该方法包括以下步骤:
定义MapReduce中的Map执行阶段和Reduce执行阶段为相同框架的子类;
在作业配置阶段、Map执行阶段和Reduce执行阶段分别添加脚本动态编译和执行的过程,并将任务执行的各个步骤定义成闭包;
通过Shell命令启动并读取脚本并执行相应阶段的任务。
[0009]进一步的,所述Map执行阶段的过程包括:
调用setup初始化资源;
根据数据的行数循环调用map进行数据的处理;
通过cleanup进行资源的释放。
[0010]进一步的,所述Reduce执行阶段的执行过程包括:
调用setup初始化资源;
根据Shuffle和排序阶段处理后的key/values的个数循环调用reduce进行数据的处理;
通过cleanup进行资源的释放。
[0011]进一步的,所述闭包用于传递参数,是一种可以事先定义,并在需要时执行的代码块或对象,且在定义的过程中,闭包可使用一个或者多个输入参数进行定义。
[0012]进一步的,所述闭包定义规范如下:
(1)定义任务的设置和提交;
(2)定义Map执行阶段中的setup,初始化Map执行阶段的资源;
(3)定义Map执行阶段中的cleanup,清理Map执行阶段申请的资源;
(4)定义Map执行阶段的执行过程;
(5)定义Reduce执行阶段的setup,初始化Reduce执行阶段的资源;
(6)定义Reduce执行阶段的cleanup,清理Reduce执行阶段的资源;
(7)定义Reduce执行阶段的执行过程。
[0013]进一步的,所述通过Shell命令启动并读取脚本并执行相应阶段的任务具体包括:
在脚本引擎启动时,任务脚本是以文本的方式读入引擎,做一次动态编译,执行脚本中的jobConf闭包进行任务的设置,然后提交任务;
脚本的文本存入MapReduce的系统环境变量中,且脚本的文本将随着系统环境变量的参数分发到各个TaskTracker (Hadoop程序在一个机器上的进程名称)的机器中。
[0014]进一步的,所述通过Shell命令启动并读取脚本并执行相应阶段的任务还包括: 在Map执行阶段的setup执行时预先读出脚本的文本,动态编译脚本,执行Map执行阶段闭包,并得到mapper和mapCleanup两个闭包的句柄;
接下来在调用map时转而调用mapper闭包的句柄完成map的处理,最后在cleanup阶段调用mapCleanup的句柄。
[0015]进一步的,所述通过Shell命令启动并读取脚本并执行相应阶段的任务还包括: 在Reduce执行阶段的setup执行时预先读出脚本的文本,动态编译脚本,执行
reduceSetup闭包,并得到reducer和reduceCleanup两个闭包的句柄;
接下来在调用reduce时转而调用reducer闭包的句柄完成reduce的处理,最后在cleanup阶段调用reduceCleanup的句柄。
[0016]进一步的,脚本引擎的脚本选用的是与Java能够完美集成的Groovy脚本,Groovy脚本在Mapper或Reducer初始化阶段时进行编译。
[0017]与现有技术相比,本发明公开的技术方案具有以下优点:
该发明公开的技术方案提供了一种MapReduce任务的开发方案和框架,该方案提供的框架可以在充分利用Hadoop API的前提下大大提高开发效率,快速响应需求变化,与敏捷开发的价值观相当契合。且该框架屏蔽了 Hadoop各个不同版本之间API的割裂状况,使开发上得心应手。
[0018]
【附图说明】
[0019]图1为本发明实施例中的方法流程图;
图2为本发明实施例中的Map执行阶段的执行过程流程图;
图3为本发明实施例中Reduce执行阶段的执行过程流程图。
[0020]
【具体实施方式】
[0021]下面根据附图对本发明实施例的【具体实施方式】进行详细描述:
实施例一:
本发明公开的一种构建基于MapReduce的动态脚本执行引擎的方法,如图1所示,该方法包括以下步骤:
5101:定义MapReduce中的Map执行阶段和Reduce执行阶段为相同框架的子类; MapReduce 中的 Map 阶段是 org.apache, hadoop.mapreduce.Mapper 的子类;
Reduce 阶段是 org.apache, hadoop.mapreduce.Reducer 的子类;
5102:在作业配置阶段、Map执行阶段和Reduce执行阶段分别添加脚本动态编译和执行的过程,并将任务执行的各个步骤定义成闭包;
脚本引擎在设计时遵循MapReduce的整个执行过程。不会影响到任务提交,代码分发,中间数据处理和读取排序等过程。只是在作业配置,MapTask’ReduceTask的三个阶段分别添加了脚本动态编译和执行的过程。
[0022]S103:通过Shell命令启动并读取脚本并执行相应阶段的任务。
[0023]如图2所示,所述Map执行阶段的执行过程包括:
调用setup O初始化资源;
根据数据的行数循环调用map O进行数据的处理;
通过cleanup O进行资源的释放。
[0024]如图3所示,所述Reduce执行阶段的执行过程包括:
调用setup O初始化资源;
根据Shuffle和排序阶段处理后的key/values的个数循环调用reduce O进行数据的处理;
通过cleanup O进行资源的释放。
[0025]进一步的,所述闭包用于传递参数,是一种可以事先定义,并在需要时执行的代码块或对象,且在定义的过程中,闭包可使用一个或者多个输入参数进行定义。
[0026]脚本引擎充分利用了动态脚本闭包的特点,将任务执行的各个步骤定义成闭包。闭包可以是对象,也可以是一种表示可执行代码块的方法。可以像方法一样传递参数。由于闭包是代码块,因此可以事先定义,并在需要时执行。像方法一样,在定义的过程中,闭包也可以使用一个或者多个输入参数。
[0027]进一步的,所述闭包定义规范具体如下:
闭包def jobconf = {args -> }定义任务的设置和提交。
[0028]闭包def mapSetup = {ctx -> }定义Map执行阶段的setup,初始化Map执行阶段的资源。
[0029]闭包def mapCleanup ={ctx -> }定义 Map 执行阶段的 cleanup,清理 Map 执行阶段申请的资源。
[0030]闭包def mapper= { k , v , ctx - > }定义Map的执行过程,其中参数k表示输入的key,V表示输入的value。
[0031]闭包def reduceSetup= {ctx -> }定义 Reduce 执行阶段的 setup,初始化Reduce执行阶段的资源。
[0032]闭包def reduceCleanup= {ctx ->