首页 / 一种Flink状态信息的可视化方法及系统

一种Flink状态信息的可视化方法及系统公开 发明

技术领域

[0001] 本发明涉及数据处理技术领域,尤其涉及一种Flink状态信息的可视化方法及系统。

相关背景技术

[0002] Flink作为大数据领域的数据处理引擎,其检查点机制(checkpoint)是实现Flink任务容错能力的最核心功能,它周期性的将Flink任务的各个算子状态(operator state)生成一个快照(Snapshot),从而将这些状态数据定期持久化存储,保证Flink程序在意外崩溃时,可以通过这些Snapshot进行恢复,从而修正故障带来的程序数据状态中断。
[0003] 但Flink任务持久化的checkpoint文件内容是由Flink内部自定义的序列化机制编码而成的,对外呈现为乱码形式,因此,无法直接查看或理解文件内容,可视化程度也低。
[0004] 为解决这一问题,Flink引入了能够对checkpoint文件进行解析从而获取其内部内容的状态处理应用程序接口(State Processor API),该State Processor API允许开发者对Flink保存点(Savepoints)和检查点(Checkpoints)中的状态进行读取、写入和修改操作,但也存在一定局限,其只能根据提供的检查点状态(checkpoint state)的元数据信息如状态名称、状态类型以及序列化方式等来获取值,而实际场景中,数仓人员不会知道Flink程序里到底有哪些状态,熟悉Flink源码的开发人员也只有在查看源码后才能知道当前Flink任务定义的状态,因此,使用门槛较高。

具体实施方式

[0018] 为使本发明技术方案更加清楚,以下结合附图及具体实施例对本发明做进一步详细说明。本申请的权利要求书和说明书的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序,应该理解这样使用的术语在适当情况下可以互换,这仅仅是描述本申请的实施例中对相同属性的对象在描述时所采用的区分方式,此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,以便包含一系列单元的过程、方法、系统、产品或设备不必限于那些单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其他单元。
[0019] 实施例1
[0020] 如图1所示,一种Flink状态信息的可视化方法,包括以下步骤:S110、获取检查点文件,并对该检查点文件进行解析得到状态句柄;
S120、根据状态句柄确定其对应的状态类型,该状态类型包括第一状态类型和第二状态类型;
S130、根据状态类型选择与其相匹配的状态元数据获取方法,并基于元数据获取方法从该状态句柄中提取出状态的元数据信息;
S140、根据状态类型对应的数据读取方法和元数据信息从该检查点文件中获取状态数据,并对状态数据进行可视化展示。
[0021] 在实施例1中,首先从Flink作业的执行环境中获取自动生成的checkpoint文件,接着,利用State Processor API对该checkpoint文件进行解析,得到用于存储checkpoint元数据信息的CheckpointMetadata类,遍历CheckpointMetadata类中的每个状态,即可得到状态句柄(State Handle),鉴于在Flink中,状态主要分为算子状态(Operator State)即第一状态类型和键控状态(Keyed State)即第二状态类型两类,其中,Operator State表示一个算子一个状态,Keyed State则表示不同的数据key对应不同的状态,且状态句柄与状态是 一一对 应的,所以 这里得 到的 状态句 柄既可 能是 算子状 态句 柄(OperatorStateHandle),也可能是键控状态句柄(KeyedStateHandle),然后就根据得到的State Handle判断其对应的具体状态类型是Operator State还是Keyed State。
[0022] 本实施例中还针对不同状态类型提供不同的元数据获取方法和数据读取方法,因此,在确定具体的状态类型后,会从所提供的元数据获取方法中选取与该具体状态类型相匹配的方法进行元数据信息提取,得到元数据信息后,再从所提供的数据读取方法中选取与该具体状态类型相匹配的方法,再结合得到的元数据信息即可从checkpoint文件中获取到状态数据,最后,将得到的状态数据以图表、图形或其他直观形式展示出来。
[0023] 本实施例通过直接读取并解析Flink作业的检查点文件,克服了现有技术中难以直接获取和可视化Flink状态信息的难题,为Flink作业的监控、调试和优化提供了有力的支持。
[0024] 实施例2
[0025] 如图2所示,一种Flink状态信息的可视化方法,包括:S210、获取检查点文件,并对该检查点文件进行解析得到状态句柄;
S220、根据状态句柄确定其对应的状态类型,该状态类型包括第一状态类型和第二状态类型,其中,第一状态类型为算子状态,第二状态类型为键控状态;
S230、于状态类型为算子状态时,通过BackendRestorerProcedure对算子状态句柄进行恢复并构建算子状态后端类,该算子状态后端类中设置有用于存储算子状态元数据信息的registeredOperatorStates字段;
S240、利用registeredOperatorStates字段获取算子状态的元数据信息;
S250、遍历算子状态的元数据信息,该元数据信息包括状态值类型,其中,状态值类型包括算子列表状态、联合列表状态和广播状态;
S260、将元数据信息转换为状态描述符,并根据状态值类型决定调用的算子状态后端类中的接口;
S270、将状态描述符传入接口中得到状态值类型数据对应的迭代器,并根据迭代器迭代获取检查点文件中算子状态的状态数据。
[0026] 在实施例2中,当确定State Handle对应的具体状态类型为Operator State时,该State Handle实质为OperatorStateHandle,先通过BackendRestorerProcedure对OperatorStateHandle进行恢复,因为OperatorStateHandle提供了Operator State在持久化存储中的位置和内容,如其提供了Operator每个state名称和其数据在文件里的字节偏移量和文件的句柄,再构建算子状态后端(OperatorStateBackend)类,具体地,BackendRestorerProcedure提供了一个CreateAndRestore 接口,该CreateAndRestore 接口根据OperatorStateHandle的信息可以构建一个OperatorStateBackend类,在OperatorStateBackend类的内部还设置了一个关键字段RegisteredOperatorStates,RegisteredOperatorStates内部存储了当前 OperatorStateHandle指向的文件路径里存储的state元数据信息,因此,利用RegisteredOperatorStates便可获取到Operator State的元数据信息,该元数据信息包括状态名称(StateName)、序列化类型(SerializerType)以及状态值类型(StateType)等,其中的StateType又分为算子列表状态(List State)、联合列表状态(Union List State)以及广播状态(Broadcast State)三种,接着,再遍历获取到的元数据信息,并将其转换为Flink的状态描述符(StateDescriptor),根据其StateType选择是调用OperatorStateBackend类中的接口getUnion ListState还是getList State,并将StateDescriptor作为参数传递到该接口中,便可得到StateType数据对应的迭代器,最后,对迭代器进行迭代即可获取检查点文件中算子状态的状态数据,并将获得的状态数据进行可视化展示。
[0027] 本实施例可以直接通过checkpoint文件获取Operator State的元数据解析,不需要用户知道有哪些state信息,降低了使用门槛,同时,信息可视化之后,能帮助数仓以及开发人员快速直观地了解Flink任务的状态信息。
[0028] 实施例3
[0029] 如图3所示,一种Flink状态信息的可视化方法,包括:S310、获取检查点文件,并对该检查点文件进行解析得到状态句柄;
S320、根据状态句柄确定其对应的状态类型,该状态类型包括第一状态类型和第二状态类型,其中,第一状态类型为算子状态,第二状态类型为键控状态;
S330、于状态类型为键控状态时,利用键控状态句柄中预置的openInputStream方法来获取键控状态的字节信息;
S340、对字节信息进行反序列化得到键控状态的元数据信息,该元数据信息包括键的名称和序列化类型;
S350、根据检查点元数据信息和序列化类型构建streamOperatorStateContext接口,并通过streamOperatorStateContext接口获取键控状态后端;
S360、利用反射机制从键控状态后端中提取出键控状态的元数据信息;
S370、通过键控状态后端获取键迭代器,并根据键控状态的元数据信息构建用于存储单值类型的状态;
S380、对键迭代器进行迭代得到检查点文件中各个键的值,并判断是否存在下一个键;
S390、于存在下一个键时,通过键控状态后端中预置的setCurrentKey接口更新当前键,并根据用于存储单值类型的状态确定键控状态的状态数据。
[0030] 在实施例3中,当State Backend对应的具体状态类型为Keyed State时,该State Handle实质为KeyedStateHandle,KeyedStateHandle持有state字节流句柄,可以通过openInputStream方法获取字节信息,再通过KeyedBackendSerializationProxy#read api读取并反序列化字节信息,从而得到Keyed State的元数据信息,该元数据信息包括key的名称和key序列化类型,且此时的KeyedStateBackend中维护了checkpoint文件里所有的Keyed  State信息,然后,将checkpoint元数据信息和key序列化类型传入StreamTaskStateInitializer中,构建得到streamOperatorStateContext接口,该StreamOperatorStateContext接口提供了KeyedStateBackend api,据此可直接获取到KeyedStateBackend,再通过java的反射机制便可从KeyedStateBackend中得到Keyed State的元数据信息。
[0031] 接下来,通过KeyedStateBackend#getKeys api获取state的key迭代器,KeyedStateBackend#getKeys通过state的元数据信息可以获取一个Stream流对象,而stream流对象又提供了iterator接口,Iterator 接口是 Java 集合框架中的一个重要接口,它提供了一种遍历集合如 List、Set的方法,而不需要了解集合的内部结构,通过该iterator接口便可获取迭代器,并根据获取的Keyed State元数据信息构建一个用于存储单值类型的状态ValueState,对迭代器进行迭代得到checkpoint文件中各个键的值,并判断是否存在下一个键,若存在,则通过KeyedStateBackend#setCurrentKey 更新当前key,然后通过ValueState便可获取到state数据,最后,将获得的状态数据进行可视化展示。
[0032] 本实施例可以直接通过checkpoint文件获取Keyed State的元数据解析,不需要用户知道有哪些state信息,降低了使用门槛,同时,信息可视化之后,能帮助数仓以及开发人员快速直观地了解Flink任务的状态信息。
[0033] 实施例4
[0034] 如图4所示,一种Flink状态信息的可视化系统,包括解析模块、判断模块、提取模块和可视化模块,其中:解析模块,用于获取检查点文件,并对检查点文件进行解析得到状态句柄;
判断模块,用于根据状态句柄确定其对应的状态类型,状态类型包括第一状态类型和第二状态类型;
提取模块,用于根据状态类型选择与其相匹配的状态元数据获取方法,并基于该元数据获取方法从状态句柄中提取出状态的元数据信息;
可视化模块,用于根据状态类型对应的数据读取方法和该元数据信息从检查点文件中获取状态数据,并对状态数据进行可视化展示。
[0035] 上述系统可执行本发明前述所有实施例所提供的方法,且具备执行上述方法相应的功能模块和有益效果,未在本实施例中详尽描述的技术细节,可参见本发明前述所有实施例所提供的方法。
[0036] 实施例5
[0037] 如图5所示,一种电子设备,包括存储器501和处理器502,所述存储器501用于存储一条或多条计算机指令,其中,所述一条或多条计算机指令被所述处理器502执行以实现上述的一种Flink状态信息的可视化方法。
[0038] 所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的电子设备的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
[0039] 一种存储有计算机程序的计算机可读存储介质,所述计算机程序使计算机执行时实现如上述的一种Flink状态信息的可视化方法。
[0040] 示例性的,计算机程序可以被分割成一个或多个模块/单元,一个或者多个模块/单元被存储在存储器501中,并由处理器502执行,并由输入接口505和输出接口506完成数据的I/O接口传输,以完成本发明,一个或多个模块/单元可以是能够完成特定功能的一系列计算机程序指令段,该指令段用于描述计算机程序在计算机设备中的执行过程。
[0041] 计算机设备可以是桌上型计算机、笔记本、掌上电脑及云端服务器等计算设备。计算机设备可包括,但不仅限于,存储器501、处理器502,本领域技术人员可以理解,本实施例仅仅是计算机设备的示例,并不构成对计算机设备的限定,可以包括更多或更少的部件,或者组合某些部件,或者不同的部件,例如计算机设备还可以包括输入器507、网络接入设备、总线等。
[0042] 处理器502可以是中央处理单元(Central Processing Unit,CPU),还可以是其他通用处理器502、数字信号处理器502(Digital Signal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现成可编程门阵列(Field‑Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器502可以是微处理器502或者该处理器502也可以是任何常规的处理器502等。
[0043] 存储器501可以是计算机设备的内部存储单元,例如计算机设备的硬盘或内存。存储器501也可以是计算机设备的外部存储设备,例如计算机设备上配备的插接式硬盘,智能存储卡(Smart Media Card,SMC),安全数字(Secure Digital,SD)卡,闪存卡(Flash Card)等,进一步地,存储器501还可以既包括计算机设备的内部存储单元也包括外部存储设备,存储器501用于存储计算机程序以及计算机设备所需的其他程序和数据,存储器501还可以用于暂时地存储在输出器508,而前述的存储介质包括U盘、移动硬盘、只读存储器ROM503、随机存储器RAM504、碟盘或光盘等各种可以存储程序代码的介质。
[0044] 以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。

当前第1页 第1页 第2页 第3页