法律状态公告日
法律状态信息
法律状态
2020-05-05
授权
授权
2018-07-06
实质审查的生效 IPC(主分类):G06F8/35 申请日:20171225
实质审查的生效
2018-06-12
公开
公开
技术领域
本发明涉及一种代码生成方法,主要利用模型转换技术来实现由QVT-R语言自动化生成midCore脚本的任务,属于计算机技术、模型转换技术、领域特定语言和代码生成技术大数据分布式数据处理的交叉技术应用领域。
背景技术
数据转换是对于异构数据的常用处理方法。随着企业、组织间的紧密合作以及兼并,异构的数据信息资源广泛存在着,严重影响了部门间的信息交流。而数据转换的目标就是将异构的数据信息进行转换,并消除数据中存在的各种错误,优化数据模型,得到理想的数据模型。
计算机领域存在大量的领域特定语言(Domain Specific Language,简称DSL),它们通常用于处理各种领域特定问题,本发明中涉及的midCore脚本则一种DSL,它是由南京大学软件工程组设计的一种面向大数据转换的领域特定语言,提供了数据模型描述、匹配、转换等操作算子,可以向多个大数据处理平台自动化映射,从而更加简便的完成大数据处理任务。以上两种语言可以分别看成模型转换的输入模型和输出模型。
Spark是现在常用的一种大数据平台,随着信息社会的高速发展,人们每天无论是生活还是工作都会产生并且接触到爆炸增长的信息量,从而使得工业界要处理的信息越来越多,也越来越复杂。传统的数据转换方法已经无法快捷高效的处理大数据的转换,因此演化出了如Spark之类的大数据平台。但是Spark平台在高效处理大数据的同时,具有一定的平台复杂性,学习成本较高,对于刚刚接触该平台的用户并不友好。
Hadoop是当今另一种常用的,且非常具有代表性的大数据平台。该方法是对Mapreduce编程模型的实现,用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。然而该框架采用Mapper和Reducer类中的方法来表示数据操作,有一定的领域复杂性,对于日常数据操作的表达,并不友好。
Xtext是基于eclipse的一个插件工具,利用该工具我们可以自己定义一种基于文本的领域特定语言,然后创建出自定义程序语言。这里我们通过该工具实现了转换原语的设计,并通过它产生Spark代码,从而降低基于Spark平台的大数据转换实现成本,解决在大数据平台进行数据转换复杂性较高这一问题。
发明内容
发明目的:针对现有技术中存在的问题,本发明是为了完成QVT等模型转换语言与Mapreduce的多种实现平台之间的桥接,是midcore语言脚本设计工作和代码生成工作的延续。本发明是利用模型驱动开发思想实现大数据程序开发工作的重要组成部分,也可以单独成为一项在抽象层次开发Mapreduce程序的工作,屏蔽了大数据具体平台的平台开发复杂性,简化了大数据程序的开发过程。
为了实现上述发明目的,本发明采用的技术方案为:
一种基于模型转换由midcore生成spark和hadoop程序代码的方法,其步骤包括:
步骤1:按照midcore语言的语法,建立抽象语法树,并在xtext工具中用xtextgrammer language准确描述出来;
步骤11:Model元素为语法树根节点,即总入口,包含了若干个Domain和Rule语句;
步骤12:Domain语句以”domain”为匹配关键字,含有若干个Source语句和Target语句;
步骤13:Source语句以”source”为匹配关键字,含有inputData元素,若干条Class语句;
步骤14:Target语句以”target”为匹配关键字,含有outputData元素,若干条Class语句;
步骤15:Class语句以class为匹配关键字,含有name和attributes元素,可选关键字abstract,extends,元素name,含有若干条Attribute,Format和Path语句;
步骤16:Attribute语句以”;”为匹配关键字,含有name和type元素;Path语句以”path”为关键字,含有value元素;Format以”fomat”为匹配关键字,含有value元素;
步骤17:Rule语句含有name元素,若干条Commad语句,Command语句分为Filter,Join,Deduplicate,Generate,StopClause语句,Reduce语句;
步骤18:Filter语句以”filter”为匹配关键字,含有元素result,name,attribute,type和value;
步骤19:Join语句以”join”为匹配关键字,含有元素tableCount,classname,keyname;
步骤110:Deduplicate语句以”deduplicate”为匹配关键字,含有attribute,result,name元素;
步骤111:Generate以”flatmap”或者”map”为匹配关键字,含有元素result,param,包括若干条Expression语句,Expression分为了Assignment,If_expression,Variable,ArithmicExpression语句几类,分别遵守OMG公布的OCL标准;
步骤112:Rduce语句以”reduce”作为匹配关键字,含有元素result和name;
步骤113:StopClause语句以”=”,”;”为匹配关键字,含有元素target_n和target_v;
步骤2:采用xtend根据xtext grammar language书写的语法分析树,书写midcore到spark代码的映射规则,合称M2S框架;
步骤21:将Domain语句映射生成scala的数据类,Source语句生成输入数据类,加入输入数据解析的方法和输入路径,Target语句生成输出数据类,数据类的存放结构为ArrayList[Any]加入输出数据转化为文本的方法和输出路径,Class语句生成数据类的属性等信息;
步骤22:将Rule语句映射生成scala的一个名为Main的object的主函数,并加入配置SparkConf和SparkContext的语句,并在主函数当中调用输入数据类的输入数据解析方法;
步骤23:将Filter语句生成相应的spark代码,调用RDD的filter方法进行数据处理;
步骤24:将Join语句映射生成相应的spark代码,调用RDD语句先让源数据对应的RDD生成对应的PairFunctionRDD,然后这些PairFunctionRDD调用join方法进行若干次连接,PariFunctionRDD中的ArrayList[Any]调用+=操作进行ArrayList的合并;
步骤25:将Deduplicate语句映射生成相应的spark代码,调用RDD的map方法首先转化成PairFunctionRDD,再调用reduce方法进行去重操作,最后再调用map方法转换回RDD;
步骤26:将Generate语句映射生成相应的spark代码,调用RDD的map或者flatmap方法,在其中新建一个ArrayList[Any],把生成的数据添加到这个结构中;
步骤27:将StopClause语句映射生成最后的赋值语句,赋值给最终结果,并调用输出数据类的输出数据方法,进行输出数据;
步骤3:在xtext和xtend书写好的M2S框架中输入midcore代码,生成spark代码,提交运行;
步骤31:对M2S相应的xtext项目右键点击run as EclipseApplication,运行框架,在src文件夹中新建格式为midcore文本文件,输入midcore代码;
步骤32:框架自动生成scala代码,位于src-gen文件夹中;
步骤33:将自动生成的代码放入创建的scala项目中,将Main选定为主类,导出jar包,提交到spark集群即可运行处理数据。
步骤4:采用xtend根据xtext grammer language书写的语法分析树,书写midcore到hadoop代码的映射规则,合称M2H框架;
步骤41:将Rule对应生成Java的Main类和main函数,main函数包括了新创建一个hadoop的多个job;
步骤42:Domain里的Source和Target语句分别生成主类里面的两个静态方法,即输入数据的解析方法,将读入的文本数据按照格式进行解析,最终返回ArrayList[Object]类型;输出数据的解析方法将ArrayList类型转换按照要求的输出格式成文本进行输出;
步骤43:创建两轮Mapreduce处理过程,分别进行输入和输出操作,其中Map方法调用52中数据输入和输出方法,Reducer不做操作;
步骤44:对于Filter语句,在Hadoop创建一轮mapreduce迭代job,map方法将ArrayList[Object]调用parallelStream()方法转化成Stream再调用filter方法进行数据处理,reduce方法不做操作;
步骤45:对于Join语句,我们新建一轮mapreduce迭代过程job,在map函数中调用parallellStream()方法转化成Stream类型,之后调用map方法抽取出用于匹配的关键字作为key,reduce方法中对key匹配的两个ArrayList调用addAll操作进行合并,完成连接操作;
步骤46:对于Deduplicate语句映射成相应hadoop代码,在hadoop中创建一轮mapreduce过程job,map方法将ArrayList[Object]调用parallelStream()方法转化成Stream再调用Streams中的reduce方法进行数据处理,Reducer中的reduce方法不做操作;
步骤47:对于Generate语句,我们新建一轮hadoop的mapreduce过程,在map函数中调用parallellStream()方法转化成Streams类型,之后调用Streams中的generate方法,创建新的ArrayList,放入我们想生成的数据,reduce过程不做操作;
步骤48:对于reduce语句,我们新建一轮hadoop的mapreduce过程job,mapper类中抽取key,接着为其定义一个reducer,在reduce函数中将Iterable类型转换成Stream类型,然后调用reduce方法进行reduce操作
步骤49:最后添加输出数据的这轮mapreduce过程job,FileInputFormat和FileOutputFormat类添加输入和输出路径,形成完整的hadoop程序;
步骤5:在xtext和xtend书写好的M2H框架中输入midcore代码,生成hadoop代码,提交运行;
步骤51:在M2H相应的xtext项目右击选择run as Eclipse Application选项,运行M2H框架,在src文件夹中新建格式为midcore文本文件,输入midcore代码;
步骤52:框架自动生成java代码,位于src-gen文件夹中;
步骤53:将自动生成的代码放入创建的java项目中,将Main选定为主类,导出jar包,提交到hadoop集群即可运行处理数据。
有益效果:本发明结合了MDE思想以及代码生成技术,实现了midcore代码同时能生成Spark和Hadoop代码工作。由于midcore由现有的模型转换语言生成,本发明很好地桥接了模型转换语言和大数据平台,降低了大数据程序开发的复杂性,多个平台的兼容,有效提高了开发效率。
附图说明
图1为本发明实施例的midcore生成spark和hadoop代码方法流程和架构图。
图2为本发明实施例的xtext grammer language书写的midcore部分文法。
图3为本发明实施例的xtext书写的文法解析生成的midcore语法树模型部分内容。
图4为本发明实施例的midcore与生成的spark代码片段对照。
图5为本发明实施例的midcore生成hadoop的代码片段对照。
具体实施方式
下面结合附图和具体实施例对本方法做进一步详细说明。
图1为本发明实施例的midcore生成spark和hadoop代码方法流程和架构图。Spark和hadoop是当今最富代表性的大数据平台,都是基于mapreduce编程模型的实现,本方法实现了midcore语言的语法解析,并自动生成这两大平台的程序代码,以实现以QVT-R为代表的现有模型转换语言与具体的大数据平台之间的桥接,以及方法良好的扩展性。本方法基于MDE的思想,屏蔽了具体大数据平台的细节,同时降低了多个平台的开发复杂性。如图1所以,本实施例的基于模型转换由midcore生成Spark和Hadoop程序代码的方法,包括步骤:
步骤1:按照midcore语言的语法,建立抽象语法树,并在xtext工具中用xtextgrammer language准确描述出来;
步骤2:采用xtend根据xtext grammar language书写的语法分析树,书写midcore到spark代码的映射规则,合称M2S框架;
步骤3:在xtext和xtend书写好的M2S框架中输入midcore代码,生成spark代码,提交运行;
步骤4:采用xtend根据xtext grammer language书写的语法分析树,书写midcore到hadoop代码的映射规则,合称M2H框架;
步骤5:在xtext和xtend书写好的M2H框架中输入midcore代码,生成hadoop代码,提交运行。
在步骤1中,我们用xtext书写了midcore的文法,基于此形成了midcore的语法树。图2展示了我们用xtext书写的部分文法,图3展示了我们的文法对应的语法树。书写和构建文法包括以下步骤:
步骤11:Model元素为语法树根节点,即总入口,包含了若干个Domain和Rule语句;
步骤12:Domain语句以”domain”为匹配关键字,含有若干个Source语句和Target语句;
步骤13:Source语句以”source”为匹配关键字,含有inputData元素,若干条Class语句;
步骤14:Target语句以”target”为匹配关键字,含有outputData元素,若干条Class语句;
步骤15:Class语句以class为匹配关键字,含有name和attributes元素,可选关键字abstract,extends,元素name,含有若干条Attribute,Format和Path语句;
步骤16:Attribute语句以”;”为匹配关键字,含有name和type元素;Path语句以”path”为关键字,含有value元素;Format以”fomat”为匹配关键字,含有value元素;
步骤17:Rule语句含有name元素,若干条Commad语句,Command语句分为Filter,Join,Deduplicate,Generate,StopClause语句,Reduce语句;
步骤18:Filter语句以”filter”为匹配关键字,含有元素result,name,attribute,type和value;
步骤19:Join语句以”join”为匹配关键字,含有元素tableCount,classname,keyname;
步骤110:Deduplicate语句以”deduplicate”为匹配关键字,含有attribute,result,name元素;
步骤111:Generate以”flatmap”或者”map”为匹配关键字,含有元素result,param,包括若干条Expression语句,Expression分为了Assignment,If_expression,Variable,ArithmicExpression语句几类,分别遵守OMG公布的OCL标准;
步骤112:Rduce语句以”reduce”作为匹配关键字,含有元素result和name;
步骤113:StopClause语句以”=”,”;”为匹配关键字,含有元素target_n和target_v;
基于MDE思想,DSL技术和代码生成技术,我们在eclipse的插件xtext上构建了一套由midcore生成spark代码的框架,成为M2S,图4是一个实例的midcore代码与生成的spark代码的主函数部分对照。midcore生成spark代码的步骤如下:
步骤2:采用xtend根据xtext grammar language书写的语法分析树,书写midcore到spark代码的映射规则,合称M2S框架;
步骤21:将Domain语句映射生成scala的数据类,Source语句生成输入数据类,加入输入数据解析的方法和输入路径,Target语句生成输出数据类,数据类的存放结构为ArrayList[Any]加入输出数据转化为文本的方法和输出路径,Class语句生成数据类的属性等信息;
步骤22:将Rule语句映射生成scala的一个名为Main的object的主函数,并加入配置SparkConf和SparkContext的语句,并在主函数当中调用输入数据类的输入数据解析方法;
步骤23:将Filter语句生成相应的spark代码,调用RDD的filter方法进行数据处理;
步骤24:将Join语句映射生成相应的spark代码,调用RDD语句先让源数据对应的RDD生成对应的PairFunctionRDD,然后这些PairFunctionRDD调用join方法进行若干次连接,PariFunctionRDD中的ArrayList[Any]调用+=操作进行ArrayList的合并;
步骤25:将Deduplicate语句映射生成相应的spark代码,调用RDD的map方法首先转化成PairFunctionRDD,再调用reduce方法进行去重操作,最后再调用map方法转换回RDD;
步骤26:将Generate语句映射生成相应的spark代码,调用RDD的map或者flatmap方法,在其中新建一个ArrayList[Any],把生成的数据添加到这个结构中;
步骤27:将StopClause语句映射生成最后的赋值语句,赋值给最终结果,并调用输出数据类的输出数据方法,进行输出数据。
步骤3:在xtext和xtend书写好的M2S框架中输入midcore代码,生成spark代码,提交运行;
步骤31:对M2S相应的xtext项目右键点击run as EclipseApplication,运行框架,在src文件夹中新建格式为midcore文本文件,输入midcore代码;
步骤32:框架自动生成scala代码,位于src-gen文件夹中;
步骤33:将自动生成的代码放入创建的scala项目中,将Main选定为主类,导出jar包,提交到spark集群即可运行处理数据。
基于MDE思想,DSL技术和代码生成技术,我们在eclipse的插件xtext上构建了一套由midcore生成hadoop代码的框架,成为M2S,图4是一个实例的midcore代码与生成的hadoop代码的主函数部分对照。midcore生成hadoop代码的步骤如下:
步骤41:将Rule对应生成Java的Main类和main函数,main函数包括了新创建一个hadoop的job。
步骤42:Domain里的Source和Target语句分别生成主类里面的两个静态方法,即输入数据的解析方法,将读入的文本数据按照格式进行解析,最终返回ArrayList[Object]类型;输出数据的解析方法将ArrayList类型转换按照要求的输出格式成文本进行输出;
步骤43:创建两轮Mapreduce处理过程,分别进行输入和输出操作,其中Map方法调用52中数据输入和输出方法,Reducer不做操作;
步骤44:对于Filter语句,在Hadoop创建一轮mapreduce迭代job,map方法将ArrayList[Object]调用parallelStream()方法转化成Stream再调用filter方法进行数据处理,reduce方法不做操作;
步骤45:对于Join语句,我们新建一轮mapreduce迭代过程job,在map函数中调用parallellStream()方法转化成Stream类型,之后调用map方法抽取出用于匹配的关键字作为key,reduce方法中对key匹配的两个ArrayList调用addAll操作进行合并,完成连接操作;
步骤46:对于Deduplicate语句映射成相应hadoop代码,在hadoop中创建一轮mapreduce过程job,map方法将ArrayList[Object]调用parallelStream()方法转化成Stream再调用Streams中的reduce方法进行数据处理,Reducer中的reduce方法不做操作;
步骤47:对于Generate语句,我们新建一轮hadoop的mapreduce过程,在map函数中调用parallellStream()方法转化成Streams类型,之后调用Streams中的generate方法,创建新的ArrayList,放入我们想生成的数据,reduce过程不做操作;
步骤48:对于reduce语句,我们新建一轮hadoop的mapreduce过程job,mapper类中抽取key,接着为其定义一个reducer,在reduce函数中将Iterable类型转换成Stream类型,然后调用reduce方法进行reduce操作
步骤49:最后添加输出数据的这轮mapreduce过程job,FileInputFormat和FileOutputFormat类添加输入和输出路径,形成完整的hadoop程序;
步骤5:在xtext和xtend书写好的M2H框架中输入midcore代码,生成hadoop代码,提交运行;
步骤51:在M2H相应的xtext项目右击选择run as Eclipse Application选项,运行M2H框架,在src文件夹中新建格式为midcore文本文件,输入midcore代码;
步骤52:框架自动生成java代码,位于src-gen文件夹中;
步骤53:将自动生成的代码放入创建的java项目中,将Main选定为主类,导出jar包,提交到hadoop集群即可运行处理数据。
以上所述仅是本发明的优选实施方式,应当指出:对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明权利要求书的保护范围。
机译: 一种用于将多声道音频信号转换为两声道音频信号的方法和设备,用于生成n声道音频信号并将该n声道音频信号提供给该设备的记录设备,包括计算机程序代码装置的计算机程序,该计算机程序代码装置适于执行以上方法以及计算机可读介质
机译: 程序代码生成装置,程序代码生成方法以及程序代码生成程序
机译: 程序代码生成装置,程序代码生成方法以及程序代码生成程序