自定义的可序列化的数据结构、hadoop集群、服务器及其应用方法与流程

文档序号:14689809发布日期:2018-06-15 16:48阅读:162来源:国知局
本发明涉及计算机应用领域,尤其涉及一种自定义的可序列化的数据结构及其应用方法。
背景技术
::现有Hadoop上的Writable数据类(例如Text,LongWritable,IntWritable,FloatWritable等)都是用于处理基础的、扁平化的数据类型的,而对于多层级的结构化数据,例如结构中嵌套结构,结构中包含列表的数据类型,目前想要传输及存储在Hadoop平台之上,只能使用Hadoop本身的一个bytesWritable类型,这个类本身无法解析数据,只可以传递数据。因此上述类型使用起来极为不便,用户要是想要使用某一个数据,必须先了解是那份数据,并且了解数据结构,才能解析这份数据,进而会带出数据字段版本不一样一系列的问题。ProtocolBuffers是一种轻便高效的结构化数据存储格式,可以用于结构化数据,即序列化数据,适合做数据存储或RPC数据交换格式。并可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。用户可以定义自己的数据结构,然后使用代码生成器生成的代码来读写这个数据结构。甚至可以在无需重新部署程序的情况下更新数据结构。只需使用ProtocolBuffers对数据结构进行一次描述,即可利用各种不同语言或从各种不同数据流中对结构化数据轻松读写。ProtocolBuffers有一个非常号的特性,即“向后”兼容性好,人们不必破坏已部署的、依靠“老”数据格式的程序就可以对数据结构进行升级。这样用户的程序就可以不必担心因为消息结构的改变而造成的大规模的代码重构或者迁移的问题,因为添加新的消息中的field并不会引起已经发布的程序的任何改变。Protobuf使用.proto文件对数据结构进行定义,方便管理,并且文件格式清楚,修改添加都很方便。ProtocolBuffers这样的数据结构在Hadoop平台上的传递有些问题,对于这样的数据结构并没有一种支持Hadoop序列化接口的对象,可以直接对数据进行操作,需要用户自己去对数据很多额外的处理,这样一来,工作成本就随之增加,需要对每一个使用数据的用户仔细介绍数据的内容,同时也增加了解析数据时的错误率,增加的一些额外的工作量也不能满足Writable机制紧凑、快速的优点。HadoopWritable接口是基于Datalnput(是一个用于从二进制流中读取字节的接口)和DataOutput(是一个用于向二进制流中写入字节的接口)实现的序列化协议,紧凑、快速,可以高效使用存储空间,切读写数据、序列化与反序列化的开销很小。Hadoop中的键(key)和值(value)必须是实现了Writable接口的对象。虽然Hadoop内建了多种Writable类提供用户选择,Hadoop对Java基本类型的包装Writable类实现的RawComparable接口,使得这些对象不需要反序列化过程,便可以在字节流层面进行排序,从而大大缩短了比较的时间开销,但是当需要更加复杂的对象时,Hadoop的内建Writable类就不能满足需求了,这时就需要定制自己的Writable类,特别将其作为键(key)的时候更应该如此,以求达到更高效的存储和快速的比较。实现一个用户自己定制的Writable类,首先必须实现Writable接口,然后为定制的Writable类编写方法write(一个Writable类的方法),用数据输出将字节内容写出到二进制流和readFields(一个Writable类的方法,用于数据输出将字节从二进制流中读取出来),从而可以控制定制的Writable类如何转化为字节流,以及如何从字节流转回为Writable对象。Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。Hive反序列化的过程:当进程在进行远程通信时,彼此可以发送各种类型的数据,无论是什么类型的数据都会以二进制序列的形式在网络上传送。发送方需要把对象转化为字节序列才可在网络上传输,称为对象序列化;接收方则需要把字节序列恢复为对象,称为对象的反序列化。Hive的SerDe就是用来做这种事情的,SerDe是”Serializer(序列化)”和”Deserializer(反序列化)”的简写,目的是用于序列化和反序列化。技术实现要素:本发明的目的是为了解决现有技术的不足,提供一种自定义的可序列化的数据结构及其应用方法,本发明的目的是通过以下技术方案实现的:一种自定义的可序列化的数据结构,包括数据内容与标记值类、标志值结构类、数据映射关系类,数据内容与标记值类、标志值结构类、数据映射关系类都使用Java语言实现,在数据的前端设置有数据源的标记内容。所述数据内容与标记值类用于解析数据标记值和数据内容。所述标记值结构类用于标记内容的读取、识别、写入,通过扫描xml格式的文件,加载一份对应的标记值,存储在内存中,后使用该类标记数据,用作数据识别。所述数据映射关系类用于储存和加载数据标记内容与不同数据的源的映射关系,以及数据标记内容与对应的Protobuf编译之后的类的映射关系。上述的自定义的可序列化的数据结构,其中,是基于Hadoop平台的Writable接口,可存储于Hadoop平台中、直接用于Hadoop平台上的数据读写的数据结构。上述的自定义的可序列化的数据结构,其中,使用Protobuf语言定义数据结构。上述的自定义的可序列化的数据结构,其中,其加载方法包括以下步骤:(1)数据映射关系类初始化:建立一套从proto文件编译之后的数据字段类,并建立到数据标记内容的映射;(2)加载数据:从读取的字节数据中,得到字节数据的数据标记内容,通过该标记内容,在数据映射关系类中找到其数据加载的类,通过查找后的内容,把该内容的剩下字节使用查到的数据加载类来加载成对应的数据类,最后返回一个Protobuf数据的子类。上述的自定义的可序列化的数据结构,其中,在数据读取时,将数据转化为Json格式或Base64格式的数据进行读取。上述的自定义的可序列化的数据结构,其中,还包括:Protobuf反序列化类,用来指定Hive的反序列化类;Protobuf结构对象分解读取类,用于表示每一次Hive在读取数据的过程中使用的分解读取类。一种hadoop集群,包括自定义的可序列化的数据结构,所述自定义的可序列化的数据结构包括数据内容与标记值类、标志值结构类、数据映射关系类,数据内容与标记值类、标志值结构类、数据映射关系类都使用Java语言实现,在数据的前端设置有数据源的标记内容。一种服务器,包括hadoop集群,所述hadoop集群包括自定义的可序列化的数据结构,所述自定义的可序列化的数据结构包括数据内容与标记值类、标志值结构类、数据映射关系类,数据内容与标记值类、标志值结构类、数据映射关系类都使用Java语言实现,在数据的前端设置有数据源的标记内容。本发明的数据结构可以用于Hadoop之上,本发明的数据结构搭载在hadoop集群上,Hadoop集群搭载多个服务器,服务器的系统都为linux系统。使用本发明的数据结构和方法,可以简化结构,使复杂的数据结构变得和一般Hadoop之上的数据结构一样。由于采用了上述技术方案,本发明自定义的数据结构既有Protobuf的特性,又有Writable的特性。同时也实现了在Hive中的反序列化接口,可以使其在Hive中的使用比一般的文本数据更加的方便、快捷,减少错误。同时在建立Hive表数据时候,可以不用关心数据结构,本发明的数据结构对象,可以自动检测字段格式,并且使用Protobuf的描述文件建立Hive数据表。附图说明图1是本发明一种自定义的可序列化的数据结构的示意图;图2是本发明一种自定义的可序列化的数据结构的加载方法的流程图。具体实施方式下面结合附图对本发明的具体实施方式作详细介绍,请参见图1、图2。本发明提供一种自定义的数据结构,可以使用Protobuf(ProtocolBuffers的简称)语言来定义结构,并可以使用Protobuf的结构来存储数据,满足了Protobuf所提供的优点,同时该数据结构继承于Hadoop平台的Writable接口,可存储于Hadoop平台中、可直接在Hadoop平台上对数据进行读写。本发明将这种数据结构对象定义为PBWritable。本发明自定义的可序列化的数据结构,包括数据内容与标记值类、标志值结构类、数据映射关系类,都使用Java语言实现,在数据的前端设置有数据源的标记内容。数据内容与标记值类用于解析数据标记值,同时解析数据内容。数据内容与标记值类的实现使用了Java中的泛型机制,泛型的本质是参数化类型,即所操作的数据类型被指定为一个参数。本类同时继承于Protobuf中的消息类型,因此本发明的数据结构首先是一个可以存储于Hadoop平台上的可以被序列化的数据结构,再其次,可以解析成程序内需要的数据类。解析过程是,首先在数据中拿到一个PBWritable数据结构,读取出该数据内容的前几位,将其解析成数据标记值,然后使用数据映射关系类中的映射关系加载成对应的数据内容。标记值结构类用于标记内容的读取、加载、识别、写入,通过扫描xml格式的文件,加载一份对应的标记值,存储在内存中,后使用该类标记数据,用作数据识别。数据映射关系类用于储存和加载数据标记内容与不同数据的源的映射关系,以及数据标记内容与对应的Protobuf编译之后的类的映射关系。该映射关系在类中使用键值对,键值对的主键是数据的标记值,键值对的值内容是应该加载的数据类对象,这里的数据类对象都是继承于Protobuf中的消息类型。在本类中,可通过获取数据的信息内容和标记内容,将数据的信息类转换成字节,写入到二进制流中,并可将一条Protobuf结构的数据转换成Json格式的数据。为了使不同数据的读取操作对用户是透明的,对不同数据源做一定的区分,将数据的前几个比特用来放置这个源的数据标记内容。在数据读入的时候有一个初始化过程,该过程就是数据映射关系类初始化的初始化的过程,这个过程在配置数据输出路径的同时配置了数据标记内容,方法为:建立一套从proto文件编译之后的数据字段类,并建立到数据标记内容的映射。在加载数据的过程中,会读取到一堆字节,获取前端特定字节的内容,是这一堆字节数据的数据标记内容,通过该标记内容,在数据映射关系类中找到其数据加载的类,通过查找后的内容,把该内容的剩下字节使用查到的数据加载类来加载成对应的数据类,最后返回一个Protobuf数据的子类,就完成一条数据的自动加载。本发明的数据读入和写入的整个过程对于用户来说都是透明的,当用户读入PBWritable的数据类型时,可以使用GetMessage方法,得到读入数据对应的类,由于本发明使用的是Java的反射机制,所以用户使用数据时,需要做一次强制转换,如果用户转换错误,那么证明用户设置的输入数据有问题。同时对于一串数据写入到PBWritable结构也是一样,使用SetMessage方法,生成一个PBWritable数据并且写入到HDFS上去。为了满足特殊方法读取本发明的数据结构,本发明设计了两种hadoop的数据读入方式,分别是Json格式和Base64格式的。在设计Json格式数据时,在读入阶段,设计一段逻辑,结合递归的方式,将读取到的Protobuf类型的数据,转换成一条Json格式的数据,然后传入到之后的操作阶段中。通过本方法将每一条由比特位组成的数据,使用Json的键值对的方式展示出来。本方法的实现,主要是通过递归解析一条数据的数据结构,当数据字段是基础类型(例如int,string,float等),就将数据连着字段名称一起解析出来(字段名称:字段内容),而当数据字段还是一个结构体的时候,就调用自身继续向下一层解析。在设计Base64的数据格式时,由于Hadoop数据有自己的一套读取方法,对于Protobuf的数据结构,是由多种的字节内容数据组成,很难正确读取的。因为,Hadoop自带的读取方式会按照特殊字符来切割一条数据,这种切割方式对普通的文本数据没有问题,但是对本发明自定义的数据结构来说,Hadoop会按照错误的方式切割,导致进入到处理逻辑中的字节都是错误的,这样会使大多数的字节内容都解不开。对于这样的机制,本发明设计一个新的读入方式的来传递字节流数据到Mapreduce中,原理是,将Java可识别的一条字节数据,通过Base64转换之后再传入到后续操作中,这样用户在拿到数据之后,只要对数据进行Base64解码,然后再解析成需要的数据即可。本发明自定义的数据结构,与一般Hive支持的数据结构有所不同,为了可以在Hive中对数据进行一系列的操作,本发明还需要实现PBWritable数据在Hive中的序列化反序列化。由于在本发明中,只需要在Hive中做到将HDFS中的数据读取出来即可,所以只需要实现Hive中的反序列化的过程。本发明设置了一个Protobuf反序列化类,用来指定Hive的反序列化类,同时本发明也设置了一个Protobuf结构对象分解读取类,用于表示每一次Hive在读取数据的过程中使用对象分解读取类。对象分解读取类解耦了数据使用和数据格式,从而提高了代码的复用程度。对象分解读取接口使得Hive可以不拘泥于一种特定数据格式,使得数据流可以在输入端和输出端切换不同的输入/输出格式,在不同的解析结构上使用不同的数据格式。Protobuf反序列化类可用于初始化读取当前Hive表需要的数据结构信息,以及定义数据返回的格式,返回的对象是本发明自定义的Protobuf结构对象分解读取类,后续的每一次数据读取,都是通过定义的这个类来进行每个字段结构的操作。Protobuf反序列化类的另一个作用是实现PBWritable数据在Hive中的反序列化,该方法的参数是一个Writable的数据,将数据转换成对应的Protobuf内容。Protobuf结构对象分解读取类中定义了对各种数据类型的数据方式以及返回类型,不仅仅是已知的数据类型,还可以对结构体数据进行读取,在Hive中,当看到一个结构体,可以使用“.”这个字符访问其内部结构,层级没有限制,可以一直嵌套读取下去。本发明的数据结构在Hive中的实现是使用Java语言,继承与Hive的基类抽象序列化类与结构体对象分解读取类。继承抽象序列化类主要是为了在数据第一次读取的时候,hive会先调用这个类,来找到对应的数据格式,在本发明中,需要重写这个初始化的过程,即用户在使用hive读取数据的时候,hive第一次会加载存储于Mysql数据库中的SERIALIZATION_CLASS字段的内容,使用读取到的内容作为类名,并且通过这个类名来加载这个数据的数据格式。继承构体对象分解读取类是为了对数据进行解析,解析主要分为两个部分,一部分是解析基本类型的字段,另一部分是解析结构化类型的字段。对于基本类型字段,在程序中,可以直接解析对应的Writable的基本类型(例如Text,LongWritable,IntWritable,FloatWritable等),这样数据内容可以直接被读出。而作为结构化的数据类型,在读取的时候采用的是递归的加上循环的逻辑,如果当前的类型依旧是结构化的,那就调用程序本身,如果不是,则调用基本类型解析的方法,来解析数据。本发明还包括:一种hadoop集群,包括自定义的可序列化的数据结构,自定义的可序列化的数据结构包括数据内容与标记值类、标志值结构类、数据映射关系类,数据内容与标记值类、标志值结构类、数据映射关系类都使用Java语言实现,在数据的前端设置有数据源的标记内容。本发明还包括:一种服务器,包括hadoop集群,hadoop集群包括自定义的可序列化的数据结构,自定义的可序列化的数据结构包括数据内容与标记值类、标志值结构类、数据映射关系类,数据内容与标记值类、标志值结构类、数据映射关系类都使用Java语言实现,在数据的前端设置有数据源的标记内容。本发明的数据结构可以用于Hadoop之上,本发明的数据结构搭载在hadoop集群上,Hadoop集群搭载多个服务器,服务器的系统都为linux系统。使用本发明的数据结构和方法,可以简化结构,使复杂的数据结构变得和一般Hadoop之上的数据结构一样。本发明可通过加载Mysq中对应的SERIALIZATION_CLASS字段内容,来加载对应的数据结构,通过该数据结构来检查整张表的数据格式。由于本发明在HDFS中注入了新的数据结构,因此想要使用Hadoop命令行查看部分数据的命令就无法再使用了,对于这样的情况,本发明设计一种新的数据读取方式,不仅可以满足以前的要求,而且可以在数据字段过多的时候,满足用户可以挑选查看个别数据字段的需求,这样可以使数据看起来更清晰,同时也满足数据的嵌套读取。本发明可以使用命令行展示HDFS中的PBWritable数据,命令行展示数据主要分为两部分:第一部分是通过自定义的脚本调用一段Java程序,即通过一个关键字来加载注册的命令行脚本,例如关键字pb2json,加上路径/bh/etl_output/sina_mapping/2016/01/17,就可以调用一段Java程序,会将该路径下的内容按照顺序解析成一条条记录,每条记录都以Json的格式展示;第二部分是,命令行调用的程序递归解析数据内容。本发明可以根据用户挑选需要输出的字段来进行展示,例如:pb2json/bh/etl_output/sina_mapping/2016/01/17company_id,这样在输出的内容就只会出现要求的这一个字段。这种输出同时还支持嵌套格式的内容输出,例如:b2json/bh/etl_output/sina_mapping/2016/01/17adslot_id.id就可以输出adslot这个结构的id内容。该功能实现的方法为:在递归输出的时候,对字段名称进行检查。如果当前字段名称是参数中提供的就输出,不是就不输出。本发明的数据结构与Hive中的数据数据结构可以直接对接,无论是在建表的过程中,还是查询的过程中,都可以直接依托于数据自身结构,例如在Hive中建表时,直接根据表名称的大写加载内存中的对应的数据的字段,即可建立对应的表结构,并且该数据结构在Hive中也支持嵌套类型的数据结构。本发明有以下优点和有益效果:1、本发明实现了基于Writable接口、以Protobuf为结构的数据结构体;因此可以作为键值对的值直接操作。2、本发明可以按照Base64加密的方式读取、或按照Json的格式读取。3、本发明可使用自定义的命令行自动检测数据字段,并且以Json数据格式展示。4、本发明可使用自定义的命令行自动检测数据字段,并且挑选字段读取展示。5、本发明实现了在Hive中反序列化过程,可直接在hive中使用数据。6、本发明在Hive中可以检测数据结构,自动建立表结构。7、通过设置源的数据标记内容,可以根据数据标记内容动态加载数据的数据结构。8、本发明在Hive中读取时支持嵌套结构,并且可以使用Hql查询任意嵌套结构的数据。以上所述的实施例仅用于说明本发明的技术思想及特点,其目的在于使本领域内的技术人员能够了解本发明的内容并据以实施,不能仅以本实施例来限定本发明的专利范围,即凡依本发明所揭示的精神所作的同等变化或修饰,仍落在本发明的专利范围内。当前第1页1 2 3 当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1