简介
- Apache NiFi 是一个易于使用、功能强大而且可靠的数据拉取、数据处理和分发系统,用于自动化管理系统间的数据流。
- 它支持高度可配置的指示图的数据路由、转换和系统中介逻辑,支持从多种数据源动态拉取数据。
- NiFi原来是NSA(National Security Agency [美国国家安全局])的一个项目,目前已经代码开源,是Apache基金会的顶级项目之一
- NiFi基于Web方式工作,后台在服务器上进行调度。
- 用户可以为数据处理定义为一个流程,然后进行处理,后台具有数据处理引擎、任务调度等组件。
Nifi 核心概念
Nifi 的设计理念接近于基于流的编程 Flow Based Programming。
FlowFile:表示通过系统移动的每个对象,包含数据流的基本属性
FlowFile Processor(处理器):负责实际对数据流执行工作
Connection(连接线):负责不同处理器之间的连接,是数据的有界缓冲区
Flow Controller(流量控制器):管理进程使用的线程及其分配
Process Group(过程组):进程组是一组特定的进程及其连接,允许组合其他组件创建新组件
设计模型
- 什么是SEDA(Staged Event-Driven Architecture)?
- 核心思想是把一个请求处理过程分成几个Stage,不同资源消耗的Stage使用不同数量的线程来处理,Stage间使用事件驱动的异步通信模式。
- Nifi的设计模型类似SEDA, 其提供了以下优势:
- 适用于视觉创建和管理处理器的有向图
- 本质上是异步的,即使在处理和流量波动时也允许非常高的吞吐量和自然缓冲
- 提供高度并发的模型,而开发人员不必担心并发性的典型复杂性
- 促进发展粘性和松散耦合的部件,然后可以在其他情况下重复使用,并促进可测试的部件
- 资源受限的连接使关键功能(如背压和压力释放)非常自然和直观
- 错误处理变得与基本逻辑一样自然,而不是粗粒度的一网打尽
- 数据进出系统的点以及流程如何被很好的理解和易于跟踪
Nifi 架构
Nifi是在主机操作系统上的JVM内执行。JVM上的Nifi主要组件如下:
网络服务器
- Web服务器的目的是托管NiFi的基于HTTP的命令和控制API。
流控制器
- 流控制器是操作的大脑。它提供用于扩展程序运行的线程,并管理扩展程序接收资源以执行的时间表。
扩展
- 有各种类型的NiFi扩展在其他文档中描述。这里的关键是扩展在JVM中运行和执行。
FlowFile存储库
- FlowFile存储库是NiFi跟踪目前在流程中活动的给定FlowFile的知识状态。
- 存储库的实现是可插拔的。默认方法是位于指定磁盘分区上的持久写入前端日志。
内容存储库
- Content Repository是给定FlowFile的实际内容字节。存储库的实现是可插拔的。
- 默认方法是一个相当简单的机制,它将数据块存储在文件系统中。
- 可以指定多个文件系统存储位置,以便获得不同的物理分区,以减少任何单个卷上的争用。
源头存储库
Provenance Repository是存储所有来源的事件数据的地方。
存储库构造是可插入的,默认实现是使用一个或多个物理磁盘卷。
在每个位置内,事件数据被索引和可搜索。NiFi还能够在集群内运行。
从NiFi 1.0版本开始,采用零主分类范例。NiFi集群中的每个节点对数据执行相同的任务,但是每个节点都在不同的数据集上进行操作。
Apache ZooKeeper选择单个节点作为群集协调器,故障转移由ZooKeeper自动处理。
所有群集节点向群集协调器报告心跳和状态信息。集群协调器负责断开连接节点。
此外,每个集群都有一个主节点,也由ZooKeeper选择。
作为DataFlow管理者,可以通过任何节点的用户界面(UI)与NiFi集群进行交互。
操作者的任何更改都会被复制到群集中的所有节点,从而允许多个入口点。
Nifi 的性能期望与特点
NiFi旨在充分利用其正在运行的底层主机系统的功能。对于CPU和磁盘,资源最大化特别强。有关其他详细信息。
对于IO
可以看到的吞吐量或延迟可能会有很大的不同,这取决于系统的配置方式。
考虑到大多数主要的NiFi子系统都有可插拔的方法,性能取决于实现。
但是,对于具体和广泛适用的内容,请考虑开箱即用的默认实现。
保守的,假设典型服务器中适度的磁盘或RAID卷上的读/写速率大约为每秒50 MB。对于大量数据流,NiFi应该能够有效地达到每秒100 MB或更多的吞吐量。
由于物理分区和内容存储库都预期添加到NiFi的线性增长, 可能会导致FlowFile存储库和来源存储库的某个时间点出现瓶颈。
Nifi 计划提供一个基准测试和性能测试模板,以包含在构建中,从而允许用户轻松测试他们的系统,并确定瓶颈在哪里,以及哪些可能成为一个因素。
此模板还可使系统管理员轻松进行更改并验证其影响。
对于CPU
流控制器用作引擎,指定特定处理器何时被执行线程。
写处理器一经执行任务就会立即返回线程。
流控制器可以给出一个配置值,指示其维护的各种线程池的可用线程。
使用的理想线程数取决于主机系统资源的核心数量,无论该系统是否运行其他服务,以及流程中的处理特性。
对于典型的IO大流量,可以使数十条线程可用。
对于RAM
- NiFi存在于JVM中,因此受限于由JVM提供的内存空间。
- JVM垃圾收集成为限制实际堆大小的一个非常重要的因素,可以通过调整GC优化应用程序运行时间。
- 当定期阅读相同的内容时,NiFi工作可能是I / O密集型的。配置足够大的磁盘以优化性能。
Nifi 功能的高级概述
流量管理
- 保证交货
- NiFi的核心理念是,即使在非常高的规模,必须保证交付。
- 数据缓冲背压和压力释放
- NiFi支持对所有排队的数据进行缓冲,以及当队列达到指定限制时提供背压的能力,或者在数据达到指定年龄时使其老化(其值已经消失)的能力。
- 优先排队
- NiFi允许设置一个或多个优先级排序方案来了解如何从队列中检索数据。
- 默认值是最早的,但有时候数据应该被拉到最新,最大的第一个或其他一些自定义方案。
- 流特定Qos(延迟 vs 吞吐量, 丢失容限等)
- 数据流的一些点数据非常关键,并且是不容忍的。
- 还有一段时间,它必须在几秒钟内被处理和交付成为任何价值。
- NiFi使得细粒度流特定配置这些问题。
- 保证交货
使用方便
- 视觉指挥与控制
- 数据流可能变得相当复杂。能够可视化这些流程并在视觉上表达它们可以大大减少复杂性并确定需要简化的领域。
- NiFi不仅可以直观地建立数据流,而且可以实时地实现。而不是设计和部署它更像是成型工具。
- 如果对更改的数据流进行更改立即生效。
- 更改是细粒度的,并且与受影响的组件隔离。不需要为了进行一些具体的修改而停止整个流程。
- 流模板
- 数据流往往是高度模式化的,而通常有许多不同的方式来解决问题。
- 模板允许主题专家构建和发布他们的流程设计,并为其他人创造和合作。
- 资料来源
- Nifi自动记录,索引并提供可用的来源数据,因为对象即使在扇入,扇出,转换等过程中也可以流经系统。
- 该信息在支持合规性,故障排除,优化和其他场景方面变得非常重要。
- 恢复/记录细粒历史的滚动缓冲区
- NiFi的内容存储库旨在作为历史的滚动缓冲区。只有当数据从内容存储库中老化或者需要空间时才会被删除。
- 这与数据来源功能相结合,使得在对象的生命周期中甚至跨越世代的特定点上实现点击内容,内容下载和重放非常有用的基础。
- 视觉指挥与控制
安全
- 系统到系统
- 数据流中每一点的NiFi都可以通过使用诸如双向SSL等加密协议提供安全交换。
- 此外,NiFi使得流可以加密和解密内容,并使用发件人/收件人方程的任一侧上的共享密钥或其他机制。
- 用户到系统
- NiFi支持双向SSL身份验证,并提供可插拔授权,从而可以正确控制用户的访问和特定级别(只读,数据流管理器,管理员)。
- 如果用户在流程中输入密码等敏感属性,则立即加密服务器端,即使在加密形式下也不会再次暴露在客户端。
- 多租户授权
- 给定数据流的权限级别适用于每个组件,允许管理员用户具有细粒度的访问控制。
- 这意味着每个NiFi集群都能够处理一个或多个组织的要求。
- 与独立拓扑相比,多租户授权可实现数据流管理的自助服务模式,从而允许每个团队或组织对流程进行管理,同时充分了解流程的其他部分,无法访问。
- 系统到系统
可扩展架构
延期
- NiFi的核心是扩展的核心,因此它是数据流处理可以以可预测和可重复的方式执行和交互的平台。
- 扩展点包括:处理器,控制器服务,报告任务,优先级和客户用户界面。
分类器隔离
- 对于任何基于组件的系统,可能会迅速发生依赖问题。
- NiFi通过提供自定义类加载器模型来解决这个问题,确保每个扩展捆绑包都暴露在非常有限的依赖关系中。
- 因此,可以构建扩展,而不用担心它们是否可能与另一个扩展冲突。
- 这些扩展束的概念称为NiFi Archives, 在开发人员指南中有更详细的讨论。
站点到站点通信协议
- NiFi实例之间的首选通信协议是NiFi站点到站点(S2S)协议。
- S2S可以方便,高效,安全地将数据从一个NiFi实例传输到另一个。
- NiFi客户端库可以轻松构建并捆绑到其他应用程序或设备中,以通过S2S与NiFi通信。
- S2S中都支持基于套接字的协议和HTTP(S)协议作为底层传输协议,从而可以将代理服务器嵌入到S2S通信中。
灵活的缩放模型
横向扩展(聚类)
- NiFi旨在通过如上所述将多个节点聚类在一起使用来展开。
- 如果单个节点被配置并配置为每秒处理数百MB,则可以配置适度的集群来处理每秒的GB数。
- 这将带来NiFi与获取数据的系统之间的负载平衡和故障转移的挑战。可以使用基于异步的消息队列, 如Kafka来解决问题。
- 使用NiFi的站点到站点功能也非常有效,因为它是允许NiFi和客户端(包括另一个NiFi集群)相互通话,共享关于加载的信息以及在特定授权端口上交换数据的协议。
放大与缩小
NiFi也被设计成以非常灵活的方式进行放大和缩小。
在从NiFi框架的角度增加吞吐量方面,可以在配置时增加“计划”选项卡下的处理器上的并发任务数量。
这允许更多的进程同时执行,提供更大的吞吐量。
可以将NiFi完美地缩放到适合于在硬件资源有限的边缘设备上运行,因为需要较小的占用空间。