当前位置: 首页 > 后端技术 > Java

翻译-PulsarFunctions深度剖析

时间:2023-04-01 13:37:08 Java

原作者SanjeevKulkarni,翻译Sijia@StreamNative,如需转载请在后台留言。英文链接:https://streamnative.io/blog/...AboutApachePulsarApachePulsar是Apache软件基金会的顶级项目,是下一代云原生分布式消息流平台,集消息、存储、轻量级功能计算集成,采用计算与存储分离架构设计,支持多租户、持久化存储、多机房跨区域数据复制,具有强一致性、高吞吐量、低延迟和高扩展性等流数据存储特性。GitHub地址:http://github.com/apache/pulsar/PulsarFunctions是开源数据技术框架ApachePulsar提供的用于轻量级计算的内置流处理器。在PulsarSummit2020大会上,我做了一个关于PulsarFunctions的演讲。本文深入讨论了Functions的架构和实现细节。PulsarFunctions简介PulsarFunctions是Pulsar消息系统的核心计算基础设施。使用PulsarFunctions,您可以基于单个消息创建复杂的处理逻辑,简化事件流,并引入无服务器架构,而无需部署单独的系统(例如ApacheStorm、ApacheHeron)。轻量级计算函数使用来自一个或多个Pulsar主题的消息,将用户提供的处理逻辑应用于每条消息,并将计算结果发布到其他主题。由于不需要外部处理系统,PulsarFunctions不仅使应用程序开发更容易,而且简化了故障排除并减轻了运维负担。另外,开发者可以直接使用PulsarFunctions的API。懂Java语言的程序员可以直接使用JavaSDK编写函数。示例如下:importjava.util.function.Function;公共类ExclamationFunction实现Function@OverridepublicStringapply(Stringinput){returninput+"!";执行框架处理常见的流使用场景(例如过滤、路由、扩充),而不是替代重量级流处理引擎(例如Spark、Flink)。用户可以编写自己的PulsarFunctions,提交到Pulsar集群后,可以与PulsarFunctions内置的管理组件一起使用。使用基于CRUD的RESTAPI,用户可以从任何工作流提交一个函数,它会在提交后立即运行。提交函数的过程称为函数表示。提交过程的结构称为FunctionConfig,包括租户、命名空间和名称。函数通过提交JAR或Python文件使用输入和输出数据、用户配置、隐私管理支持等。此外,用户可以同时运行多项功能。公共类FunctionConfig{私有字符串租户;私有字符串命名空间;私有字符串名称;私有字符串类名;私人收藏输入;私有字符串输出;私有ProcessingGuaranteesprocessingGuarantees;私有地图用户配置;>秘密;私有整数并行性;私人资源资源;...}用户提交函数后,系统会对函数进行“提交检查”或“验证”,确保用户有权限将此函数提交到特定的命名空间和租户。如果使用Java语言,这些类在提交时加载,确保指定的类在JAR文件中。提交后立即进行所有检查,因此当出现错误时,用户可以快速收到提示信息,而无需自己查看错误日志。下一步是将代码复制到BookKeeper。在protocolbuffer结构体中将提交代码中的所有参数表示为FunctionMetaData,如下:messageFunctionMetaData{FunctionDetailsfunctionDetails;PackageLocationMetaData包位置;uint64版本;uint64创建时间;mapinstanceStates;函数元数据结构。从工作者的角度来看,FunctionMetaDataManager负责维护系统记录。FunctionMetaDataManager将完全限定的函数名(FullyQualifiedFunctionName,FQFN)映射到由Pulsar主题命名空间和函数信息组成的FunctionMetaData;根据提交内容更新和管理计算机状态,检查冲突并将元数据写入主题。调度进程系统收到函数提交后,使用可插拔的调度器进行调度。如果功能仅在提交后由领导者执行,则调度程序将被激活。通过容灾订阅协调topic,确定leader,即topic中的consumer。Leader将任务写入任务主题(AssignmentTopic)。任务主题存储在特定于Pulsar的命名空间中,并分配给每个工作人员。Worker有权限查看任务表(AssignmentTable)中所有压缩过的包含所有系统逻辑的任务,例如FQFN和实例ID。执行流程改变任务Table,触发执行流程。Worker部分(FunctionRunTimeManager)负责管理函数周期性任务,比如使用Spawner启动或停止消息。Java实例和PulsarIOPulsarJava实例被封装为Source、函数(实际逻辑)或Sink集合。Source从inputtopic中读取数据,Sink从topic中读取数据。使用内置函数时,“Source”为PulsarSource,从Pulsar读取数据;“Sink”是PulsarSink,向Pulsar主题写入数据。但是如果你提交一个类似于GooglePub/Sub的Source(不是PulsarSource),使用PulsarIO成为一个connector,而实际功能类似于PulsarFunction,那么这个函数就是一个特征函数(IdentityFunction),可以用于处理数据。提交后,PulsarSink将此函数写入主题;非PulsarSink写入外部系统。由于PulsarIO是基于PulsarFunctions编写的,因此Pulsar可以从外部系统读取数据。PulsarFunctions入门PulsarFunctions不仅通过消除对外部处理系统的需求简化了应用程序开发,还简化了故障排除并减轻了运维负担。借助简单、轻量级的无SDKAPI和执行框架,PulsarFunctions可以过滤、路由和扩充大多数流媒体使用场景。开发者可以编写自己的Pulsar函数,提交到Pulsar集群后,可以与PulsarFunctions的其他内置函数一起使用。此外,可以使用PulsarIO处理非Pulsar源并将其写入外部系统。更多信息,点击此处查看演示PPT,或扫描底部二维码加入Pulsar技术交流群。相关阅读基于PulsarFunctions的事件处理设计模式翻译|PulsarFunctions的简要指南:原理、目标和计划使用PulsarFunctions进行实时分析一篇文章了解PulsarFunctions