掌桥专利:专业的专利平台
掌桥专利
首页

一种Flink动态加载和校验UDF的方法和系统

文献发布时间:2024-04-18 20:01:23


一种Flink动态加载和校验UDF的方法和系统

技术领域

本发明涉及UDF处理技术领域,尤其涉及一种Flink动态加载和校验UDF的方法和系统。

背景技术

UDF函数是指用户自定义的函数,用于对数据进行转换、计算等操作。Flink是Apache软件基金会开发的开源流处理框架。在Flink中,UDF函数可以应用于各种数据处理场景中,例如数据清洗、聚合、过滤等。Flink中UDF函数使用大致分为如下三个步骤:根据需要定义相应的函数、将定义的函数注册到执行环境中以及在FlinkSQL中调用已注册的函数。在使用UDF函数之前,需要先加载函数,再校验UDF函数的编写是否正确。

目前,Flink中UDF函数的使用普遍采用以下两种方式。

方式一:用户将编写的UDF.jar包打包到任务中,构建一个大的jar包,在任务运行的时候,构造StreamTableEnvironment对象,调用注册函数的方法createTemporarySystemFunction()方法,将函数注册为系统函数,再执行带有UDF函数的FlinkSQL语句,来判断语法和UDF函数是否正确。

方式二:基于Flink on yarn模式,用户编写UDF jar包上传到HDFS文件系统,将此HDFS路径设置到Configuration配置对象的PROVIDED_LIB_DIRS参数里,启动Flink集群。然后构建yarn客户端,提交任务到yarn上运行,在任务运行的时序中,先注册UDF函数,再执行FlinkSQL。

在实际应用中,当通过方式一使用UDF函数时,如果UDF数量较多,构建的jar包就会很大,加载UDF函数的过程也会随之延长,从而降低Flink任务的提交速度。当通过方式二使用UDF函数时,当每个任务所依赖的UDF函数变更时,需要重新配置PROVIDED_LIB_DIRS参数,重启Flink集群,实时性不高,调用周期长。

因此,如何提供一种更加高效的Flink中UDF加载和校验方法,成为亟待解决的技术问题。

发明内容

有鉴于此,为了克服现有技术的不足,本发明旨在提供一种Flink动态加载和校验UDF的方法和系统。

根据本发明的第一方面,提供一种Flink动态加载和校验UDF的方法,包括:

编写Flink UDF函数,将编写的Flink UDF函数进打包为jar包,缓存Flink UDF函数和jar包的相关参数;

通过构建StreamTableEnvironment对象,构建Flink执行环境;

根据缓存的jar包的相关参数将jar包加载至构建的Flink执行环境;

根据缓存的Flink UDF函数的相关参数将编写的Flink UDF函数注册至构建的Flink执行环境;

解析带有Flink UDF函数的FlinkSQL语句,在Flink执行环境中执行解析获得的sql语句,根据执行结果判断Flink UDF函数的正确性。

优选地,本发明Flink动态加载和校验UDF的方法中,编写Flink UDF函数,将编写的Flink UDF函数进打包为jar包,缓存Flink UDF函数和jar包的相关参数,包括:

编写UDF函数的类,通过将编写获得的UDF函数的类继承Flink-api的Function类获得Flink UDF函数;

将获得的Flink UDF函数打包为jar包,将打包的所有jar包上传至HDFS的对应目录中;

记录Flink UDF函数所对应的main函数类名,将Flink UDF函数的函数名、对应的main函数类名以及jar包上传路径进行缓存。

优选地,本发明Flink动态加载和校验UDF的方法中,通过构建StreamTableEnvironment对象,构建Flink执行环境,包括:

构建Flink-Configuration类,通过将构建的Flink-Configuration类的类加载顺序参数的参数属性值设置为父加载器优先,构建Configuration对象;

通过构建的Configuration对象构建StreamExecutionEnvironment对象,通过构建的StreamExecutionEnvironment对象构建StreamTableEnvironment对象。

优选地,本发明Flink动态加载和校验UDF的方法中,根据缓存的jar包的相关参数将jar包加载至构建的Flink执行环境,包括:

将Flink UDF函数对应的jar包在HDFS上的上传路径转换为restful地址;

调用JDK中URLClassLoader类的addURL方法将每个jar包的restful地址反射加载至JVM中;

通过反射从StreamExecutionEnvironment对象中获取configuration对象,通过反射从configuration对象中获取confData属性对象,将获取的confData属性对象转换为Map对象;

为转换获得的Map对象设置pipeline.classpaths参数,将pipeline.classpaths参数的值设置为jar包的restful地址的集合。

优选地,本发明Flink动态加载和校验UDF的方法中,将Flink UDF函数对应的jar包在HDFS上的上传路径转换为restful地址,包括:通过字符串拼接将Flink UDF函数对应的jar包在HDFS上的上传路径逐个转换为restful地址。

优选地,本发明Flink动态加载和校验UDF的方法中,调用JDK中URLClassLoader类的addURL方法将每个jar包的restful地址反射加载至JVM中,包括:

反射获取JDK中URLClassLoader类的addURL方法,判断获取的addURL方法是否具有访问restful地址的权限,当获取的addURL方法是不具有访问restful地址的权限时,对获取的addURL方法进行访问授权;

调用具有访问restful地址的权限的addURL方法的invoke操作,逐个将每个jar的restful地址加载到JVM中。

优选地,本发明Flink动态加载和校验UDF的方法中,根据缓存的Flink UDF函数的相关参数将编写的Flink UDF函数注册至构建的Flink执行环境,包括:

读取缓存的Flink UDF函数的相关参数,根据读取的Flink UDF函数的相关参数遍历每个Flink UDF函数;

通过反射方法创建每个Flink UDF函数的实例,将Flink UDF函数的函数名及对应的实例逐个添加到StreamTableEnvironment对象的临时系统函数中。

优选地,本发明Flink动态加载和校验UDF的方法中,解析带有Flink UDF函数的FlinkSQL语句,在Flink执行环境中执行解析获得的sql语句,根据执行结果判断Flink UDF函数的正确性,包括:将带有Flink UDF函数的FlinkSQL解析为sqlNode的集合,根据sqlNode的类型逐个执行sql语句,获取执行日志,并根据执行结果对Flink UDF函数的正确性进行判断。

优选地,本发明Flink动态加载和校验UDF的方法中,解析带有Flink UDF函数的FlinkSQL语句,在Flink执行环境中执行解析获得的sql语句,根据执行结果判断Flink UDF函数的正确性,包括:当sql语句执行异常,对执行异常进行捕获并返回执行错误日志;当sql语句执行正常,对Flink UDF函数的业务逻辑进行校验,当所述Flink UDF函数的业务逻辑校验,将所述Flink UDF函数判定为正确。

根据本发明的第二方面,提供一种Flink动态加载和校验UDF的系统,该系统包括加载和校验服务端,该加载和校验服务端用于编写Flink UDF函数,将编写的Flink UDF函数进打包为jar包,缓存Flink UDF函数和jar包的相关参数;通过构建StreamTableEnvironment对象,构建Flink执行环境;根据缓存的jar包的相关参数将jar包加载至构建的Flink执行环境;根据缓存的Flink UDF函数的相关参数将编写的Flink UDF函数注册至构建的Flink执行环境;解析带有Flink UDF函数的FlinkSQL语句,在Flink执行环境中执行解析获得的sql语句,根据执行结果判断Flink UDF函数的正确性。

根据本发明的第三方面,提供一种计算机设备,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述程序时实现本发明第一方面所述的方法。

本发明Flink动态加载和校验UDF的方法和系统,具有以下有益技术效果:

1.在Flink UDF函数函数数量动态的增减的场景下,用户可以根据各个任务的依赖,按需加载所需的Flink UDF函数,极具灵活性,避免了重复编译、构建jar包带来的繁琐;

2.在Flink UDF函数较多时,不用构建较大的jar包,提升了运行效率,降低了运行成本;

3.基于Flink的配置发掘,提高任务的运行效率,避免了Flink集群重启,增强了实时性,缩短了执行周期,节约了开发成本和资源。

附图说明

为了更清楚地说明本发明实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。

图1为一种适用于本发明实施例的Flink动态加载和校验UDF的方法的系统的示意图;

图2为根据本发明实施例的一种Flink动态加载和校验UDF的方法的步骤流程图;

图3为根据本发明实施例中Flink动态加载和校验UDF的方法的一种执行示意图;

图4为根据本发明实施例Flink动态加载和校验UDF的方法构建Flink执行环境的执行示意图;

图5为根据本实施例方法将jar包加载至构建的Flink执行环境的执行示意图;

图6为根据本发明实施例方法判断addURL方法是否具有访问权限的执行示意图;

图7为根据本实施例方法将编写的Flink UDF函数注册至构建的Flink执行环境的执行示意图;

图8为根据本实施例方法解析和判断Flink UDF函数的执行示意图;

图9为本发明提供的设备的结构示意图。

具体实施方式

下面结合附图对本发明实施例进行详细描述。

需说明的是,在不冲突的情况下,以下实施例及实施例中的特征可以相互组合;并且,基于本公开中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本公开保护的范围。

需要说明的是,下文描述在所附权利要求书的范围内的实施例的各种方面。应显而易见,本文中所描述的方面可体现于广泛多种形式中,且本文中所描述的任何特定结构及/或功能仅为说明性的。基于本公开,所属领域的技术人员应了解,本文中所描述的一个方面可与任何其它方面独立地实施,且可以各种方式组合这些方面中的两者或两者以上。举例来说,可使用本文中所阐述的任何数目个方面来实施设备及/或实践方法。另外,可使用除了本文中所阐述的方面中的一或多者之外的其它结构及/或功能性实施此设备及/或实践此方法。

图1示出了一种适用于本发明实施例的Flink动态加载和校验UDF的方法的示例性系统。如图1所示,该系统可以包括加载和校验服务端101、通信网络102和/或一个或多个加载和校验客户端103,图1中示例为多个加载和校验客户端103。

加载和校验服务端101可以时用于存储信息、数据、程序和/或任何其他合适类型的内容的任何适当的服务器。在一些实施例中,加载和校验服务端101可以执行适当的功能。例如,在一些实施例中,加载和校验服务端101可以用于在Flink中动态加载和校验UDF。作为可选的示例,在一些实施例中,加载和校验服务端101可以被用于通过编写Flink UDF函数实现动态加载和校验UDF。例如,加载和校验服务端101可以用于编写Flink UDF函数,将编写的Flink UDF函数进打包为jar包,缓存Flink UDF函数和jar包的相关参数;通过构建StreamTableEnvironment对象,构建Flink执行环境;根据缓存的jar包的相关参数将jar包加载至构建的Flink执行环境;根据缓存的Flink UDF函数的相关参数将编写的FlinkUDF函数注册至构建的Flink执行环境;解析带有Flink UDF函数的FlinkSQL语句,在Flink执行环境中执行解析获得的sql语句,根据执行结果判断Flink UDF函数的正确性。

作为另一示例,在一些实施例中,加载和校验服务端101可以根据加载和校验客户端103的请求,将Flink动态加载和校验UDF的方法发送到加载和校验客户端103供用户使用。

作为可选的示例,在一些实施例中,加载和校验客户端103用于提供可视化加载和校验界面,该可视化加载和校验界面用于接收用户在Flink中动态加载和校验UDF的选择输入操作,以及,用于响应于选择输入操作,从加载和校验服务端101获取与选择输入操作所选择的选项所对应的加载和校验界面并展示加载和校验界面,加载和校验界面中至少展示有在Flink中动态加载和校验UDF的信息以及针对在Flink中动态加载和校验UDF的信息的操作选项。

在一些实施例中,通信网络102可以是一个或多个有线和/或无线网络的任何适当的组合。例如,通信网络102能够包括以下各项中的任何一种或多种:互联网、内联网、广域网(WAN)、局域网(LAN)、无线网络、数字订户线路(DSL)网络、帧中继网络、异步转移模式(ATM)网络、虚拟专用网(VPN)和/或任何其它合适的通信网络。加载和校验客户端103能够通过一个或多个通信链路(例如,通信链路104)连接到通信网络102,该通信网络102能够经由一个或多个通信链路(例如,通信链路105)被链接到加载和校验服务端101。通信链路可以是适合于在加载和校验客户端103和加载和校验服务端101之间传送数据的任何通信链路,诸如网络链路、拨号链路、无线链路、硬连线链路、任何其它合适的通信链路或此类链路的任何合适的组合。

加载和校验客户端103可以包括通过适当形式呈现与在Flink中动态加载和校验UDF相关的界面,以供用户使用和操作的任何一个或多个客户端。在一些实施例中,加载和校验客户端103可以包括任何合适类型的设备。例如,在一些实施例中,加载和校验客户端103可以包括移动设备、平板计算机、膝上型计算机、台式计算机和/或任何其他合适类型的客户端设备。

尽管将加载和校验服务端101图示为一个设备,但是在一些实施例中,可以使用任何适当数量的设备来执行由加载和校验服务端101执行的功能。例如,在一些实施例中,可以使用多个设备来实现由加载和校验服务端101执行的功能。或者,可使用云服务实现加载和校验服务端101的功能。

基于上述系统,本发明实施例提供了一种高速访问ORC外部表的方法,以下通过以下实施例进行说明。

参照图2,示出了根据本申请实施例的一种Flink动态加载和校验UDF的方法的步骤流程图。

本实施例的Flink动态加载和校验UDF的方法可在加载和校验服务端执行,该Flink动态加载和校验UDF的方法包括以下步骤:

步骤S21:编写Flink UDF函数,将编写的Flink UDF函数进打包为jar包,缓存Flink UDF函数和jar包的相关参数。

图3为根据本发明实施例中Flink动态加载和校验UDF的方法的一种执行示意图,如图3所示,本发明实施例方法编写UDF函数的类,通过将编写获得的UDF函数的类继承Flink-api的Function类获得Flink UDF函数。在获得Flink UDF函数后,本实施例方法将获得的Flink UDF函数打包为jar包,将打包的所有jar包上传至Hadoop分布式文件系统HDFS的对应目录中,并且记录Flink UDF函数所对应的main函数类名,将Flink UDF函数的函数名、对应的main函数类名以及jar包上传路径进行缓存。

步骤S22:通过构建StreamTableEnvironment对象,构建Flink执行环境。

图4为根据本发明实施例Flink动态加载和校验UDF的方法构建Flink执行环境的执行示意图,如图4所示,本发明实施例方法按以下方式构建Flink执行环境:构建Flink-Configuration类,通过将构建的Flink-Configuration类的类加载顺序参数的参数属性值设置为父加载器优先,构建Configuration对象。举例来说,在构建Flink-Configuration类后,将其类加载顺序“classloader.resolve-order”参数属性值设置为“parent-first”。

在完成对Configuration对象的构建后,本发明实施例方法通过构建的Configuration对象构建StreamExecutionEnvironment对象,通过构建的StreamExecutionEnvironment对象构建StreamTableEnvironment对象,其中,StreamExecutionEnvironment对象为Flink流式执行上下文环境对象,StreamTableEnvironment对象为Flink-table-api执行上下文环境对象。

步骤S23:根据缓存的jar包的相关参数将jar包加载至构建的Flink执行环境。

图5为根据本实施例方法将jar包加载至构建的Flink执行环境的执行示意图,如图5所示,本发明实施例方法通过以下方式将Flink UDF函数对应的jar包加载至构建的Flink执行环境中:

首先,本实施例方法将Flink UDF函数对应的jar包在HDFS上的上传路径转换为restful地址,可选的,本实施例方法通过字符串拼接将Flink UDF函数对应的jar包在HDFS上的上传路径逐个转换为restful地址,本领域技术人员在实施本实施例方法时可以根据实际应用场景选中其他方式将Flink UDF函数对应的jar包在HDFS上的上传路径逐个转换为restful地址,本实施例方法对此不作限制。

其次,在转换获得jar包的restful地址后,本实施例方法通过调用JDK中URLClassLoader类的addURL方法将每个jar包的restful地址反射加载至JVM中。图6为根据本发明实施例方法判断addURL方法是否具有访问权限的执行示意图,如图6所示,本实施例方法通过反射获取JDK中URLClassLoader类的addURL方法,判断获取的addURL方法是否具有访问restful地址的权限,当获取的addURL方法是不具有访问restful地址的权限时,对获取的addURL方法进行访问授权。举例来说,可以采用反射的手段,获取JDK中URLClassLoader类的addURL的方法,判断该方法是否可以访问,如果不可访问,则将该访问权限设置为true。在完成对addURL方法的权限判断后,本实施例方法调用具有访问restful地址的权限的addURL方法的invoke操作,逐个将每个jar的restful地址加载到JVM中。举例来说,本实施例方法可以通过获取当前调用类的ClassLoader属性,调用具有访问restful地址的权限的addURL方法的invoke操作,逐个将每个jar的restful地址加载到JVM中。在实际应用中,为了提高权限判断的准确率,在完成对jar的restful地址加载到JVM后,将addURL方法的访问权限值还原为初始默认值。

本实施例方法中,JVM(Java Virtual Machine)指Java虚拟机,是一个虚构出来的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

然后,本实施例方法通过反射从StreamExecutionEnvironment对象中获取configuration对象,通过反射从configuration对象中获取confData属性对象,将获取的confData属性对象转换为Map对象;为转换获得的Map对象设置pipeline.classpaths参数,将pipeline.classpaths参数的值设置为jar包的restful地址的集合。至此,本实施例方法完成将Flink UDF函数对应的jar包加载至构建的Flink执行环境中。

步骤S24:根据缓存的Flink UDF函数的相关参数将编写的Flink UDF函数注册至构建的Flink执行环境。

图7为根据本实施例方法将编写的Flink UDF函数注册至构建的Flink执行环境的执行示意图,如图7所示,本实施例方法读取缓存的Flink UDF函数的相关参数,根据读取的Flink UDF函数的相关参数遍历每个Flink UDF函数;通过反射方法创建每个Flink UDF函数的实例,将Flink UDF函数的函数名及对应的实例逐个添加到StreamTableEnvironment对象的临时系统函数中。举例来说,本实施例方法读取缓存的Flink UDF函数的相关参数,根据Flink UDF函数的函数名遍历每个Flink UDF函数,通过反射class.forName().newInstance()方法,根据Flink UDF函数对应的main函数类名,构造出Flink UDF函数的实例。然后将Flink UDF函数的函数名及对应的实例逐个添加到StreamTableEnvironment对象的临时系统函数中。

步骤S25:解析带有Flink UDF函数的FlinkSQL语句,在Flink执行环境中执行解析获得的sql语句,根据执行结果判断Flink UDF函数的正确性。

图8为根据本实施例方法解析和判断Flink UDF函数的执行示意图,如图8所示,本实施例方法将带有Flink UDF函数的FlinkSQL解析为sqlNode的集合,sqlNode为解析FlinkSQL的SQL节点。在获得解析后的sqlNode的集合后,本实施例方法根据sqlNode的类型逐个执行sql语句,获取执行日志,并根据执行结果对Flink UDF函数的正确性进行判断。举例来说,本实施例采用Calcite将带有Flink UDF函数的FlinkSQL解析为sqlNode的集合,Calcite是一种开源SQL解析工具。本领域技术人员在实施例本实施例方法时还可以根据实际应用场景选择其他合适的方式将带有Flink UDF函数的FlinkSQL解析为sqlNode的集合,本实施例方法对此不作限制。

本实施例方法中的FlinkSQL,是Flink实时计算为了简化计算模型,降低用户使用实时计算门槛而设计的一套符合标准SQL语义的开发语言。

当sql语句执行异常,对执行异常进行捕获并返回执行错误日志,此时,表示FlinkSQL的语法错误或者Flink UDF函数的语法错误。当sql语句执行正常,对Flink UDF函数的业务逻辑进行校验,当该Flink UDF函数的业务逻辑校验,将该Flink UDF函数判定为正确。举例来说,将数据写入目标表中,根据结果数据查看,字段通过Flink UDF函数转换后,是否满足要求;还可以通过判断Flink UDF函数的具体实现类有没有业务逻辑的错误来判断Flink UDF函数是否正确。

本发明实施例方法在构建任务提交环境时,根据任务的UDF依赖,动态地修改Flink集群的配置,在任务提交环节,构建StreamTableEnvironment对象时,由于StreamExecutionEnvironment类下的属性configuration对象是protected(受保护的),通过反射将Flink UDF函数所对应的jar包通过类加载器加载到JVM系统中,然后再将jar包路径都加入到StreamExecutionEnvironment对象的configuration配置中,用Calcite工具类拆分FlinkSQL语句为SqlNode节点的集合,调用streamTableEnvironment对象的executeSql方法,即可完成对FlinkSQL语法的校验和对UDF的校验,如有异常,则捕获返回给调用方,根据结果集的数据来判断UDF函数的实现逻辑是否正常。

本发明Flink动态加载和校验UDF的方法和系统,具有以下有益技术效果:

1.在Flink UDF函数函数数量动态的增减的场景下,用户可以根据各个任务的依赖,按需加载所需的Flink UDF函数,极具灵活性,避免了重复编译、构建jar包带来的繁琐;

2.在Flink UDF函数较多时,不用构建较大的jar包,提升了运行效率,降低了运行成本;

3.基于Flink的配置发掘,提高任务的运行效率,避免了Flink集群重启,增强了实时性,缩短了执行周期,节约了开发成本和资源。

如图9所示,本发明还提供了一种设备,包括处理器310、通信接口320、用于存储处理器可执行计算机程序的存储器330及通信总线340。其中,处理器310、通信接口320及存储器330通过通信总线340完成相互间的通信。处理器310通过运行可执行计算机程序以实现上述的Flink动态加载和校验UDF的方法。

其中,存储器330中的计算机程序可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。

以上所描述的系统实施例仅仅是示意性的,其中作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以基于实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分的方法。

以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。

相关技术
  • 一种长寿命高强度大水眼钻杆装置
  • 一种自疏通的长寿命耐腐蚀微型高压自吸水泵连接装置
  • 一种长寿命、易操作的机车遥控装置
  • 一种耐磨损长寿命导轨测试装置及其测试方法
  • 一种长寿命的抗震电抗器装置
  • 一种用于抗震支吊架安装连接的长寿命固定装置
技术分类

06120116554209