导读:在 3 月 6 日 TGIP-CN 直播流动上,咱们邀请到 StreamNative 高级工程师吕能,他为大家分享了 Pulsar Function Mesh 的性能与个性。上面是吕能分享视频的简洁文字整顿版本,供大家参考。
很快乐明天能跟大家分享 StreamNative 基于 Pulsar Function 做的新工作:Function Mesh,它整个外围的想法是把一些简单的、拆散的、独自治理的 Function 进行统一化治理,基于原生地整合到 Kubernetes 中,并能充分利用其多方面的性能和调度算法。
Pulsar 中的数据处理
首先看一下 Pulsar 中所反对的各种数据处理的模块和形式,次要分为三个方面。第一,是基于 Presto 的交互式查问,Pulsar 中有本人的 Pulsar SQL,基于 Presto 对 Pulsar 整个集群查问;有和 Presto 相干的 Connector,能够间接通过 Presto 集群来查问 topic。
第二,作为音讯队列、音讯解决数据的外围,Pulsar 能够对接各种不同的流数据或者批数据处理的框架,比方 Flink、Spark、Hive。后续咱们会公布 Pulsar 和 Flink SQL 整合的残缺解决方案。
最初是 Pulsar 内建了 Pulsar Function,核心思想在于提供一个最简略的 API,让用户可能不便地解决在 Pulsar 中流动的数据。总结来说,Pulsar Function 是一个轻量级数据处理的过程,次要进行如下操作:
- 生产来自一个或多个 Pulsar topic 的音讯;
- 将用户提供的解决逻辑利用于每个音讯;
- 将后果公布到一个 Pulsar topic。
Pulsar Function
何为 Pulsar Function
在下面提及的轻量级数据处理过程 Pulsar Function 如图所示。用户能够输出多个 topic,每输出一个 topic 都能够向用户自定义的 Pulsar Function 发送数据,Pulsar Function 的处理单元解决实现之后把后果发送到惟一一个 Output Pulsar topic,其中一些辅助性的 topic 能够进行日志或音讯的收集。
Pulsar Function 并不是一个齐全的流解决框架,不像 Flink 一样提供很多保障,也并不是一个计算的形象层,其次要与 Pulsar 紧密结合在一起进行计算工作的解决。它的部署很简略,不须要再额定搭建治理任何集群,只须要在 Pulsar 配置文件中关上对于 Function 的反对,就能够向已有的 Pulsar 集群提交 Function。用户能够间接在集群中进行数据处理,而并不需要额定保护另一套集群去对接去解决。
Pulsar Function 常见的利用场景,比方集中在 ETL 数据清理的工作、实时数据的聚合 …… 因为 Function 自身其实是一个十分通用的形象,它只是一个利用函数,所以也能够利用于微服务场景。在 Function 利用的函数中能够调用任何的 API 进行操作,比方事件路由,用户能够应用 Pulsar Function 将数据散发到不同的集群。
如何实现 Pulsar Function
上图为 Pulsar Function 的 API,Pulsar Function 反对三种语言来进行数据的解决:Java、Python、Golang。
Pulsar Function 反对的语义有三种:
- 最多一次(At-most once):不关怀音讯是否发送胜利、不须要音讯发送的返回值;
- 至多一次(At-least once):发送到的音讯未承受到返回值会从新发送,保障音讯不丢,可能会造成音讯的反复,在生产的时候须要对音讯进行幂等性操作;
- 准确一次(Exactly once):保障音讯不丢且不会反复。
Pulsar Function 自带简略的内件状态治理分为三种:
- 提供
Context
对象反对用户可拜访状态; - 将状态存储在 BookKeeper 中;
- 反对服务端操作(如计数器)。
之前介绍过的 API 除了 Input 之外,还会带有 Context 的参数,很多状态的治理是在 Context 中。
publicclassWordCountFunctionimplementsFunction<String, void> {
@Override
publicVoid process(String input, Context context) throwsException{Arrays.aslist(input.split(“\.”)).forEach(word -> context.incrCounter(word, 1));
}
}
如何部署 Function
Pulsar Function 的 CLI 可进行创立、删除、更新、获取、重启、敞开、开启等等一系列的操作。
$ ./pulsar—admin functions
Usage: pulsar—admin functions [options] [command] [command options]
Commands:
localrun Run a PulsarFunction locally, rather than deploy to a Pulsar cluster)
create Create a PulsarFunctionin cluster mode (deploy it on a Pulsar cluster)
deleteDelete a PulsarFunction that is running on a Pulsar cluster
update Update a PulsarFunction that has been deployed to a Pulsar cluster
getFetch information about a PulsarFunction
restart Restartfunction instance
stop Stopsfunction instance
start Starts a stopped function instance
status Check the current status of a PulsarFunction
stats Get the current stats of a PulsarFunction
list List all PulsarFunctions running under a specific tenant andnamespace
querystate Fetch the current state associated with a PulsarFunction
putstate Put the state associated with a PulsarFunction
trigger Trigger the associated specified Pulsarwith a supplied value
Pulsar Function 的特点
Pulsar Function 有上面的几个特点:
- 高效开发:简略的 API,不须要消耗大量精力学习,并且反对多种语言;
- 运维不便:与 Pulsar 齐全集成,无需额定的零碎 / 服务设置;
- 易于故障排除:本地运行时很不便,log topic 易于应用。
详解 Function Mesh
上面对 Pulsar Function 做了介绍,本局部内容将为大家深刻开展介绍 Function Mesh。
何为 Function Mesh
Function Mesh 是一组 function 的汇合,它能让多个 function 在一起协调实现数据处理指标,并且每个 function 有各自明确任务和被定义好的 stage。特别强调的是,Function Mesh 初衷不是代替 Flink 或者成为 Flink 的竞争对手,而是一个对现有流数据处理引擎的补充与反对。
下图是 Function Mesh 的经典视图:
如上图所示,在 Function Mesh 之前,咱们所应用的都是单个 Pulsar Function。引入 Function Mesh 之后,多个 function 就有了关联和数据联系,最初产生想要的后果,能够映射成微服务的不同场景。
Function Mesh 实现计划
Function Mesh 设计实现计划一:基于 Pulsar
目前 Pulsar 提供了命令行工具,可用来治理单个 function,如上图所示例,则须要在 Pulsar 命令行工具启动 function 1 到 function 6 才行,如此会带来治理的反复和复杂度;同时 Pulsar 会将上述多个 function 当作单个 function 来解决,使得很难追踪 function,无奈将它们当作组合解决;也无奈很好地理解各自 function 的上下游和解决程序。
面对上述提到的几个问题,咱们针对性提出解决方案,详情可参见 PIP-66[[1]](#)。PIP-66 次要的思路是在 Pulsar 中提供对 Function Mesh 的原生反对,即通过 Pulsar 命令行提交 Function Mesh,并在 Function Mesh YAML 配置文件中定义所蕴含的每个 function 参数及组织关系、输出和输入起源等。
bin/pulsar-admin function-mesh create -f mesh.yaml // 创立 Function Mesh 示例命令
// YAML 配置演示
# Metadata
name: PIP_Mesh
namespace: PIP_Namespace
tenant: PIP_Tenant
# Function Mesh configs
jarFile: /local/jar/files/example.jar
# Functions
functionInfos:
- name: Func1
classname: org.apache.pulsar.functions.api.examples.ExclamationFunction
replicas: 1
inputs:
- pulsar_topic_sourcce
output:
- pulsar_topic_1
- name: Func2
classname: org.apache.pulsar.functions.api.examples.ExclamationFunction
replicas: 1
inputs:
- pulsar_topic_1
output:
- pulsar_topic_result
下图是根据上述思路产生的一个 Function Mesh 调度计划,最大化利用已有的 Pulsar Function 调度机制实现 Function Mesh 的设计指标,当然也引入了 FunctionMeshManager
来治理 Function Mesh 的元数据。
Function Mesh 设计实现计划二:基于 Kubernetes
随着整体我的项目和相干云端我的项目的推动,咱们发现基于 Kubernetes 实现 Function Mesh 是十分有意义和价值的事件。用户要创立 Function Mesh,能够间接利用 Kubernetes 命令行工具创立(如下演示命令),而咱们要做的是开发 CRD,类型就是 FunctionMesh,相干关系与计划一中的设定基本一致:
$ kubectl apply -f function-mesh.yaml
…
apiVersion: cloud.streamnative.io/v1alpha1
kind: FunctionMesh
metadata:
name: functionmesh-sample
spec:
functions:
- name: f1
…
- name: f2
…
- name: f3
…
- name: f4
…
- name: f5
…
- name: f6
…
在该模式下,Function Mesh 不再是运行在 Pulsar 上,而是运行在 Kubernetes 云平台之上。在该模式下咱们能够定义一系列资源,如单个 Function、Mesh(一整套 function 组合)、Source 和 Sink,其中 Source 和 Sink 更多是 Pulsar connector 中的概念,Source 是将第三方零碎数据导入到 Pulsar topic 中,sink 则是相同的动作,这样也不便解决数据湖等场景。
基于 Kubernetes 的 Function Mesh 调度计划,如下图所示:
计划比照:Pulsar vs Kubernetes
比照基于 Pulsar 和基于 Kubernetes 的 Function Mesh 实现计划,咱们有几点思考:
- 如果可能利用 Kubernetes 的调度能力是非常无利的事件,对不同工作的调度是 Kubernetes 的专项能力,并且也能提供高可用、容错性保障。
- 在云环境中,Function 成为一等公民,位置与 Pulsar 提供的服务一样。
- 咱们如果能将 Function 从 Pulsar 当中抽离进去,那它则具备与其余音讯零碎进行数据对接、解决的后劲,相似 AWS 提供的 Lamba Function,也不便咱们进行事件驱动型的模式设计。
演示视频
(点击 链接 查看原推文视频)
后续布局
目前咱们曾经进行了大量后期 Function Mesh 的工作,对 Function Mesh 咱们也有更多布局:
- 提供更加云原生的反对;
- 依据不同语言,定制 Function Runtime;
- Function registry:不便用户进行打包治理
- …
咱们也打算于近期将其开源。如果你感兴趣,可在底部联系 Pulsar Bot 回复“Mesh”进行试用,欢送给到咱们反馈。
相干浏览
- 译文 | 深度分析 Pulsar Functions
- 译文 | 应用 Apache Pulsar Functions 进行简略事件处理