读取和写入用于hadoop计算的数据的方法和系统的制作方法

文档序号:6551653阅读:133来源:国知局
读取和写入用于hadoop计算的数据的方法和系统的制作方法
【专利摘要】提供一种读取和写入用于HADOOP计算的数据的方法和系统。一种从非HADOOP分布式文件系统(HDFS)读取用于HADOOP计算的输入数据的方法,其特征在于,所述方法包括:定义用于从所述非HDFS读取数据的数据读取类,所述数据读取类继承RecordReader类;实现在HADOOP分布式计算模型中的InputFormat类中的getRecordReader方法和getSplits方法。其中,在实现的getRecordReader方法中,创建定义的数据读取类的实例或对象并返回所述实例或对象,并且在实现的getSplits方法中,将从调用的getRecordReader方法返回的RecordReader实例或对象确认为定义的数据读取类的实例或对象。本发明剥离了HADOOP对HDFS的强烈依赖,减少了数据的读取次数、复制次数并且节省了存储空间和处理时间。
【专利说明】读取和写入用于HADOOP计算的数据的方法和系统

【技术领域】
[0001]本发明涉及一种用于分布式计算的技术,尤其涉及一种处理用于分布式计算的数据的方法和系统。

【背景技术】
[0002]分布式计算平台是基于分布式存储平台之上存在的,用于处理分布式存储平台中的数据。近年来较盛行的MapReduce计算模型能够利用分布式的计算能力处理大数据,这一便利性也激发了数据的计算需求。
[0003]然而,MapReduce计算模型也存在例如分布式的计算平台和存储平台强绑定的制约性。以作为一种MapReduce计算模型的具体实现的HADOOP为例,HADOOP计算平台要求其所计算的数据必须存储于与之强绑定的存储平台(即HDFS)上。这就给HADOOP的具体应用带来了不便:有大量的数据存储在hdfs之外的已有存储系统之上,这些数据有计算的需求,却缺乏计算的资源。
[0004]在这种情况下,目前通常的做法是,从一个存储系统上将数据传输到HDFS上,然后在HDFS上触发计算,计算完成后再将计算结果传输会原有的存储系统上。这就带来了巨大的消耗,浪费了大量的存储空间(例如需要存储2份以上的数据)、传输带宽(大量的数据传输占用带宽)和处理时间(因为在处理中存在很多单点,造成整体耗时较大)。


【发明内容】

[0005]本发明的实施例提供一种读取和写入用于HADOOP计算的数据的方法和系统,在HADOOP计算模型的应用中提供与非HDFS存储系统的存取接口,在分布式计算中可直接存取非HDFS存储系统中的数据,剥离HADOOP对HDFS的强烈依赖,从而节省存储空间和处理时间。
[0006]为达到上述目的,本发明的实施例采用如下技术方案:
[0007]一种从非HADOOP分布式文件系统(HDFS)读取用于HADOOP计算的输入数据的方法,其特征在于,所述方法包括:定义用于从所述非HDFS读取数据的数据读取类,所述数据读取类继承RecordReader类;实现在HADOOP分布式计算模型中MapReduce框架的InputFormat类中的getRecordReader方法和getSplits方法。其中,在实现的getRecordReader方法中,创建定义的数据读取类的实例或对象并返回所述实例或对象,并且在实现的getSplits方法中,将从调用的getRecordReader方法返回的RecordReader实例或对象确认为定义的数据读取类的实例或对象。
[0008]一种将HADOOP计算的输出数据写入非HDFS的方法,其特征在于,所述方法包括:定义用于将所述输出数据写入所述非HDFS的数据写入类,所述数据写入类继承RecordWriter类;实现在HADOOP分布式计算模型中OutputFormat类中的getRecordWriter方法。其中,在实现的getRecordWriter方法中,仓Ij建定义的数据写入类的实例或对象并返回所述实例或对象。
[0009]一种从非HDFS读取用于HADOOP计算的输入数据的系统,其特征在于,所述系统包括:读取类定义模块,用于定义用于从所述非HDFS读取数据的数据读取类,所述数据读取类继承RecordReader类;读取方法实现模块,用于实现在HADOOP分布式计算模型中的InputFormat类中的getRecordReader方法和getSplits方法。其中,在实现的getRecordReader方法中,读取方法实现模块创建读取类定义模块定义的数据读取类的实例或对象并返回所述实例或对象,并且在实现的getSplits方法中,读取方法实现模块将从调用的getRecordReader方法返回的RecordReader实例或对象确认为定义的数据读取类的实例或对象。
[0010]一种将HADOOP计算的输出数据写入非HDFS的系统,其特征在于,所述系统包括:写入类定义模块,用于定义用于将所述输出数据写入所述非HDFS的数据写入类,所述数据写入类继承RecordWriter类;写入方法实现模块,用于实现在HADOOP分布式计算模型中的OutputFormat类中的getRecordWriter方法。其中,在实现的getRecordWriter方法中,写入方法实现模块创建定义的数据写入类的实例或对象并返回所述实例或对象。
[0011]本发明的从非HDFS读取用于HAD00P计算的输入数据的方法、将HAD00P计算的输出数据写入非HDFS的方法以及使用所述方法的系统提供HAD00P与非HDFS存储系统的软件接口,当用户程序使用HAD00P执行分布式计算时,定制实现的InputFormat和/或OutputFormat类的方法被调用,返回定制的数据读取类和/或数据写入类的对象或实例,从而HAD00P可通过所述数据读取类和/或数据写入类的对象或实例执行非HDFS上的数据读取和/或写入。这样,剥离了 HAD00P对HDFS的强烈依赖,减少了数据的读取次数、复制次数并且节省了存储空间和处理时间。

【专利附图】

【附图说明】
[0012]图1为现有技术与根据本发明的方法处理非HDFS存储系统上的数据的对比示意图;
[0013]图2为根据本发明的示例性实施例从非HDFS读取用于HAD00P计算的输入数据的方法的流程图;
[0014]图3为根据本发明的示例性实施例将HAD00P计算的输出数据写入非HDFS的方法的流程图;
[0015]图4为根据本发明的示例性实施例从非HDFS读取用于HAD00P计算的输入数据的系统的逻辑框图;
[0016]图5为根据本发明的示例性实施例将HAD00P计算的输出数据写入非HDFS的系统的逻辑框图。

【具体实施方式】
[0017]下面结合附图对本发明实施例读取和写入用于HAD00P计算的数据的方法和系统进行详细描述。
[0018]图1为现有技术与根据本发明的方法处理非HDFS存储系统上的数据的对比示意图。在图1中,以网络文件系统(NFS)作为非HDFS的示例,但是本发明的普通技术人员通过以下参照图1?图5对本发明的实施例的描述可以理解,本发明的总体构思适用于任何HDFS以外的数据存储系统。
[0019]图1上端示出根据现有技术用于处理非HDFS存储系统上的数据的数据流向。如图所示,当利用HADOOP计算模型需要处理存储在非HDFS (如NFS)上的数据时,需要操作的客户端从NFS读取所述NFS上的数据,然后再将所述数据复制到HDFS上,这期间所述数据经过读取、复制两次处理,并且由于客户端需要通过其上的网卡从NFS执行数据读取,其成为单机节点的瓶颈。此后,HADOOP对复制到HDFS上的数据执行分布式计算。在完成计算后,操作的客户端还需将结果数据传输到NFS上,其间所述数据同样经过复制、写入两次处理,客户端同样成为单机节点的瓶颈。因此,在现有技术的处理方案中,对非HDFS存储系统上的数据的处理需要经过六次处理,并且其中有四次处理存在单机瓶颈。
[0020]图1下端示出根据本发明的方法处理非HDFS存储系统上的数据的数据流向。在HADOOP分布式计算模型的MapReduce框架中,通过InputFormat类从HDFS上读取数据并输入到用户程序中,另一方面,通过OutputFormat类将用户程序的输出数据写入到HDFS。通过定制InputFormat类和OutputFormat类的方法,使得用户程序可直接从NFS读取计算所需的数据进行处理,并且可将计算所得的输出数据直接写入NFS。这样,对非HDFS存储系统上的数据仅执行两次处理,并且不存在单机瓶颈。
[0021]图2为根据本发明的示例性实施例从非HDFS读取用于HADOOP计算的输入数据的方法的流程图。
[0022]参照图2,在步骤S210,定义用于从非HDFS读取数据的数据读取类,所述数据读取类继承RecordReader类。例如,在C++程序中,定义数据读取类classNfsLineRecordReader: public RecordReader ;或者在 Java 程序中,定义数据读取类 classNfsLineRecordReader extends RecordReader。在所述数据读取类中,还定义用于访问某种非HDFS上的数据的数据变量和方法/函数成员。本领域普通技术人员可容易地定义用于访问某种非HDFS上的数据的所述数据读取类。
[0023]在步骤S220,实现在HADOOP分布式计算模型中MapReduce框架的InputFormat类中的getRecordReader方法和getSplits方法。在开源HADOOP中的InputFormat类中,定义了 getRecordReader O和getSplits O两个抽象方法。为了将在步骤S210定义的数据读取类与HADOOP接口,在实现的getRecordReader方法中,仓Il建定义的数据读取类的实例或对象并返回所述实例或对象,并且在实现的getSplits方法中,将从调用的getRecordReader方法返回的RecordReader实例或对象确认为定义的数据读取类的实例或对象。
[0024]通过步骤S210和S220的处理,当用户程序使用HADOOP执行分布式计算时,在步骤S220实现的InputFormat类的getRecordReader方法和getSplits方法被调用,并且当getRecordReader方法被调用时,返回定制的数据读取类的对象或实例,从而HAD00P可通过所述数据读取类的对象或实例执行非HDFS上的数据读取。这样,剥离了 HAD00P对HDFS的强烈依赖,并且节省存储空间和处理时间。
[0025]根据本发明的可选实施例,所述非HDFS为NFS。
[0026]根据本发明的优选实施例,所述方法还包括:配置HAD00P应用从所述非HDFS上指定的位置读取所述输入数据。例如,如下配置HAD00P的运行脚本:
[0027]./hadoop fs - rmr/home/diskO/mapreducenfs/client/mnt/testoutputlO
[0028]rm - rf/home/diskO/mapreducenfs/client/mnt/testoutputlO
[0029]./hadoop hce-mapper runner, sh-reducer./wordcount-demo-f i Ierunner.sh - file./wordcount-demo -1nput file:///home/diskO/mapreducenfs/client/mnt/hadoop-1ntern a1-output/home/diskO/mapreducenfs/client/mnt/testoutputlO-jobconf keep, failed, task, files = true-jobconf mapred.reduce, tasks=I
[0030]通过上述配置,指定从/mnt/hadoop-1nternal文件读取输入数据,并且将输出数据写入NFS系统上的/mnt/testoutput,由此可动态地指定输入数据和输出数据的位置。
[0031]图3为根据本发明的示例性实施例将HADOOP计算的输出数据写入非HDFS的方法的流程图。
[0032]参照图3,在步骤S310,定义用于将所述输出数据写入所述非HDFS的数据写入类,所述数据写入类继承RecordWriter类。例如,在C++程序中,定义数据数据写入类class NfsLineRecordffriter: publ ic Recordffriter ;或者在 Java 程序中,定义数据写入类cIassNfsLineRecordffriter extends RecordWriter。在所述数据写入类中,还定义用于访问某种非HDFS上的数据的数据变量和方法/函数成员。本领域普通技术人员可容易地定义用于访问某种非HDFS上的数据的所述数据写入类。
[0033]在步骤S320,实现在HADOOP分布式计算模型中MapReduce框架的OutputFormat类中的getRecordWriter方法。在开源HADOOP中的OutputFormat类中,定义了getRecordWriter O抽象方法。为了将在步骤S310定义的数据写入类与HADOOP接口,在实现的getRecordWriter方法中,仓Il建定义的数据写入类的实例或对象并返回所述实例或对象。
[0034]通过步骤S310和S320的处理,当用户程序使用HADOOP执行分布式计算时,在步骤 S320 实现的 OutputFormat 类的 getRecordWriter 方法被调用,并且当 getRecordWriter方法被调用时,返回定制的数据写入类的对象或实例,从而HADOOP可通过所述数据写入类的对象或实例执行非HDFS上的数据写入。这样,剥离了 HADOOP对HDFS的强烈依赖,并且节省存储空间和处理时间。
[0035]根据本发明的可选实施例,所述非HDFS为NFS。
[0036]根据本发明的优选实施例,所述方法还包括:配置HADOOP应用将所述输出输入写入所述非HDFS上指定的位置。例如,如下配置HADOOP的运行脚本:
[0037]./hadoop fs - rmr/home/diskO/mapreducenfs/client/mnt/testoutputlO
[0038]rm - rf/home/diskO/mapreducenfs/client/mnt/testoutputlO
[0039]./hadoop hce-mapper runner, sh-reducer./wordcount-demo-f i Ierunner.sh - file./wordcount-demo -1nput file:///home/di skO/mapreducenfs/client/mnt/hadoop-1ntern a1-output/home/di skO/mapreducenf s/client/mnt/testoutputlO-jobconf keep, failed, task, files = true-jobconf mapred.reduce, tasks=I
[0040]通过上述配置,指定从/mnt/hadoop-1nternal文件读取输入数据,并且将输出数据写入NFS系统上的/mnt/testoutput,由此可动态地指定输入数据和输出数据的位置。
[0041]所述从非HDFS读取用于HADOOP计算的输入数据的方法和将HADOOP计算的输出数据写入非HDFS的方法可在同一系统中实现。
[0042]图4为根据本发明的示例性实施例从非HDFS读取用于HADOOP计算的输入数据的系统的逻辑框图。
[0043]参照图4,所述从非HDFS读取用于HADOOP计算的输入数据的系统包括读取类定义模块410和读取方法实现模块420。
[0044]读取类定义模块410用于定义用于从所述非HDFS读取数据的数据读取类,所述数据读取类继承RecordReader类。
[0045]读取方法实现模块420用于实现在HADOOP分布式计算模型中MapReduce框架的InputFormat类中的getRecordReader方法和getSplits方法。其中,在实现的getRecordReader方法中,读取方法实现模块420创建读取类定义模块410定义的数据读取类的实例或对象并返回所述实例或对象,并且在实现的getSplits方法中,读取方法实现模块420将从调用的getRecordReader方法返回的RecordReader实例或对象确认为定义的数据读取类的实例或对象。
[0046]根据本发明的优选实施例,所述系统还包括应用配置模块(未示出),应用配置模块用于配置HADOOP应用从所述非HDFS上指定的位置读取所述输入数据。
[0047]所述非HDFS可以是NFS。
[0048]图5为根据本发明的示例性实施例将HADOOP计算的输出数据写入非HDFS的系统的逻辑框图。
[0049]参照图5,所述将HADOOP计算的输出数据写入非HDFS的系统包括写入类定义模块510和写入方法实现模块520。
[0050]写入类定义模块510用于定义用于将所述输出数据写入所述非HDFS的数据写入类,所述数据写入类继承RecordWriter类。
[0051]写入方法实现模块520用于实现在HADOOP分布式计算模型中MapReduce框架的OutputFormat类中的getRecordWriter方法。其中,在实现的getRecordWriter方法中,写入方法实现模块520创建定义的数据写入类的实例或对象并返回所述实例或对象。
[0052]根据本发明的优选实施例,所述系统还包括应用配置模块(未示出),所述应用配置模块用于配置HAD00P应用将所述输出输入写入所述非HDFS上指定的位置。
[0053]所述非HDFS可以是NFS。
[0054]所述从非HDFS读取用于HADOOP计算的输入数据的系统和将HADOOP计算的输出数据写入非HDFS的系统可在同一系统中实现。
[0055]通过前述参照附图描述的本发明的示例性实施例可以看出,本发明的从非HDFS读取用于HADOOP计算的输入数据的方法、将HADOOP计算的输出数据写入非HDFS的方法以及使用所述方法的系统提供HADOOP与非HDFS存储系统的软件接口,当用户程序使用HADOOP执行分布式计算时,定制实现的InputFormat和/或OutputFormat类的方法被调用,返回定制的数据读取类和/或数据写入类的对象或实例,从而HADOOP可通过所述数据读取类和/或数据写入类的对象或实例执行非HDFS上的数据读取和/或写入。这样,剥离了 HADOOP对HDFS的强烈依赖,减少了数据的读取次数、复制次数并且节省了存储空间和处理时间。在线下测试中,根据本发明的技术方案对50G数据的数据处理在性能上提高100倍以上,并且所述性能的提高随着数据量的增加呈指数增长。
[0056]以上所述,仅为本发明的【具体实施方式】,但本发明的保护范围并不局限于此,任何熟悉本【技术领域】的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。
【权利要求】
1.一种从非HADOOP分布式文件系统(HDFS)读取用于HADOOP计算的输入数据的方法,其特征在于,所述方法包括: 定义用于从所述非HDFS读取数据的数据读取类,所述数据读取类继承RecordReader类; 实现在HADOOP分布式计算模型中的InputFormat类中的getRecordReader方法和getSplits 方法, 其中,在实现的getRecordReader方法中,创建定义的数据读取类的实例或对象并返回所述实例或对象,并且在实现的getSpli ts方法中,将从调用的getRecordReader方法返回的RecordReader实例或对象确认为定义的数据读取类的实例或对象。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括:配置HADOOP应用从所述非HDFS上指定的位置读取所述输入数据。
3.根据权利要求2所述的方法,其特征在于,所述非HDFS为网络文件系统(NFS)。
4.一种将HADOOP计算的输出数据写入非HDFS的方法,其特征在于,所述方法包括: 定义用于将所述输出数据写入所述非HDFS的数据写入类,所述数据写入类继承Recordffriter 类; 实现在HADOOP分布式计算模型中的OutputFormat类中的getRecordWriter方法,其中,在实现的getRecordWriter方法中,仓ll建定义的数据写入类的实例或对象并返回所述实例或对象。
5.根据权利要求4所述的方法,其特征在于,所述方法还包括:配置HAD00P应用将所述输出输入写入所述非HDFS上指定的位置。
6.根据权利要求5所述的方法,其特征在于,所述非HDFS为NFS。
7.一种从非HDFS读取用于HAD00P计算的输入数据的系统,其特征在于,所述系统包括: 读取类定义模块,用于定义用于从所述非HDFS读取数据的数据读取类,所述数据读取类继承 RecordReader 类; 读取方法实现模块,用于实现在HAD00P分布式计算模型中的InputFormat类中的getRecordReader 方法和 getSplits 方法, 其中,在实现的getRecordReader方法中,读取方法实现模块创建读取类定义模块定义的数据读取类的实例或对象并返回所述实例或对象,并且在实现的getSplits方法中,读取方法实现模块将从调用的getRecordReader方法返回的RecordReader实例或对象确认为定义的数据读取类的实例或对象。
8.根据权利要求7所述的系统,其特征在于,所述系统还包括:应用配置模块,用于配置HAD00P应用从所述非HDFS上指定的位置读取所述输入数据。
9.根据权利要求8所述的系统,其特征在于,所述非HDFS为NFS。
10.一种将HAD00P计算的输出数据写入非HDFS的系统,其特征在于,所述系统包括: 写入类定义模块,用于定义用于将所述输出数据写入所述非HDFS的数据写入类,所述数据写入类继承RecordWriter类; 写入方法实现模块,用于实现在HAD00P分布式计算模型中的OutputFormat类中的getRecordWriter 方法,其中,在实现的getRecordWriter方法中,写入方法实现模块创建定义的数据写入类的实例或对象并返回所述实例或对象。
11.根据权利要求10所述的系统,其特征在于,所述系统还包括:应用配置模块,用于配置HADOOP应用将所述输出输入写入所述非HDFS上指定的位置。
12.根据权利要求11 所述的系统,其特征在于,所述非HDFS为NFS。
【文档编号】G06F17/30GK104050290SQ201410305744
【公开日】2014年9月17日 申请日期:2014年6月30日 优先权日:2014年6月30日
【发明者】杨斐 申请人:百度在线网络技术(北京)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1