一种基于Flink状态的实时数仓建设方法与流程

文档序号:30788187发布日期:2022-07-16 08:56阅读:187来源:国知局
一种基于flink状态的实时数仓建设方法
技术领域
:1.本发明涉及计算机技术的数据仓库领域,特别是涉及一种基于flink状态的实时数仓建设方法。
背景技术
::2.近些年,kudu在大数据平台的应用越来越广泛。在阿里、小米、网易等公司的大数据架构中,kudu都有着不可替代的地位,是一个既支持随机读写、又支持olap分析的大数据存储引擎,对实时数仓十分友好。3.时效性、稳定性、准确性是数据必不可少的要素,flink因其在实时数仓中优异的性能受到各大公司的喜爱。但目前大多数flink+kudu结构的实时数仓只能做到实时解析日志,形成结构化数据,针对各公司埋点业务,若想要实时查看新增埋点数据情况,只能提前增加实时数仓中新埋点的字段及类型,然后库表中该字段才会有数值,这期间会耽误部分时间,如果需要立即查看到新增埋点的数据情况,就需要在一般实时数仓的基础上,做出更有建设性的改进。4.专利cn202010898539-基于flink流式处理的用户行为统计分析方法,提出了flink+kafka+sdk埋点的概念,但该专利重点介绍一般的基于flink的流式计算,并未涉及到底层的实时数仓建设,如实时数据最终的存储方式、数仓中对ip、useragent等通用指标的解析,技术人员难以通过本领域的通识直接进行应用。5.专利cn201911411864-信贷风控特征变量管理的方法及系统,提出了flink+kudu数仓的概念,涉及jason解析数据,但该专利中是提前将源数据schema信息进行上传至元数据管理系统后再对元数据进行解析,该方法只能解析提前定义好的源数据,每次新增新的源数据信息如新增埋点字段,就需要频繁的更新管理系统文档,业务方与开发人员需要频繁联动,效率低下。6.专利cn202011079858-一种基于kafka的埋点数据实时采集计算和存储的方法,提出了以key-value形式解析的sdk埋点采集系统在kafka结合flink中的应用,以解决实时埋点需求,但该专利使用的存储数据库是hbase,一方面hbase拥有良好的查询性能,但架构设计复杂,且使用hdfs作为分布式存储,因此存储数据,尤其是大量数据时,存储性能较差,另一方面,该专利在对实时数据入数仓时并未对埋点字段数值的类型进行判断,后续任务在使用数据时,无法第一时间得到准确的数值类型。7.综合上述现有技术来看,现有flink+kudu实时数仓技术尚不能实时根据埋点内容增加字段(字段名和字段类型),或者动态增加字段的效率过低。因此,需要一种更高效适用的基于flink状态的实时数仓建设方法。技术实现要素:8.本发明所要解决的技术问题是克服现有技术的不足,提供一种基于flink状态动态增加kudu字段的实时数仓建设方法,在一般flink实时数仓的基础上,利用flink状态,针对用户行为日志,不仅能够做到实时解析成结构化数据,分发topic供业务订阅,落盘kudu,并且能够实时增加日志中新的埋点字段,供业务实时查看新增埋点数据情况,从而提高业务效率,发挥出更大的价值。9.为解决上述技术问题,本发明提供一种基于flink状态动态增加kudu字段的实时数仓建设方法,其特征在于,包括以下步骤:10.步骤1:从消息订阅系统中订阅数据作为flink任务中的source,创建flink状态,所述flink状态的存储内容包括kudu中各表的表名、字段和类型,任务开始时,初始化flink状态,获取kudu中各表的表名、字段和类型;11.步骤2:对flink中的实时用户行为日志进行解析,将解析结果以埋点事件、事件属性和属性的值的形式保存为json格式数据,所述事件属性记为key,所述属性的值记为value;12.步骤3:对于步骤2中的json格式数据,判断事件属性是否包含在当前的flink状态中;如果是,则解析结果进入步骤4;如果不是,则对该事件属性对应的属性的值进行判定,将该埋点事件的字段及其类型添加至kudu,并旁路输出至kudu的一个新增字段中作为记录,更新flink状态,解析结果进入步骤4;13.步骤4:对解析结果做预处理,所述预处理包括ip解析、useragent解析,将预处理后的数据以埋点事件、事件属性和属性的值的形式保存为json格式数据,并写入消息订阅系统;14.步骤5:订阅步骤4中消息订阅系统的数据,将json格式数据完全展开,去除字段值为null的数据,并将展开结果写入kudu中。15.所述步骤1中,所述消息订阅系统为kafka实时数据源,所述flink状态的数据结构为newmapstatedescriptor[string,mutable.map[string,type]];初始化flink状态为:mapstatedescriptor[micen_table,mutable.map[distinct_id-》string]]。[0016]所述步骤2中包括,将解密的加密日志和解压的压缩日志展开获得埋点字段,解析成key-value的json格式形式,其中,value的类型根据埋点的字段类型进行判断,映射成kudu相对应的字段类型并保存。[0017]所述步骤3中,判断事件属性是否包含在当前的flink状态中包括:对步骤2中的json格式数据中的每个事件属性,以集合{distinct_id,lib}的形式与flink状态中的字段名集合{distinct_id}进行对比,用以判断埋点字段是否存在flink状态中,得到一个字段差集{lib},其中,lib是新增的埋点字段,在将json格式数据写入kudu之前,判断该埋点值的数值类型并在flink状态中添加新增的埋点字段及其类型,利用自定义的javaapi将新增的埋点字段及其类型新增至kudu,初始化flink状态,重新读取kudu表中各表的表名、字段和类型的schema,所述flink状态初始化为:[0018]mapstatedescriptor[micen_table,mutable.map[distinct_id-》string,lib_id-》string]]。[0019]所述步骤4中,所述预处理包括,在ip解析中,以预设的周期定时从ip数据库链接下载更新ip数据库,若下载失败,则使用原先的ip数据库,并发出ip下载失败告警,基于ip地址库,自定义ip解析方法,输入ip,输出用户行为数据,在useragent解析中,根据useragent解析包解析出useragent延伸出的浏览器信息及其版本数据,用以扩展数仓数据。[0020]所述步骤5中,所述kudu数据刷新的模式为auto_flush_sync,在整个实时数仓处理过程中,kudu写入数据的同时,实时更新kudu写入目标表的schema。[0021]所述步骤2中,所述value的类型根据埋点的字段类型进行判断包括利用java中的getclass;所述步骤4中,所述用户行为数据包括ip对应的对应的国家、省份、城市、运营商、经纬度。[0022]本发明所达到的有益效果:通过动态增加新增埋点字段,利用flink状态,针对用户行为日志,不仅能够做到实时解析成结构化数据,分发topic供业务订阅,落盘kudu,并且能够实时增加日志中新的埋点字段,以供业务实时查看新增埋点数据情况,从而提高业务效率,发挥出数仓更大的价值。附图说明[0023]图1为本发明的示例性实施例的方法流程示意图;[0024]图2为本发明的示例性实施例中的实时数仓的建设流程示意图。具体实施方式[0025]下面结合附图和示例性实施例对本发明作进一步的说明:[0026]如图1所示,本发明提供一种基于flink状态的实时数仓建设方法,其特征在于,包括以下步骤:[0027]步骤1:从kafka实时数据源的消息订阅系统中订阅数据作为flink任务中的source,创建flink状态,所述flink状态的数据结构为newmapstatedescriptor[string,mutable.map[string,type]];所述flink状态的存储内容包括kudu中各表的表名、字段和类型,任务开始时,初始化flink状态为mapstatedescriptor[micen_table,mutable.map[distinct_id-》string]],获取kudu中各表的表名、字段和类型。[0028]步骤2:对flink中的实时用户行为日志进行解析,将解析的加密日志和解压的压缩日志展开获得埋点字段,结果以埋点事件、事件属性和属性的值的形式保存为key-value的json格式数据,所述事件属性记为key,所述属性的值记为value,value的类型是根据埋点的字段类型进行判断,利用了java中的getclass,映射成kudu相对应的字段类型并保存。[0029]步骤3:对于步骤2中的json格式数据,判断事件属性是否包含在当前的flink状态中;对步骤2中的json格式数据中的每个事件属性,以集合{distinct_id,lib}的形式与flink状态中的字段名集合{distinct_id}进行对比,用以判断埋点字段是否存在flink状态中,得到一个字段差集{lib},其中,lib是新增的埋点字段,在将json格式数据写入kudu之前,判断该埋点值的数值类型并在flink状态中添加新增的埋点字段及其类型,利用自定义的javaapi将新增的埋点字段及其类型新增至kudu,初始化flink状态,重新读取kudu表中各表的表名、字段和类型的schema,所述flink状态初始化为:mapstatedescriptor[micen_table,mutable.map[distinct_id-》string,lib_id-》string]]。如果是,解析后的日志数据直接进入步骤4;如果不是,则对该事件属性对应的属性的值进行判定,将该埋点事件的字段及其类型添加至kudu,并旁路输出至kudu的一个新增字段中作为记录,更新flink状态,解析后的日志数据进入步骤4;[0030]步骤4:对解析后的数据做预处理,所述预处理包括ip解析、useragent解析,在ip解析中,以预设的周期定时从ip数据库链接下载更新ip数据库,若下载失败,则使用原先的ip数据库,并发出ip下载失败告警,基于ip地址库,自定义ip解析方法,输入ip,输出用户行为数据,在useragent解析中,根据useragent解析包解析出useragent延伸出的浏览器信息及其版本数据,用以扩展数仓数据。将预处理后的数据以埋点事件、事件属性和属性的值的形式保存为json格式数据,并写入消息订阅系统;所述步骤4中,所述用户行为数据包括ip对应的对应的国家、省份、城市、运营商、经纬度[0031]步骤5:订阅步骤4中消息订阅系统的数据,将json格式数据完全展开,去除字段值为null的数据,并将展开结果写入kudu中。所述kudu数据刷新的模式为auto_flush_sync,在整个实时数仓处理过程中,kudu写入数据的同时,实时更新kudu写入目标表的schema。[0032]如图2所示的本发明示例性实施例中的一种基于flink状态的实时数仓建设方法中实时数仓的数据处理流程,具体步骤为:[0033]s11:从kafka实时数据源中订阅数据作为flink任务中的source,并创建flink状态保存kudu中各表字段及其类型,在创建flink状态时,首先需要考虑的是创建哪种数据结构的状态,按照本发明中的场景,需要创建flink储存kudu表元数据的状态,状态的数据结构应该为newmapstatedescriptor[string,mutable.map[string,type]],其中mutable.map[string,type]的key为表字段名,value为对应的字段值,整个newmapstatedescriptor[string,mutable.map[string,type]]可视为一个map,key为kudu表名,value为相应的表字段与字段值。在flink程序启动后该状态进行一次初始化,如初始化后为mapstatedescriptor[micen_table,mutable.map[distinct_id-》string]];[0034]s12:对业务项目如micen项目下的每条加密或压缩的日志如:eyjkaxn0aw5jdf9pzci6iju2mtytmdailcjsawiioijqcyj9(此日志是bsae64加密的),进行解密或解压展开成埋点字段,字段值键值对的json:{"distinct_id":"5616-00","lib":"js"},其中"distinct_id","lib"即为埋点字段;[0035]s13:对s12中的json数据中的每个key:distinct_id、lib形成一集合{distinct_id,lib}与s11的flinkmapstatedescriptor状态里micen_table下对应的字段名集合{distinct_id}进行对比,判断该条数据中埋点的字段是否存在micen_table中,得到一个字段差集{lib},即lib是新增的埋点字段,为了将该条数据中所有埋点信息都记录到kudu表micen_table中,在将数据写入kudu之前,需要在micen_table中添加该字段及其字段类型。lib对应的值:"js"是一个字符串类型,即string,则判断该新增字段lib的数值类型是string,将lib及其类型作为一个字段,利用kudujavaapi添加至micen_table。同时将该条新增字段信息记录至一张新增字段信息表中。最后初始化flink状态,重新读取kudu表中各表字段数据。上述操作后,flink状态初始化为mapstatedescriptor[micen_table,mutable.map[distinct_id-》string,lib_id-》string]];现有技术中很少涉及kudu动态增加埋点字段的内容,但是实时数仓可以动态增加字段十分重要,更加智能,这里利用flink状态机制来存储kudu表的一些schema的原因在于在任务过程中不需要实时建立connection读取kuduschema来对比正在解析的埋点字段,极大的提高了动态增加kudu字段的效率。[0036]s14:对s13中解析出来的数据做预处理,如ip解析出国家、省份、城市、运营商、经纬度等,ua解析出浏览器、浏览器版本等,根据url补全站点等数据处理,处理后的数据添加至json中,将json写入kafka。各业务方可订阅解析后的数据;[0037]s15:订阅s14中的数据,将json完全展开,去除字段值为null的数据,以key,value的形式通过kudujavaapi写入kudu,鉴于公司数据量以及实时数仓的稳定性,kudu数据刷新的模式为auto_flush_sync。在写入数据的时候实时读取micen_table的schema,防止实时增加字段后,kuduclient的表schema未刷新。[0038]本发明主要用于提供一种基于flink状态的实时数仓建设方法,在现有技术技术上做出一些更加灵活的变动,动态增加新增埋点字段;在一般flink实时数仓的基础上,利用flink状态,针对用户行为日志,不仅能够做到实时解析成结构化数据,分发topic供业务订阅,落盘kudu,并且能够实时增加日志中新的埋点字段,供业务实时查看新增埋点数据情况,从而提高业务效率,发挥出数仓更大的价值。[0039]以上实施例不以任何方式限定本发明,凡是对以上实施例以等效变换方式做出的其它改进与应用,都属于本发明的保护范围。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1