Apache NiFi 是一个易于使用、功能强大而且可靠的数据处理和分发系统,在大数据生态中的定位是成为一个统一的,与数据源无关的大数据集成平台。Apache NiFi 是为数据流设计,它支持高度可配置的指示图,来指示数据路由、转换和系统中流转关系,支持从多种数据源动态拉取数据。简单地说,NiFi是为自动化系统之间的数据流而生。这里的数据流表示系统之间的自动化和受管理的信息流。 基于WEB图形界面,通过拖拽、连接、配置完成基于流程的编程,实现数据采集、处理等功能。
NiFi特点
-
Apache NiFi 是一个易于使用、功能强大而且可靠的数据拉取、数据处理和分发系统,用于自动化管理系统间的数据流。
-
支持高度可配置的指示图的数据路由、转换和系统中介逻辑,支持从丰富多样的数据源动态拉取数据。
-
NiFi基于Web方式工作,后台在服务器上进行调度。
ApacheNiFi支持数据路由、转换和系统中介逻辑的强大且可扩展的有向图。
简单地说,NiFi的构建是为了使系统之间的数据流自动化,是指系统之间的自动化和管理的信息流。自从企业拥有不止一个系统以来,这个问题空间就一直存在,其中一些系统创建数据,而一些系统消耗数据。
数据流处理面临的高级挑战
传统数据流接收处理过程面临着以下问题:
-
系统错误:网络错误、磁盘错误、软件崩溃,甚至是人为操作错误,造成了数据流处理不稳定。
-
数据访问超过处理能力:当数据处理某一模块出现瓶颈问题时,不能及时处理到达的数据
-
异常数据处理:数据太大,数据传输太慢,数据损坏、问题数据、数据碎片及数据格式错误问题。
-
业务快速演进:现实业务需求快速变更,新的数据处理流程的设计,已有的流程的修改,都必须要快速实现。
-
多系统升级不同步导致的兼容问题:原有系统的协议和数据格式,会伴随系统的升级有一定的调整,同时单个系统的升级会影响周边系统。数据流可以把多个大型分布式系统串边在一起,这些系统可以是松散地,甚至设计之初就没考虑未来集成。
-
生产系统如何持续改进:数据流(dataflow)一直是架构中的痛点之一,随着数据流日益得到更多企业的重视,而现在有越来越多事物的兴起让企业开始重视数据流,包括:面向服务的体系结构(SOA),API,物联网IOT和大数据。此外,合规性,隐私性和安全性所需的严格程度也在不断提高。对于这些新鲜事物或概念,数据流的需求大致相同,主要区别在于复杂性,适应业务变化的速度,以及大规模边缘用例。NiFi旨在帮助解决这些现代数据流挑战。
NiFi的核心概念
NiFi的基本设计概念与基于流编程(fbp)的主要思想密切相关。以下是一些主要的NiFi概念以及它们如何映射到FBP:
NiFi Term | FBP Term | Description |
---|---|---|
FlowFile | Information Packet | FlowFile表示在系统中移动的每个对象,对于每个对象,NiFi跟踪键/值对属性字符串的映射及其零个或多个字节的关联内容。 |
FlowFile Processor | Black Box | 处理器实际执行工作。处理器在系统之间执行数据路由、转换或中介的组合。处理器可以访问给定流文件及其内容流的属性。处理器可以对给定工作单元中的零个或多个流文件进行操作,并提交该工作或回滚。 |
Connection | Bounded Buffer | 连接提供处理器之间的实际链接。它们充当队列,允许各种进程以不同的速率进行交互。这些队列可以动态地划分优先级,并且可以具有负载上限,从而启用背压。 |
Flow Controller | Scheduler | 流控制器维护进程如何连接的知识,并管理所有进程使用的线程及其分配。流控制器充当代理,促进处理器之间的流文件交换。 |
Process Group | subnet | 进程组是一组特定的进程及其连接,可以通过输入端口接收数据,通过输出端口发送数据。通过这种方式,流程组允许通过组合其他组件来创建全新的组件。 |
NiFi做为构建强大和可扩展数据流的平台,包括以下好处:
-
提供可视化的流程处理器创建和管理页面
-
支持高吞吐量和缓冲
-
支持高并发,而不需要使用者去关心复杂性
-
组件开发模式高内聚、低耦合、可复用
-
资源受限下的背压机制
-
错误处理机制灵活
-
数据进/出系统及数据流动方式都易于追踪
NiFi 架构
NiFi在主机操作系统上的JVM中执行,其主要组件如下:
-
Web Server
web服务器的目的是承载NiFi基于HTTP的命令和控制API.
-
Flow Controller
流量控制器是操作的大脑。它为扩展提供运行线程,并管理扩展何时收到要执行的资源的调度。
-
Extensions
有各种类型的NiFi扩展,在其他文档中有描述。这里的关键点是扩展在JVM中操作和执行。
-
FlowFile Repository
流文件存储库是NiFi跟踪它所知道的关于当前在流中活动的给定流文件的状态的地方。存储库的实现是可插入的。默认方法是位于指定磁盘分区上的持久性预写日志。
-
Content Repository
内容存储库是给定FlowFile的实际内容字节所在的位置。存储库的实现是可插入的。默认方法是一种相当简单的机制,它将数据块存储在文件系统中。可以指定多个文件系统存储位置,以便使用不同的物理分区来减少任何单个卷上的争用。
-
Provenance Repository
源存储库是存储所有源事件数据的地方。存储库结构是可插入的,默认实现是使用一个或多个物理磁盘卷。在每个位置内,事件数据都可以索引和搜索。
NiFi还可以在集群内运行。
NiFi集群中的每个节点对数据执行相同的任务,但每个节点对不同的数据集进行操作。Apache ZooKeeper选择单个节点作为集群协调器,故障转移由ZooKeeper自动处理。所有集群节点都向集群协调器报告心跳和状态信息。集群协调器负责断开和连接节点。此外,每个集群都有一个主节点,也由ZooKeeper选择。作为数据流管理器,可以通过任何节点的用户界面(UI)与NiFi集群交互。所做的任何更改都会复制到集群中的所有节点,从而允许多个入口点。
NiFi的性能期望和特性
NiFi旨在充分利用其运行的底层主机系统的功能。对于CPU和磁盘来说,这种资源最大化尤其强大。
-
For IO
根据系统的配置方式,预期的吞吐量或延迟会有很大的变化。考虑到大多数主要NiFi子系统都有可插拔的方法,性能取决于实现。但是,对于一些具体和广泛适用的东西,请考虑开箱即用的默认实现。这些都是持久性的,有保证的交付,并使用本地磁盘来实现。因此,为了保守起见,假设在典型服务器中的普通磁盘或RAID卷上的读/写速率约为每秒50 MB。对于大类的数据流,NiFi应该能够有效地达到每秒100 MB或更高的吞吐量。这是因为添加到NiFi中的每个物理分区和内容存储库都会出现线性增长。这将在FlowFile存储库和源存储库上的某个位置出现瓶颈。我们计划提供一个基准测试和性能测试模板来包含在构建中,它允许用户轻松地测试他们的系统,并确定瓶颈在哪里,以及在什么时候它们可能成为一个因素。此模板还应便于系统管理员进行更改和验证影响。
-
For CPU
当一个特定的处理器被赋予一个线程来执行时,流控制器作为一个引擎来执行指令。处理器在执行完一个任务后立即返回线程。可以为流控制器指定一个配置值,该值指示它所维护的各种线程池的可用线程。要使用的理想线程数取决于主机系统资源的内核数、该系统是否同时运行其他服务以及流中处理的性质。对于典型的IO密集型流,让几十个线程可用是合理的。
-
For RAM
NiFi存在于JVM中,因此仅限于JVM提供的内存空间。JVM垃圾收集对于限制实际堆的总大小以及优化应用程序随时间运行的情况来说都是一个非常重要的因素。定期阅读相同内容时,NiFi作业可能是I/O密集型作业。配置足够大的磁盘以优化性能。
NiFi关键功能概述
-
流量管理
保证交付NiFi的核心理念是,即使在非常高的规模上,保证交付也是必须的。这是通过有效地使用专门构建的持久性预写日志和内容存储库来实现的。它们共同设计的方式允许非常高的事务速率、有效的负载分配、写时拷贝、,并发挥传统磁盘读/写的优势。数据缓冲(带背压和压力释放)NIFI支持缓冲所有排队的数据,并支持在这些队列达到指定限制时提供背压,或在数据达到指定期限(其值已消失)时老化数据。优先QueuingNiFi允许为如何从队列检索数据。默认值为“最早的优先”,但有时应先拉取最新数据、先拉取最大数据或其他自定义方案。特定于流的QoS(延迟v吞吐量、丢失容忍度等)数据流的某些点的数据是绝对关键的,并且不能容忍丢失。有时,它必须在几秒钟内处理并交付才能具有任何价值。NiFi支持这些关注点的细粒度流特定配置。
-
易用
可视化命令和控制数据流可能变得非常复杂。能够可视化这些流并可视化地表达它们,可以极大地帮助降低复杂性并确定需要简化的领域。NiFi不仅可以可视化地建立数据流,而且可以实时地建立数据流。而不是“设计和部署”,它更像是成型粘土。如果对数据流进行更改,该更改将立即生效。更改是细粒度的,并且与受影响的组件隔离。不需要停止整个流或一组流来进行特定的修改。流模板数据流往往是高度面向模式的,虽然通常有许多不同的方法来解决问题,但能够共享这些最佳实践非常有帮助。模板允许主题专家构建和发布他们的流设计,并让其他人受益和协作。数据源NIFI自动记录、索引和提供源数据,因为对象在系统中流动,甚至在扇入、扇出、转换等过程中。这些信息在支持法规遵从性、故障排除、优化和其他场景方面变得极其重要。恢复/记录细粒度historyNiFi的内容存储库的滚动缓冲区旨在充当历史的滚动缓冲区。只有当数据从内容存储库老化或需要空间时,才会删除数据。这与数据来源功能相结合,为实现内容点击、内容下载和重播提供了一个非常有用的基础,所有这些都是在对象生命周期的某个特定点进行的,甚至可以跨代进行。
-
安全
系统到系统数据流的好坏取决于它的安全性。NiFi在数据流中的每一点都通过使用带有加密的协议(如双向SSL)提供安全交换。此外,NiFi允许流对内容进行加密和解密,并在发送方/接收方等式的任一侧使用共享密钥或其他机制。User-to-SystemNiFi支持双向SSL身份验证,并提供可插入授权,以便能够在特定级别(只读、dataflow manager、admin)上正确控制用户的访问。如果用户在流中输入敏感属性(如密码),它将立即在服务器端加密,并且不再以加密形式在客户端公开。多租户授权给定数据流的权限级别应用于每个组件,允许管理员用户具有细粒度的访问控制级别。这意味着每个NiFi集群能够处理一个或多个组织的需求。与隔离拓扑相比,多租户授权支持数据流管理的自助服务模型,允许每个团队或组织在管理流时完全了解流的其余部分(他们无权访问)。
-
可扩展架构
ExtensionNiFi的核心是为扩展而构建的,因此它是一个平台,数据流进程可以在这个平台上以可预测和可重复的方式执行和交互。扩展点包括:处理器、控制器服务、报告任务、优先级和客户用户界面。NiFi通过提供一个定制的类装入器模型来解决这个问题,确保每个扩展包都暴露在一组非常有限的依赖项中。因此,可以构建扩展,而不必担心它们是否会与另一个扩展冲突。这些扩展包的概念称为“NiFi存档”,在《开发人员指南》中有更详细的讨论。站点到站点通信协议NiFi实例之间的首选通信协议是NiFi站点到站点(S2S)协议。S2S使得从一个NiFi实例到另一个NiFi实例的数据传输变得简单、高效和安全。可以轻松构建NiFi客户端库并将其绑定到其他应用程序或设备中,以便通过S2S与NiFi通信。S2S支持基于套接字的协议和HTTP(S)协议作为底层传输协议,这使得在S2S通信中嵌入代理服务器成为可能。
-
灵活缩放
Scale-out(Clustering)NiFi的设计目的是通过如上所述将多个节点聚集在一起来扩展。如果配置单个节点并将其配置为每秒处理数百MB,则可以将普通集群配置为每秒处理GB。这就给NiFi和从中获取数据的系统之间的负载平衡和故障转移带来了有趣的挑战。使用基于异步队列的协议(如消息传递服务、Kafka等)会有所帮助。使用NiFi的“站点到站点”功能也非常有效,因为它是一种协议,允许NiFi和客户端(包括另一个NiFi群集)相互通信、共享有关加载的信息以及在特定授权端口上交换数据。放大和缩小NiFi还设计为以非常灵活的方式放大和缩小。从NiFi框架的角度来看,为了增加吞吐量,在配置时可以增加调度选项卡下处理器上并发任务的数量。这允许同时执行更多进程,从而提供更大的吞吐量。另一方面,可以完美地缩小NiFi的规模,使其适合在由于硬件资源有限而需要占用较小空间的边缘设备上运行。
Apache NiFi包括以下功能:
-
基于浏览器的用户界面
-
无缝的设计、控制、反馈和监控经验
-
数据来源跟踪
-
完整的信息谱系
-
广泛的配置
-
可承受损失并保证交付
-
低延迟和高吞吐量
-
动态优先级
-
流配置的运行时修改
-
背压控制
-
可扩展设计
-
用于定制处理器和服务的组件体系结构
-
快速开发和迭代测试
-
安全通信
-
具有可配置身份验证策略的HTTPS
-
多租户授权和策略管理
-
用于加密通信的标准协议,包括TLS和SSH