一种基于Flume的解析半结构化文本文件的数据的方法与流程

文档序号:12271479阅读:366来源:国知局
本发明涉及计算机软件应用
技术领域
:,具体涉及一种基于Flume的解析半结构化文本文件的数据的方法,通过定义业务个性化的数据读取规则、数据解析规则,将Flume应用于半结构化文本文件的采集、解析转换,采用Flume定制各种数据接受方的能力,将处理后的文本文件数据按条发送到各种数据接受方。
背景技术
::Flume是一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume具有提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。Flume提供了源SpoolingDirectorySource,简称spooldir,主要功能是读取指定目录下的文本文件,转换为Flume事件,通过通道发送到各种数据接受方。Flume提供的源spooldir功能只支持:a)按行读取文件;b)一次读取整个文本文件;c)读取avro文本文件。但在实际的业务场景中,业务数据常以半结构的形式存在,比如:a)文本文件中一行是一条记录,一条记录的格式为JSON;b)文本文件中一行是一条记录,一条记录由多个字段组成,字段之间用分隔符分隔;c)文本文件中多行是一条记录,一条记录以特殊标识作为起始,一条记录中一行是一个字段,一个字段由Key、Value构成,有效内容是Value。类似格式的半结构化文本文件采用已有的Flume源spooldir提供的功能及解析规则无法实现。将一种基于Flume的解析半结构化文本文件的数据的通用方法应用于Flume中,能够便捷地采用Flume采集业务个性化的半结构文本文件数据,再使用Flume定制各种数据接受方的能力,能够方便地将解析后的数据发送大数据存储(如HBase、Hive、ElasticSearch)中进行存储、计算、索引。技术实现要素:本发明要解决的技术问题是:本发明针对以上问题,提供一种基于Flume的解析半结构化文本文件的数据的方法。本发明所采用的技术方案为:一种基于Flume的解析半结构化文本文件的数据的方法,所述方法采用Flume的spooldir采集文件数据时,根据业务规则读取一条业务数据,对每条业务数据进行解析转换,能够便捷地根据业务数据特性定制常见的文件解析规则;通过新建Flume事件序列化类,实现Flume接口EventDeserializer,在该类中按照Flume的conf文件配置的规则读取半结构化文本文件的每条数据,针对每条数据,再按照Flume的conf文件配置的数据解析规则类进行解析转换,最终输出符合业务需要的一条数据。如:a)文本文件中一行是一条记录,一条记录的格式为JSON;b)文本文件中一行是一条记录,一条记录由多个字段组成,字段之间用分隔符分隔;c)文本文件中多行是一条记录,一条记录以特殊标识作为起始,一条记录中一行是一个字段,一个字段由Key、Value构成,有效内容是Value。所述方法操作步骤如下:1)自定义接口IBdeEventParser;2)根据业务数据的规则,自定义文本文件解析类,实现自定义接口IBdeEventParser;3)新建Flume事件序列化类BdeLineDeserializer,实现Flume接口EventDeserializer。所述接口IBdeEventParser描述如下:publicinterfaceIBdeEventParser{publicvoidbuild(Contextcontext);publicEventhandleEvent(Eventevent);}其中build(Contextcontext):用于从Flume的上下文Context中获取Flume的conf文件配置的解析规则;handleEvent(Eventevent):用于根据Flume的conf文件配置的解析规则对Flume的每条数据进行解析转换。构造BdeLineDeserializer(Contextcontext,ResettableInputStreamin)过程如下:1)读取Flume的conf文件中配置的文本文件解析类,配置eventParser项,值为自定义接口IBdeEventParser的一个实现类;2)实例化eventParser配置的解析类,并调用方法build(Contextcontext)进行初始化;3)在readEvents(intnumEvents)中,调用readEvent()获取一个Flume事件,若Flume配置了文本文件解析类则调用文本文件解析类的方法handleEvent(Eventevent),对每条数据进行解析转换;Flume没有配置文本文件解析类则不解析4)在readEvent()中,读取Flume的conf文件中配置的一条记录的正则表达式,配置项为filePattern,若配置了正则表达式则按照正则表达式读取一条记录;若没有配置正则表达式则读取一行作为一条记录,其中一条记录序列化为一个Flume事件Event。本发明的有益效果为:本发明能够最大可能地复用,减少开发工作量,普遍适用于采用Flume采集、解析转换半结构化文本文件数据的场景。附图说明图1为本发明自定义序列化类的示意图;图2为本发明自定义接口类的示意图。具体实施方式下面结合附图,根据具体实施方式对本发明进一步说明:实施例1:一种基于Flume的解析半结构化文本文件的数据的方法,所述方法采用Flume的spooldir采集文件数据时,根据业务规则读取一条业务数据,对每条业务数据进行解析转换,能够便捷地根据业务数据特性定制常见的文件解析规则;通过新建Flume事件序列化类,实现Flume接口EventDeserializer,在该类中按照Flume的conf文件配置的规则读取半结构化文本文件的每条数据,针对每条数据,再按照Flume的conf文件配置的数据解析规则类进行解析转换,最终输出符合业务需要的一条数据。如:a)文本文件中一行是一条记录,一条记录的格式为JSON;b)文本文件中一行是一条记录,一条记录由多个字段组成,字段之间用分隔符分隔;c)文本文件中多行是一条记录,一条记录以特殊标识作为起始,一条记录中一行是一个字段,一个字段由Key、Value构成,有效内容是Value。实施例2在实施例1的基础上,本实施例所述方法操作步骤如下:1)自定义接口IBdeEventParser;2)根据业务数据的规则,自定义文本文件解析类,实现自定义接口IBdeEventParser;3)新建Flume事件序列化类BdeLineDeserializer,实现Flume接口EventDeserializer。实施例3如图1所示,在实施例2的基础上,本实施例所述接口IBdeEventParser描述如下:publicinterfaceIBdeEventParser{publicvoidbuild(Contextcontext);publicEventhandleEvent(Eventevent);}其中build(Contextcontext):用于从Flume的上下文Context中获取Flume的conf文件配置的解析规则;handleEvent(Eventevent):用于根据Flume的conf文件配置的解析规则对Flume的每条数据进行解析转换。实施例4在实施例2的基础上,本实施例构造BdeLineDeserializer(Contextcontext,ResettableInputStreamin)过程如下:1)读取Flume的conf文件中配置的文本文件解析类,配置eventParser项,值为自定义接口IBdeEventParser的一个实现类,如图2所示;2)实例化eventParser配置的解析类,并调用方法build(Contextcontext)进行初始化;3)在readEvents(intnumEvents)中,调用readEvent()获取一个Flume事件,若Flume配置了文本文件解析类则调用文本文件解析类的方法handleEvent(Eventevent),对每条数据进行解析转换;Flume没有配置文本文件解析类则不解析4)在readEvent()中,读取Flume的conf文件中配置的一条记录的正则表达式,配置项为filePattern,若配置了正则表达式则按照正则表达式读取一条记录;若没有配置正则表达式则读取一行作为一条记录,其中一条记录序列化为一个Flume事件Event。实施例5示例场景文本文件中多行是一条记录,一条记录以特殊标识作为起始,一条记录中一行是一个字段,一个字段由Key、Value构成,有效内容是Value。文本文件中的一条数据,如下表示例:&&&&&&&&&&&&&&&&&&【入住日期】2016-05-07【省份】山东【城市】济南【酒店名称】XX酒店【地址】高新区XX号预期将上述多行记录正确读取为一条数据,一条数据的字段之间用tab键分隔,解析后的内容如下:2016-05-07山东济南XX酒店高新区XX号对于示例场景,Flume的conf配置文件如下:test.sources.s1.type=spooldirtest.sources.s1.spoolDir=/test/datatest.sources.s1.deserializer=BdeLineDeserializer$Buildertest.sources.s1.deserializer.filePattern=^((\\&&&&&&&&&&&&&&&&&&)(\\s|\\S)).*test.sources.s1.deserializer.eventParser=MultilineEventParsertest.sources.s1.deserializer.eventParser.ignorePatternLine=truetest.sources.s1.deserializer.eventParser.needParseLine=truetest.sources.s1.deserializer.eventParser.lineKVDelimiter="】"test.sources.s1.deserializer.eventParser.fieldDelimiter="\t"文本文件的每条数据的读取规则:以&&&&&&&&&&&&&&&&&&起始的多行记录为一条数据。文件的每条数据的解析类MultilineEventParser,实现自定义接口IBdeEventParser,根据配置的规则对每条数据进行解析转换。MultilineEventParser的各方法的具体实现说明如下:a)在方法build(Contextcontext)中,获取Flume的conf文件配置的解析规则:配置项eventParser.ignorePatternLine:值为true或false,用于配置是否需要舍弃标识行。示例场景中需要舍弃。配置项eventParser.needParseLine:值为true或false,用于配置是否需要解析每行数据。示例场景中需要从每行数据中解析出有效值。配置项eventParser.lineKVDelimiter:用于配置每行数据的Key、Value的分隔符。示例场景中有效值为】之后的内容。配置项eventParser.fieldDelimiter:用于配置有效值之间的分隔符。示例场景中用tab键作为分隔符。b)在方法handleEvent(Eventevent)中,根据Flume的conf文件配置的解析规则对Flume事件Event进行转换,并将转换后的有效值按指定的分隔符分隔,生成新的Flume事件。实施方式仅用于说明本发明,而并非对本发明的限制,有关
技术领域
:的普通技术人员,在不脱离本发明的精神和范围的情况下,还可以做出各种变化和变型,因此所有等同的技术方案也属于本发明的范畴,本发明的专利保护范围应由权利要求限定。当前第1页1 2 3 当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1