一种基于表达式分区与动态Schema的流式路由文件输出方法、装置、设备及介质与流程

摘要: 本发明涉及计算机,特别涉及一种基于表达式分区与动态schema的流式路由文件输出方法、装置、设备及介质。背景技术:1、随着实时计算技术的快速发展,流式数据输出场...
一种基于表达式分区与动态Schema的流式路由文件输出方法、装置、设备及介质与流程

本发明涉及计算机,特别涉及一种基于表达式分区与动态schema的流式路由文件输出方法、装置、设备及介质。

背景技术:

1、随着实时计算技术的快速发展,流式数据输出场景日益复杂。在数据湖和湖仓一体架构中,流式作业不仅需要将数据写入固定目录,更经常需要根据业务属性动态决定输出路径。例如,在物联网设备数据入湖场景中,工厂内数万台传感器实时上报数据,不同产品线、不同车间乃至不同设备型号的数据格式与访问频率差异巨大,其中高价值核心设备的数据需要写入高性能存储以支撑实时告警,普通设备的数据则需要写入低成本存储以供离线分析,因此流式作业需要在写入时按照"产品线/设备型号/所属地域/日期"的层级动态生成输出目录,从而在按设备类型自动分流的同时,避免全部数据混在同一目录下导致查询时的全表扫描。又如,在电商全域用户行为归因场景中,用户在应用程序、小程序、网页以及线下门店产生的行为埋点数据被统一采集至同一条流式链路,为支持分渠道、分终端的精细化运营分析,流式作业需要在写入时按照"渠道平台/应用版本/事件类型/日期"的层级将数据拆分写入不同目录,使得下游在查询某一终端、某一版本下的特定行为时仅需读取相应子目录,而无需扫描全量数据。可见,上述场景中的输出路径既包含固定的常量片段,又包含取自记录字段的可变片段,甚至还需要依据业务语义将字段值换算为相应的目录片段,且同一作业内往往需要同时向多个表、多个分区输出数据。flink作为主流的实时计算引擎,其原生filesink组件虽提供了基本的文件写入和检查点(checkpoint)后文件可见能力,但在面对上述动态路由输出需求时,通常需要用户自行扩展bucketassigner和rollingpolicy,然而这类扩展往往局限于固定格式和有限分区规则,难以统一管理动态目录表达式、多schema切换和运行时新增表的分区提交状态。

2、与此同时,流式输入数据通常包含多种事件类型,不同类型对应的数据结构存在差异。若整个sink仅使用单一固定schema,则会丢失字段语义或造成大量冗余字段;若为每种事件类型单独构建一个sink节点,又会导致作业拓扑膨胀、资源开销增加和配置维护复杂化。此外,在实际生产环境中,流式作业的checkpoint间隔往往根据整体延迟和容错需求设定,不一定与数据积压速度匹配。仅依赖checkpoint触发文件写出时,在突发大流量或checkpoint间隔较长的情况下,sink组件内按路径聚合的待写入数据量可能急剧增长,显著增加内存溢出风险。对于异常数据,若缺乏统一的降级处理机制,单条记录解析失败或写入异常可能导致整个作业失败或污染正常输出目录,影响数据链路的稳定性。在hive多表动态路由输出场景中,目标表可能在作业运行过程中动态出现,若不能为每张表独立维护分区提交触发器、策略链和任务追踪状态,则容易造成分区遗漏提交或重复提交。在启用kerberos认证的hadoop集群中,长时间运行的作业还面临认证票据过期导致写入失败的问题。

3、由上可见,如何在流式作业中实现灵活、安全、可扩展的动态路由文件输出,同时兼顾内存可控、异常隔离和长期运行稳定性,是一项亟待解决的问题。

技术实现思路

1、有鉴于此,本发明的目的在于提供一种基于表达式分区与动态schema的流式路由文件输出方法、装置、设备及介质,在流式作业中实现灵活、安全、可扩展的动态路由文件输出,同时兼顾内存可控、异常隔离和长期运行稳定性。其具体方案如下:

2、第一方面,本技术提供了一种基于表达式分区与动态schema的流式路由文件输出方法,包括:

3、获取流式作业的输出配置,并对所述输出配置中的目录表达式进行逐字符扫描,以将所述目录表达式解析为由常量策略、字段取值策略和映射转换策略构成的目录策略链;

4、针对所述流式作业接收到的输入记录,基于所述输出配置中的写入数据字段从所述输入记录中提取相应的待写入对象,按照所述目录策略链的顺序对所述输入记录进行取值并拼接,以得到与所述输入记录对应的目标输出目录,以及基于所述输出配置中的schema策略确定与所述待写入对象对应的目标schema;

5、以所述目标输出目录为键,将所述待写入对象、所述目标schema以及基于所述目标输出目录生成的目标文件路径聚合至元数据缓存中,并在所述流式作业累计处理的记录数达到预设数量阈值或所述流式作业触发检查点时,将所述元数据缓存中的待写入对象按照相应的目标schema转换为目标格式文件字节,以便写入分布式文件系统中相应的目标文件路径,并在写出完成后重建所述元数据缓存。

6、可选的,所述对所述输出配置中的目录表达式进行逐字符扫描,以将所述目录表达式解析为由常量策略、字段取值策略和映射转换策略构成的目录策略链,包括:

7、对所述输出配置中的目录表达式进行逐字符扫描,以将所述目录表达式中的普通文本解析为携带相应常量片段的常量策略,将所述目录表达式中被预设字段标识符包围的内容解析为携带相应取值字段的字段取值策略,以及将所述目录表达式中被预设函数标识符包围的内容解析为携带相应映射转换函数与相应入参字段的映射转换策略;

8、按照所述常量策略、所述字段取值策略以及所述映射转换策略在所述目录表达式中的出现顺序进行组织,以得到相应的目录策略链。

9、可选的,所述按照所述目录策略链的顺序对所述输入记录进行取值并拼接,以得到与所述输入记录对应的目标输出目录,包括:

10、按照所述目录策略链的顺序依次执行所述常量策略、所述字段取值策略以及所述映射转换策略,以得到相应的目录片段;

11、按照所述目录策略链的顺序对得到的目录片段进行拼接,以得到与所述输入记录对应的目标输出目录;

12、其中,执行所述常量策略时,将所述常量策略携带的常量片段作为相应的目录片段;执行所述字段取值策略时,将所述输入记录中与所述取值字段对应的字段值作为相应的目录片段;执行所述映射转换策略时,以所述输入记录中与所述入参字段对应的字段值作为入参调用所述映射转换函数,并将调用得到的映射结果作为相应的目录片段。

13、可选的,所述基于所述输出配置中的schema策略确定与所述待写入对象对应的目标schema,包括:

14、若所述输出配置中的schema策略为路由schema策略,则基于所述输入记录中的类型标识字段,或基于所述输出配置中的事件码字段、事件类型以及包名进行拼接,以得到与所述输入记录对应的数据定义类名,通过反射读取与所述数据定义类名对应的数据定义类以及所述数据定义类的父类所包含的字段,并将读取到的字段中的预设排除字段过滤后生成相应的avro schema作为所述目标schema,以及以所述数据定义类名为键对所述目标schema进行缓存,以便在再次得到所述数据定义类名时复用缓存的目标schema;

15、若所述输出配置中的schema策略为自定义schema策略,则将所述输出配置中的统一avro schema作为所述目标schema;

16、其中,所述预设排除字段包括修饰符为静态、瞬态、终态或本地的字段以及预设的非业务字段。

17、可选的,所述基于表达式分区与动态schema的流式路由文件输出方法,还包括:

18、若所述待写入对象提取失败、与所述数据定义类名对应的数据定义类不存在、所述数据定义类所包含的字段的类型不被支持或所述目标文件路径写入失败,则将所述输入记录或所述待写入对象转换为包含错误字段的错误记录;

19、以所述输出配置中的默认错误目录为键,将所述错误记录以及仅包含所述错误字段的降级schema聚合至错误元数据缓存中,以便在所述流式作业累计处理的记录数达到所述预设数量阈值或所述流式作业触发检查点时,将所述错误记录按照所述降级schema转换为目标格式文件字节,并写入所述分布式文件系统中与所述默认错误目录对应的文件路径。

20、可选的,所述在所述流式作业累计处理的记录数达到预设数量阈值或所述流式作业触发检查点时,将所述元数据缓存中的待写入对象按照相应的目标schema转换为目标格式文件字节,以便写入分布式文件系统中相应的目标文件路径,并在写出完成后重建所述元数据缓存,包括:

21、若所述流式作业累计处理的记录数达到预设数量阈值,则主动触发写出操作,以将所述元数据缓存中的待写入对象按照相应的目标schema转换为目标格式文件字节,并写入分布式文件系统中相应的目标文件路径;

22、若所述流式作业触发检查点,则在所述输出配置指示启用预设认证机制时,判断当前时刻距离上一次认证续期的时长是否超过所述输出配置中的认证续期周期,若超过则基于预设密钥表文件执行认证续期,并在认证续期后触发所述写出操作,以及基于所述检查点的时间戳以及所述流式作业的子任务编号生成通过所述写出操作得到的文件的文件名;

23、在所述写出操作完成后,无论所述写出操作是否成功,均清空并重建所述元数据缓存以及所述错误元数据缓存。

24、可选的,所述基于表达式分区与动态schema的流式路由文件输出方法,还包括:

25、若所述目标输出目录为hive路由表对应的分区目录,则在分区提交器初始化时,从所述流式作业的算子状态中恢复已出现路由表名集合;

26、若通过所述写出操作得到的文件对应的路由表名不属于所述已出现路由表名集合,则为所述路由表名对应的hive路由表创建独立的分区提交触发器、分区提交策略以及任务追踪器,并将所述路由表名加入所述已出现路由表名集合;

27、在接收到分区提交信息后,基于与所述分区提交信息对应的路由表名所具有的分区提交触发器以及分区提交策略异步执行分区提交操作,并在所述流式作业触发检查点时,将所述已出现路由表名集合以及所述分区提交触发器的状态保存至所述算子状态中。

28、第二方面,本技术提供了一种基于表达式分区与动态schema的流式路由文件输出装置,包括:

29、表达式解析模块,用于获取流式作业的输出配置,并对所述输出配置中的目录表达式进行逐字符扫描,以将所述目录表达式解析为由常量策略、字段取值策略和映射转换策略构成的目录策略链;

30、记录路由模块,用于针对所述流式作业接收到的输入记录,基于所述输出配置中的写入数据字段从所述输入记录中提取相应的待写入对象,按照所述目录策略链的顺序对所述输入记录进行取值并拼接,以得到与所述输入记录对应的目标输出目录,以及基于所述输出配置中的schema策略确定与所述待写入对象对应的目标schema;

31、缓存重建模块,用于以所述目标输出目录为键,将所述待写入对象、所述目标schema以及基于所述目标输出目录生成的目标文件路径聚合至元数据缓存中,并在所述流式作业累计处理的记录数达到预设数量阈值或所述流式作业触发检查点时,将所述元数据缓存中的待写入对象按照相应的目标schema转换为目标格式文件字节,以便写入分布式文件系统中相应的目标文件路径,并在写出完成后重建所述元数据缓存。

32、第三方面,本技术提供了一种电子设备,包括:

33、存储器,用于保存计算机程序;

34、处理器,用于执行所述计算机程序,以实现前述的基于表达式分区与动态schema的流式路由文件输出方法。

35、第四方面,本技术提供了一种计算机可读存储介质,用于保存计算机程序,其中,所述计算机程序被处理器执行时实现前述的基于表达式分区与动态schema的流式路由文件输出方法。

36、本技术提供了一种基于表达式分区与动态schema的流式路由文件输出方法,包括:获取流式作业的输出配置,并对所述输出配置中的目录表达式进行逐字符扫描,以将所述目录表达式解析为由常量策略、字段取值策略和映射转换策略构成的目录策略链;针对所述流式作业接收到的输入记录,基于所述输出配置中的写入数据字段从所述输入记录中提取相应的待写入对象,按照所述目录策略链的顺序对所述输入记录进行取值并拼接,以得到与所述输入记录对应的目标输出目录,以及基于所述输出配置中的schema策略确定与所述待写入对象对应的目标schema;以所述目标输出目录为键,将所述待写入对象、所述目标schema以及基于所述目标输出目录生成的目标文件路径聚合至元数据缓存中,并在所述流式作业累计处理的记录数达到预设数量阈值或所述流式作业触发检查点时,将所述元数据缓存中的待写入对象按照相应的目标schema转换为目标格式文件字节,以便写入分布式文件系统中相应的目标文件路径,并在写出完成后重建所述元数据缓存。

37、由上可见,本技术通过将目录表达式解析为常量、字段取值与资产转换三类策略并按序组合生成目标输出目录,使得输出路径能够由常量、上游记录字段与业务资产映射函数混合表达,相较于仅按桶分区的固定路径方案显著提升了路由规则的表达能力;通过在同一sink内按目标输出目录维护元数据缓存,并按事件类型动态生成、缓存schema,使得不同路径、不同数据模式的数据能够在同一作业内分别聚合与写出,避免了为每个事件单独建立sink所导致的拓扑膨胀与配置冗余;通过数量阈值与检查点双触发落盘,在保证检查点阶段文件可见性的同时有效抑制了内存中聚合数据的持续增长。从而能够在流式作业中实现灵活、安全、可扩展的动态路由文件输出,同时兼顾内存可控、异常隔离和长期运行稳定性。