原文作者 Sanjeev Kulkarni,翻译 Sijia@StreamNative,如需转载,请后盾留言。
英文链接:https://streamnative.io/blog/…对于 Apache Pulsar
Apache Pulsar 是 Apache 软件基金会顶级我的项目,是下一代云原生分布式音讯流平台,集音讯、存储、轻量化函数式计算为一体,采纳计算与存储拆散架构设计,反对多租户、长久化存储、多机房跨区域数据复制,具备强一致性、高吞吐、低延时及高可扩展性等流数据存储个性。
GitHub 地址:http://github.com/apache/pulsar/
Pulsar Functions 是开源数据技术框架 Apache Pulsar 为轻量级计算提供的内置流处理器。在 2020 年 Pulsar Summit 会议上,我发表了一次对于 Pulsar Functions 的演讲。本文将深刻探讨 Functions 的架构和实现细节。
Pulsar Functions 简介
Pulsar Functions 是 Pulsar 音讯零碎的外围计算根底构造。应用 Pulsar Functions,无需部署独自的零碎(如 Apache Storm、Apache Heron),即可基于单条音讯创立简单的解决逻辑,简化事件流并引入无服务架构。
轻量级计算 function 从一个或多个 Pulsar topic 生产音讯,将用户提供的解决逻辑利用于每条音讯,并公布计算结果到其余 topic。因为不须要内部解决零碎,Pulsar Functions 不仅使利用程序开发更便捷,还简化了故障排除操作,加重了运维累赘。
另外,开发人员能够间接应用 Pulsar Functions 的 API。理解 Java 语言的程序员能够间接应用 Java SDK 编写 function。示例如下:
import java.util.function.Function;
public class ExclamationFunction implements Function<String, String>
@Override
public String apply(String input) {return input + "!";}
}
Pulsar Functions 旨在借助简略的 API 和执行框架解决常见的流应用场景(如过滤、路由、裁减),而不是替换重量级流解决引擎(如 Spark、Flink)。
用户能够自行编写 Pulsar function,提交到 Pulsar 集群后,即可与 Pulsar Functions 的内置治理部件一起应用。应用基于 CRUD 的 REST API,用户能够从任一工作流程提交 function,提交后即可运行。
提交流程
提交 function 的流程称为 Function Representation。提交流程的构造称为 FunctionConfig,包含租户、命名空间和名称。Function 通过提交 JAR 或 Python 文件生产输出和输入数据、用户配置、私密治理反对等。另外,用户能够同时运行多个 function。
public class FunctionConfig {
private String tenant;
private String namespace;
private String name;
private String className;
private Collection<String> inputs;
private String output;
private ProcessingGuarantees processingGuarantees;
private Map<String, Object> userConfig;
private Map<String, Object> secrets;
private Integer parallelism;
private Resources resources;
...
}
用户提交 function 后,零碎将会对 function 进行“提交查看”或“验证”,确保用户有权限提交此 function 到特定的命名空间和租户。如果应用 Java 语言,提交时就会加载这些类,确保指定的类在 JAR 文件中。所有的查看都会在提交时立即进行,因而呈现谬误时,用户能够很快收到提醒音讯,而不必自行查看谬误日志。
下一步是复制代码到 BookKeeper。将提交代码中的所有参数以协定缓冲构造示意为 FunctionMetaData,示例如下:
message FunctionMetaData {
FunctionDetails functionDetails ;
PackageLocationMetaData packageLocation;
uint64 version ;
uint64 createTime;
map<int32 , FunctionState> instanceStates ;
FunctionAuthenticationSpec functionAuthSpec ;
}
Function MetaData Manager 负责管理 FunctionMetaData 构造。从 worker 的角度来看,Function MetaData Manager 负责保护零碎记录。Function MetaData Manager 将齐全限定 Function 名称(Fully Qualified Function Name,FQFN)映射到由 Pulsar topic 命名空间和 function 信息形成的 Function MetaData;基于提交内容更新、治理计算机状态,当提交多个 worker 时,查看抵触并将元数据写入 topic。
调度流程
零碎接管 function 提交后,应用可插拔调度程序进行调度。如果 function 在提交后仅由 leader 执行,就会激活调度程序。通过灾备形式订阅协调 topic 即可确定 leader,即 topic 中的 consumer。
Leader 将工作写入到工作 Topic(Assignment Topic)。工作 Topic 贮存在 Pulsar 特定的命名空间中,被调配给各个 worker。Worker 有权限查看所有已压缩并蕴含所有零碎逻辑的工作,如工作 Table(Assignment Table)中的 FQFN、实例 ID。
执行流程
更改工作 Table 即可触发执行流程。Worker 的部件(Function RunTime Manager)负责管理 function 周期工作,如应用 Spawner 启动或进行音讯。
Java 实例和 Pulsar IO
Pulsar Java 实例被封装为 Source、function(理论逻辑),也能够说是 Sink ensemble。Source 从 input topic 读数据,而 Sink 从 topic 读数据。
在应用内置 function 时,“Source”即为 Pulsar Source,从 Pulsar 读数据;“Sink”即为 Pulsar Sink,向 Pulsar topic 写数据。
但如果提交相似于 Google 公布 / 订阅的 Source(非 Pulsar Source),借助 Pulsar IO 成为 connector,且理论性能相似于 Pulsar Function,则此 function 为个性 Function(Identity Function),可用于解决数据。提交后,Pulsar Sink 向 topic 写入此 function;非 Pulsar Sink 则向内部零碎写入。正因为 Pulsar IO 基于 Pulsar Functions 编写,Pulsar 才得以从内部零碎读数据。
开始应用 Pulsar Functions
因为不须要内部解决零碎,Pulsar Functions 不仅使利用程序开发更便捷,还简化了故障排除操作,加重了运维累赘。通过简略、轻量级无 SDK 的 API 和执行框架,Pulsar Functions 能够过滤、路由、裁减大多数流应用场景。开发人员能够自行编写 Pulsar function,提交至 Pulsar 集群后即可与 Pulsar Functions 的其余内置性能一起应用。此外,应用 Pulsar IO 能够解决非 Pulsar Source 并将其写入内部零碎。
想要理解更多信息,点击这里查看演讲 PPT,或扫描底部二维码退出 Pulsar 技术交换群。
相干浏览
- 基于 Pulsar Functions 的事件处理设计模式
- 译文 | Pulsar Functions 简要指南:原理、指标与布局
- 用 Pulsar Functions 进行实时剖析
- 一篇文章理解 Pulsar Functions