Apache NiFi概述
Apache NiFi团队dev@nifi.apache.org
什么是Apache NiFi?
简单地说,NiFi是为了自动化系统之间的数据流而构建的。虽然术语“数据流”在各种环境中使用,但我们在此处使用它来表示系统之间自动化和管理的信息流。这个问题空间一直存在,因为企业有多个系统,其中一些系统创建数据,一些系统消耗数据。已经讨论并广泛阐述了出现的问题和解决方案模式。企业集成模式 [eip]中提供了一个全面且易于使用的表单。
数据流的一些高级挑战包括:
系统失败
网络故障,磁盘故障,软件崩溃,人们犯错。
数据访问超出了使用容量
有时,给定的数据源可能会超过处理链或交付链的某些部分 - 只需要一个弱链接就会出现问题。
边界条件仅仅是建议
您将总是获得太大,太小,太快,太慢,损坏,错误或格式错误的数据。
什么是一天的噪音成为下一个信号
组织的优先事项 - 迅速改变。启用新流程和更改现有流程必须快速。
系统以不同的速度发展
给定系统使用的协议和格式可以随时改变,而不管它们周围的系统如何。存在数据流以连接本质上是大规模分布的组件系统,这些组件松散地或根本不设计为一起工作。
合规性和安全性
法律,法规和政策发生变化。企业对企业协议的变化。系统到系统和系统到用户的交互必须是安全,可信和负责的。
生产中持续改进
通常不可能在实验室中复制生产环境。
多年来,数据流一直是架构中必不可少的弊端之一。现在虽然有许多活跃且快速发展的运动,使数据流更有趣,对于给定企业的成功更为重要。这些包括:面向服务的体系结构[soa],API [api] [api2],物联网[iot]和大数据[bigdata]的兴起。此外,合规性,隐私性和安全性所需的严格程度也在不断提高。即使仍然存在所有这些新概念,数据流的模式和需求仍然大致相同。然后,主要区别在于复杂性的范围,适应所需的变化率,以及大规模边缘情况变得普遍。NiFi旨在帮助解决这些现代数据流挑战。
NiFi的核心概念
NiFi的基本设计概念与基于流程的编程[fbp]的主要思想密切相关。以下是一些主要的NiFi概念以及它们如何映射到FBP:
NiFi术语 | FBP术语 | 描述 |
---|---|---|
FlowFile |
Information Packet |
FlowFile表示在系统中移动的每个对象,对于每个对象,NiFi跟踪 key/value 属性字符串的映射及其相关的零个或多个字节的内容。 |
FlowFile Processor |
Black Box |
处理器实际上执行工作。在[eip]术语中,处理器正在对系统之间的数据路由,转换或中介进行某种组合。处理器可以访问给定FlowFile及其内容流的属性。处理器可以在给定的工作单元中对零个或多个FlowFile进行操作,并提交工作或回滚。 |
Connection | Bounded Buffer |
Connections提供处理器之间的实际链接。它们充当队列并允许各种进程以不同的速率进行交互。这些队列可以动态优先化,并且可以在负载上具有上限,从而实现反压。 |
Flow Controller | Scheduler |
流控制器维护流程如何连接和管理所有流程使用的线程及其分配的知识。Flow Controller充当促进处理器之间FlowFiles交换的代理。 |
Process Group |
subnet |
进程组是一组特定的进程及其连接,可以通过输入端口接收数据并通过输出端口发送数据。以这种方式,进程组允许仅通过组合其他组件来创建全新组件。 |
此设计模型也类似于[seda],提供了许多有益的结果,有助于NiFi成为构建功能强大且可扩展的数据流的非常有效的平台。其中一些好处包括:
-
适用于处理器有向图的可视化创建和管理
-
本质上是异步的,即使在处理和流量波动时也允许非常高的吞吐量和自然缓冲
-
提供高度并发的模型,而开发人员不必担心并发的典型复杂性
-
促进内聚和松散耦合组件的开发,然后可以在其他环境中重复使用并促进可测试单元
-
资源受限的连接使得背压和压力释放等关键功能非常自然和直观
-
错误处理变得像快乐路径一样自然,而不是粗粒度的全部捕获
-
数据进入和退出系统以及如何流过的点很容易理解和轻松跟踪
NiFi架构
NiFi在主机操作系统上的JVM内执行。JVM上NiFi的主要组件如下:
Web Server
Web服务器的目的是托管NiFi基于HTTP的命令和控制API。
Flow Controller
流量控制器是操作的大脑。它为扩展程序提供运行的线程,并管理扩展程序何时接收要执行的资源的计划。
Extensions
在其他文献中描述了各种类型的NiFi扩展。这里的关键点是扩展在JVM中运行和执行。
FlowFile Repository
FlowFile存储库是NiFi跟踪其对流中当前活动的给定FlowFile的了解状态的地方。存储库的实现是可插入的。默认方法是位于指定磁盘分区上的持久性预写日志。
Content Repository
内容存储库是给定FlowFile的实际内容字节。存储库的实现是可插入的。默认方法是一种相当简单的机制,它将数据块存储在文件系统中。可以指定多个文件系统存储位置,以便获得不同的物理分区以减少任何单个卷上的争用。
Provenance Repository
Provenance Repository是存储所有出处事件数据的地方。存储库构造是可插入的,默认实现是使用一个或多个物理磁盘卷。在每个位置内,事件数据被索引并可搜索。
NiFi也能够在集群内运行。
从NiFi 1.0版本开始,采用了Zero-Master Clustering范例。NiFi群集中的每个节点对数据执行相同的任务,但每个节点都在不同的数据集上运行。Apache ZooKeeper选择单个节点作为集群协调器,ZooKeeper自动处理故障转移。所有群集节点都会向群集协调器报告心跳和状态信息。群集协调器负责断开和连接节点。此外,每个群集都有一个主节点,也由ZooKeeper选举。作为DataFlow管理器,您可以通过任何节点的用户界面(UI)与NiFi群集进行交互。您所做的任何更改都将复制到群集中的所有节点,从而允许多个入口点。
NiFi的性能期望和特性
NiFi旨在充分利用其运行的底层主机系统的功能。在CPU和磁盘方面,这种资源的最大化特别强大。有关其他详细信息,请参阅“管理指南”中的最佳做法和配置提示。
对于IO
可以预期的吞吐量或延迟会有很大差异,具体取决于系统的配置方式。鉴于大多数主要NiFi子系统都有可插拔的方法,性能取决于实施。但是,对于具体且广泛适用的内容,请考虑开箱即用的默认实现。这些都是持久的保证交付,并使用本地磁盘这样做。因此保守一点,假设典型服务器中的适度磁盘或RAID卷上的读取/写入速率大约为每秒50 MB。然后,对于大类数据流的NiFi应该能够有效地达到每秒100 MB或更高的吞吐量。这是因为预期每个物理分区和添加到NiFi的内容存储库都会出现线性增长。这将在FlowFile存储库和originance存储库的某个点上出现瓶颈。我们计划提供一个基准测试和性能测试模板,以包含在构建中,允许用户轻松测试他们的系统并确定瓶颈在哪里,以及他们可能成为一个因素。此模板还应使系统管理员可以轻松进行更改并验证其影响。
对于CPU
流控制器充当引擎,指示特定处理器何时被赋予执行线程。编写处理器以在执行任务后立即返回线程。可以为Flow Controller提供一个配置值,指示它维护的各个线程池的可用线程。理想的线程数取决于主机系统资源的核心数量,系统是否正在运行其他服务,以及流程中处理的性质。对于典型的IO大流量,可以使许多线程可用。
对于RAM
NiFi存在于JVM中,因此仅限于JVM提供的内存空间。JVM垃圾收集成为限制总实际堆大小以及优化应用程序运行时间的一个非常重要的因素。定期阅读相同内容时,NiFi作业可能是I / O密集型的。配置足够大的磁盘以优化性能。
关键NiFi功能的高级概述
这部分提供了20,000的NiFi基石基础视图,让您可以了解Apache NiFi的大图,以及一些最有趣的功能。关键功能类别包括流量管理,易用性,安全性,可扩展架构和灵活的扩展模型。
流量管理
保证交货
NiFi的核心理念是即使在非常高的规模下,保证交付也是必须的。这是通过有效使用专用的持久性预写日志和内容存储库来实现的。它们的设计可以实现非常高的事务处理速率,有效的负载分散,写入时复制以及发挥传统磁盘读/写的优势。
数据缓冲带背压和压力释放
NiFi支持缓冲所有排队的数据,以及在这些队列达到指定限制时提供背压的能力,或者在数据达到指定年龄(其值已经消失)时使数据老化。
优先排队
NiFi允许设置一个或多个优先级方案,用于如何从队列中检索数据。默认值是最早的,但有时应先将数据拉到最新,最大的数据或其他一些自定义方案。
流特定QoS(延迟v吞吐量,容量损失等)
有一些数据流点,数据绝对是关键的,而且是不容忍的。有时候必须在几秒钟内处理和交付任何价值。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缩小到适合在边缘设备上运行,因为硬件资源有限,所需的占用空间很小。要专门解决第一英里数据收集挑战和边缘使用案例,您可以在此处找到更多详细信息:https://cwiki.apache.org/confluence/display/NIFI/MiNiFi,关于Apache NiFi,MiNiFi的子项目工作(发音为“缩小”,[min-uh-fahy])。
参考
-
[eip] Gregor Hohpe。企业集成模式[在线]。检索时间:2014年12月27日,来自:http://www.enterpriseintegrationpatterns.com
-
[soa]维基百科。面向服务的架构[在线]。检索时间:2014年12月27日,来自:http://en.wikipedia.org/wiki/Service-oriented_architecture
-
[api] Eric Savitz。欢迎来到API经济[在线]。Forbes.com。检索时间:2014年12月27日,来自:http://www.forbes.com/sites/ciocentral/2012/08/29/welcome-to-the-api-economy
-
[api2] Adam Duvander。API经济和消费者主导的生态系统的兴起[在线]。thenextweb.com。检索时间:2014年12月27日,来自:http://thenextweb.com/dd/2014/03/28/api-economy
-
[iot]维基百科。物联网[在线]。检索时间:2014年12月27日,来自:http://en.wikipedia.org/wiki/Internet_of_Things
-
[bigdata]维基百科。大数据[在线]。检索时间:2014年12月27日,来自:http://en.wikipedia.org/wiki/Big_data
-
[fbp]维基百科。基于流程的编程[在线]。检索时间:2014年12月28日,来自:http://en.wikipedia.org/wiki/Flow-based_programming#Concepts
-
[seda]马特威尔士。伯克利分校。SEDA:良好的,可扩展的互联网服务架构[在线]。检索时间:2018年1月18日,来自:http://www.mdw.la/papers/seda-sosp01.pdf