当前位置: 首页 > 科技观察

PulsarFunction流处理应用是什么?_0

时间:2023-03-13 21:01:53 科技观察

“无服务器”令人兴奋,包括对其确切含义的争论(例如,考虑到代码仍在某些服务器上运行,“无服务器”是否是一个有意义的名称)。不管“无服务器”的确切定义如何,无服务器的基本思想是通过将开发人员与执行他们创建的编程逻辑的基础设施分离来简化开发人员的生活。与传统单体应用程序开发中的开发人员体验不同,开发人员往往会花费大量时间思考他们的代码如何与整个应用程序的架构和操作集成和交互。相比之下,无服务器的承诺是开发人员只需专注于通过简单的API和抽象实现他们的逻辑,而基础设施和运营团队负责处理和执行该逻辑的环境。市场上已经有相当多的通用无服务器框架,但同样的概念也可以应用于更具体的技术支持。现在让我们谈谈“流处理”。传统上,流处理一直是专用流处理引擎(SPE,或“专用流处理引擎”)的领域,例如ApacheStorm、ApacheHeron等。这些SPE提供了一个复杂的框架和执行模型,能够执行各种各样的流程。流处理的方法主要是基于函数式编程的概念(如map、flatmap等)和将处理流编译成有向无环图(DAG)的思想。同时,流处理的方法也被集成到很多混合流处理系统中,包括ApacheSparkStreaming、ApacheKafkaStreams、ApacheFlink等。尽管这些框架功能强大且灵活,但大多数开发人员并不熟悉这些框架,而且学习起来可能非常乏味。另一方面,运营团队在生产中的管理也很复杂。总之,复杂性和开销一直是在数据处理中使用流的重大障碍。然而,新技术正在将无服务器的概念带入流处理的世界。在本文中,我们将探讨Pulsar函数如何将无服务器概念引入ApachePulsar消息传递系统中的流处理。流处理的方法主要是基于函数式编程的概念(如map、flatmap等)和将处理流编译成有向无环图(DAG)的思想。同时,流处理的方法也被集成到很多混合流处理系统中,包括ApacheSparkStreaming、ApacheKafkaStreams、ApacheFlink等。尽管这些框架功能强大且灵活,但大多数开发人员并不熟悉这些框架,而且学习起来可能非常乏味。另一方面,运营团队在生产中的管理也很复杂。很多数据处理应用场景都是简单轻量级的。简单的ETL(提取、转换和加载)操作、基于事件的服务、实时聚合和事件路由都是不需要复杂拓扑或处理框架的场景。虽然这些应用场景可以使用SPE(SpecializedStreamProcessingEngine)来实现,但是开发者和用户一直被以下问题所困扰:1.搭建一个单独的流处理集群过于复杂和繁重,尤其是考虑到用户只需要SPE功能2.如此简单的处理,运维成本太高,因为成熟的SPE特性非常多,在部署、监控、维护等方面自然具有很高的复杂度;3、对于大多数简单的应用场景,成熟的SPE的API过于繁杂复杂。许多SPE都有基于函数式编程模型(例如map、flatmap、reduce等)的API,这些API可能是一个强大的工具。但对于很多应用场景,特别是如果用户不熟悉函数式编程范式,这种方案可能显得过于复杂和笨拙。Pulsar函数的创建是为了更容易在流数据上开发和部署处理逻辑。它的开发具有以下设计目标。1.简单的API:任何能够用支持的语言编写函数的人都应该能够在几分钟内完成工作;2、多语言:支持Java、Scala、Python、Go、JavaScript等流行编程语言;3.内置状态管理能力:为了简化开发者的架构,应该允许计算在计算过程中保持状态。系统要以稳固的方式维护这个状态,需要增量、获取、存储和更新等基本功能;4.Managedruntime:开发者不用担心在哪里和如何运行计算,开发者只需要提交他/她的计算,系统就会运行它:5.自动负载均衡:managedruntime应该负责分配工作线程到函数。6.可调:用户应该能够使用托管运行时来调整函数实例的数量。7.容错:托管运行时还应该以可靠和容错的方式运行开发人员的计算,以便最大限度地减少停机时间。8.多租户:不同的计算应该相互隔离。开发人员应指定他们的计算所需的资源量,运行时将强制执行这些资源配额。9.灵活的部署模型:计算应该能够作为线程、进程、docker容器等运行。此外,它们应该支持在Kubernetes等外部调度程序上运行。什么是Pulsar函数?PulsarFunctions是一个轻量级处理框架,位于ApachePulsar消息传递和流媒体平台中。Pulsar函数不仅受到ApacheHeron和ApacheStorm等流处理引擎的启发,还受到AWSLambda和GoogleCloudFunctions等函数即服务(FaaS)产品的启发。PulsarFunctions可以使用Java、Python等通用语言编写处理函数,将这些函数部署到Pulsar集群中,无需使用复杂的SDK。Pulsar负责为函数设置执行环境,提供弹性支持,并确保遵循消息传递保证。处理逻辑可以是函数中的任何内容,包括数据转换、动态路由、数据丰富、数据分析等。简而言之,PulsarFunctions的美妙之处在于开发者无需部署SPE即可享受SPE(ServiceProvisioningEnvironment,简称“服务供应环境”)带来的好处。如果开发人员已经在使用SPE或仍需要部署SPE,Pulsar可以轻松连接到任何流处理引擎(包括ApacheSparkStreaming、ApacheStorm、ApacheHeron或ApacheFlink)。PulsarFunctions的工作原理Pulsar函数使用来自一个或多个Pulsar主题的数据,启用自定义逻辑来处理数据。并且,在必要时,它支持使用简单的API将结果写入其他Pulsar主题。同一Pulsar函数的一个或多个实例可以执行用户定义的处理逻辑。其中,一个函数可以使用提供的状态接口来持久化中间结果,而其他函数则负责查询状态以检索这些结果。在最简单的情况下,您甚至不需要SDK来实现Pulsar功能。例如,在Java中,用户只能实现只有一个应用方法的java.util.function.Function接口。下面是一个Pulsar函数的例子,它对消息应用了一个简单的转换操作(向字符串添加一个字符“!”):importjava.util.Function;publicclassExclamationFunctionimplementsFunction{@OverridepublicStringapply(Stringinput){returnString.format("%s!",input);}如果用户需要上下文相关的信息,比如函数的名称,那么用户可以直接实现PulsarFunction接口而不是Java的Function接口。下面给出了相应的示例:publicinterfacePulsarFunction{Oprocess(Iinput,Contextcontext)throwsException;}Pulsar函数可以使用各种配置进行部署。下面,我们将详细讨论。Pulsar函数部署方案选择Pulsar函数由称为实例的执行器运行。单个实例执行该函数的一个副本。Pulsar函数具有内置的并行性,因为一个函数可以有很多实例,并且这些实例的数量可以在函数的配置中设置。为了最大限度地提高部署灵活性,PulsarFunctions提供了多种执行环境以支持多种部署选项,以及大量的运行时来执行以不同编程语言编写的函数。目前支持以下执行环境:RuntimeDescription当一个进程运行时,每个实例作为一个进程运行。Kubernetes/Docker运行时作为Docker容器运行线程每个实例作为线程运行每个实例作为线程运行,这种类型仅适用于Java实例,因为PulsarFunctions框架本身是用Java编写的,每个执行环境都会产生不同的成本并提供不同的隔离保证。运行Pulsar函数运行Pulsar函数最简单的方法是实例化运行时和函数,并在本地运行它们(本地运行模式)。有一个辅助命令行工具可以使这变得非常容易。在本地运行模式下,该函数作为独立的运行时运行,可以由任何进程、Docker容器或可用的线程控制机制监视和控制。用户可以在机器上手动生成这些运行时,或者使用Mesos/Kubernetes等复杂的调度程序将它们分布在集群中。以下是在“本地运行”模式下启动Pulsar功能的示例命令:$bin/pulsar-adminfunctionslocalrun\--inputspersistent://sample/standalone/ns1/test_src\--outputpersistent://sample/standalone/ns1/test_result\--jarexamples/api-examples.jar\--classNameorg.apache.pulsar.functions.api.examples.ExclamationFunction用户还可以在Pulsar集群中使用代理运行函数。在这种模式下,用户可以将他们的功能“提交”到正在运行的Pulsar集群,Pulsar将负责将它们分布在整个集群中,监控并执行它们。这种模型允许开发人员专注于编写他们的功能,而不必担心管理他们的生命周期。下面是一个提交Pulsar函数以在Pulsar集群中运行的示例:/ns1/test_result\--jarexamples/api-examples.jar\--classNameorg.apache.pulsar.functions.api.examples.ExclamationFunction\--namemyFunction另一种选择是将函数的整个配置放在一个在YAML文件中,它看起来像这样:inputs:persistent://sample/standalone/ns1/test_srcoutput:persistent://sample/standalone/ns1/test_resultjar:examples/api-examples.jarclassName:org.apache.pulsar。功能。api.examples.ExclamationFunctionname:myFunction如果开发者选择通过YAML配置函数,可以使用更简单的create命令:你以YAML方式配置一个函数,可以使用更简单的create命令:Pulsar函数提供了以下函数,可以针对不同的函数指定:1.Atmostonce(最多一次)2.Atatmostonce(至少一次)once)3.Effectiveonce(Effectiveonce)where,Effectiveonce(Effectiveonce)processingisdoneatleastonce(A这意味着,状态更新可以发生两次,但状态更新只能应用一次,任何重复状态会在server端被丢弃总结通过本文的介绍,希望能引起读者对Pulsar功能的兴趣。此外,本文还向读者展示了Pulsar函数的扩展能力:如何让开发者将Pulsar作为一个统一的系统来处理数据流。当然,Pulsarfunctions还包含更多的能力和可能性:读者可以在ApachePulsar网站上了解更多关于Pulsarfunctions的信息。译者介绍朱宪忠,51CTO社区编辑,51CTO专家博主,讲师,潍坊某高校计算机教师,自由编程资深人士。早期专注于各种微软技术(编译成三本与ASP.NETAJX和Cocos2d-X相关的技术书籍)。/ESP32/RaspberryPi等物联网开发技术和Scala+Hadoop+Spark+Flink等大数据开发技术。参考链接:https://dzone.com/articles/an-introduction-to-stream-processing-with-pulsar-f