当前位置:   article > 正文

NIFI知识点学习总结

nifi

一、NIFI是什么

        Apache NiFi 是一个易于使用,功能强大且可靠的系统,用于处理和分发数据。可以自动化管理系统间的数据流。它使用高度可配置的指示图来管理数据路由、转换和系统中介逻辑,支持从多种数据源动态拉取数据。NiFi原来是NSA的一个项目,目前已经代码开源,是Apache基金会的顶级项目之一。 NiFi是基于Java的,使用Maven支持包的构建管理。NiFi基于Web方式工作,后台在服务器上进行调度。用户可以将数据处理定义为一个流程,然后进行处理,NiFi后台具有数据处理引擎、任务调度等组件。 简单的说,NiFi就是为了解决不同系统间数据自动流通问题而建立的。 虽然dataflow这个术语在各种场景都有被使用,但我们在这里使用它来表示不同系统间的自动化的可管理的信息流。自企业拥有多个系统开始,一些系统会有数据生成,一些系统要消费数据,而不同系统之间数据的流通问题就出现了。这些问题出现的相应的解决方案已经被广泛的研究和讨论,其中企业集成eip就是一个全面且易于使用的方案。

二、NIFI核心概念

        NiFi的基本设计概念与基于流程的编程fbp(Flow Based Programing)的主要思想密切相关。以下是一些主要的NiFi概念以及与FBP的关系:

NiFi术语

FBP Term

描述

FlowFile

信息包Information Packet

FlowFile表示在系统中移动的每个对象,对于每个FlowFile,NIFI都会记录它一个属性键值对和0个或多个字节内容(FlowFile有attribute和content)。

FlowFile Processor

黑盒Black Box

实际上是处理器起主要作用。在eip术语中,处理器就是不同系统间的数据路由,数据转换或者数据中介的组合。处理器可以访问给定FlowFile的属性及其内容。处理器可以对给定工作单元中的零或多个流文件进行操作,并提交任务或回滚任务。

Connection

缓冲区Bounded Buffer

Connections用来连接处理器。它们充当队列并允许各种进程以不同的速率进行交互。这些队列可以动态地对进行优先级排序,并且可以在负载上设置上限,从而启用背压。

Flow Controller

调度器Scheduler

流控制器维护流程如何连接,并管理和分配所有流程使用的线程。流控制器充当代理,促进处理器之间流文件的交换。

Process Group

分支网络subnet

进程组里是一组特定的流程和连接,可以通过输入端口接收数据并通过输出端口发送数据,这样我们在进程组里简单地组合组件,就可以得到一个全新功能的组件(Process Group)。

        参照上述表格,简单来讲 FlowFile 是在各个节点间流动的数据; FlowFile Processor 是数据的处理模块; Connection是各个处理模块间的一个队列; Flow Controllers是复杂流程的调度; Process Group封装流程的层次关系。 此设计模型也类似于seda(分阶段),带来了很多好处,有助于NiFi成为非常有效的、构建功能强大且可扩展的数据流的平台。其中一些好处包括: 有助于处理器有向图的可视化创建和管理 本质上是异步的,允许非常高的吞吐量和足够的自然缓冲 提供高并发的模型,开发人员不必担心并发的复杂性 促进内聚和松散耦合组件的开发,然后可以在其他环境中重复使用并方便单元测试 资源受限的连接(流程中可配置connections)使得背压和压力释放等关键功能非常自然和直观 错误处理变得像基本逻辑一样自然,而不是粗粒度的全部捕获(catch-all) 数据进入和退出系统的点,以及它是如何流动的,都是容易理解和跟踪的。

三、NIFI架构简介

 

        NiFi在主机操作系统上的JVM中执行。JVM上NiFi的主要组件如下: 网络服务器 Web服务器的目的是托管NiFi的基于HTTP的命令和控制API。 流量控制器 流量控制器是操作的大脑。它提供线程来运行扩展,并管理扩展接收资源执行的时间表。 FlowFile存储库 FlowFile存储库是NiFi保持跟踪当前在流中活动的给定FlowFile的状态的地方。存储库的实现是可插入的。默认方法是位于指定磁盘分区上的持久性预写日志。 内容库 内容存储库是给定FlowFile的实际内容字节所在的位置。存储库的实现是可插入的。默认的方法是一个相当简单的机制,它将数据块存储在文件系统中。可以指定多个文件系统存储位置,以便使用不同的物理分区来减少任何单个卷上的争用。 来源库 Provenance Repository是所有起源事件数据存储的地方。存储库结构是可插入的,默认实现是使用一个或多个物理磁盘卷。在每个位置内,事件数据被索引和搜索。

四、FlowFiles

 

        FlowFiles 是 NiFi 及其基于流的设计的核心。FlowFile 是一种数据记录,由指向其内容(有效负载)的指针和支持内容的属性组成,与一个或多个出处事件相关联。属性是充当流文件元数据的键/值对,例如流文件文件名。内容是文件的实际数据或有效负载。出处是对流文件发生的事情的记录。这些部分中的每一个都有自己的存储库(repo)用于存储。 FlowFile 存储库是系统中当前存在的每个 FlowFile 的元数据的“预写日志”(或数据记录)。此 FlowFile 元数据包括与 FlowFile 关联的所有属性、指向 FlowFile 实际内容的指针(存在于 Content Repo 中)和 FlowFile 的状态,例如 FlowFile 属于哪个 Connection/Queue。此 Write- Ahead Log 为 NiFi 提供了处理重启和意外系统故障所需的弹性。 当 FlowFile 的属性发生更改时,会在内存中创建属性的新副本,然后将其保存在磁盘上。当为给定的 FlowFile 更改内容时,会读取其原始内容,通过转换进行流式传输,然后将其写入新流。然后 FlowFile 的内容指针被更新到磁盘上的新位置。 NiFi 使用了三个存储库。每个都存在于操作系统/主机的文件系统中,并提供特定的功能。为了充分理解 FlowFiles 以及底层系统如何使用它们,了解这些存储库很重要。所有三个存储库都是 NiFi 用来保存数据的本地存储目录。 FlowFile 存储库包含流中所有当前 FlowFile 的元数据。 内容存储库保存当前和过去 FlowFiles 的内容。 Provenance Repository 保存了 FlowFiles 的历史。

参考资料:https://nifi.apache.org/docs.html 

FlowFile 分为两部分: Attributes,它们是键/值对。例如,文件名、文件路径和唯一标识符是标准属性。 Content,对字节流的引用构成了 FlowFile 内容。 FlowFile 不包含数据本身。这将严重限制管道的吞吐量。 相反,FlowFile 包含一个指针,该指针引用存储在本地存储中某个位置的数据。这个地方叫做Content Repository 。

参考资料:https://www.freecodecamp.org/news/nifi-surf-on-your-dataflow-4f3343c50aa2/

Flow Controller

        Flow Controller是将所有东西结合在一起的粘合剂。它为处理器分配和管理线程。它是执行数据流的东西。 此外,Flow Controller可以添加控制器服务。 这些服务有助于管理共享资源,例如数据库连接或云服务提供商凭据。控制器服务是守护进程。它们在后台运行并为处理器执行提供配置、资源和参数。

Web Server

        Web 服务器 -基于HTTP的组件,用于可视化控制软件并监控其中发生的事件。

五、NIFI的性能

        NIFI的设计目的是充分利用其运行的底层主机系统的能力。这种资源的最大化在CPU和磁盘方面尤其明显。 For IO 不同系统不同配置可预期的吞吐量或延迟会有很大差异,具体取决于系统的配置方式。鉴于大多数NiFi子系统都有可插拔的实现方法,所以性能取决于实现。但是,对于一些具体和广泛适用的地方,请考虑使用现成的默认实现。这些实现都是持久的,有保证的让数据流传递,并且是使用本地磁盘来实现。因此,保守点说,假设在典型服务器中的普通磁盘或RAID卷上的每秒读/写速率大约为50 MB,那么,对于大型数据流,NIFI应该能够有效地达到每秒100 MB或更多的吞吐量。这是因为预期添加到NiFi的每个物理分区和content repository都会出现线性增长。 For CPU Flow Controller充当引擎的角色,指示特定处理器何时可以被分配线程去执行。编译处理器并在执行任务后立即释放线程。可以为Flow Controller提供一个配置值,该值指示它维护的各种线程池的可用线程。理想的线程数取决于主机系统内核数量,系统中是否正在运行其他服务,以及流程中要处理的流的性质。对于典型的IO大流量,合理的做法是让多线程可用。 For RAM NiFi在JVM中运行,因此受限于JVM提供的内存。JVM垃圾回收(GC)成为限制实际堆总大小以及优化应用程序运行的一个非常重要的因素。NIFI作业在定期读取相同内容时可能会占用大量I/O。可以配置足够大的内存和磁盘以优化性能。

NIFI关键特性:流管理

        保证交付 NIFI的核心理念是,即使在非常高的规模下,也必须保证交付。这是通过有效地使用专门构建的Write-Ahead Log和content repository来实现的。它们一起被设计成具备允许非常高的事务速率、有效的负载分布、写时复制和能发挥传统磁盘读/写的优势。 数据缓冲 背压和压力释放 NIFI支持缓冲所有排队的数据,以及在这些队列达到指定限制时提供背压的能力(背压对象阈值和背压数据大小阈值),或在数据达到指定期限(其值已失效)时老化丢弃数据的能力。 队列优先级 NiFi允许设置一个或多个优先级方案,用于如何从队列中检索数据。默认情况是先进先出,但有时应该首先提取最新的数据(后进先出)、最大的数据先出或其他定制方案。 特殊流质量 (延迟和吞吐量) 可能在数据流的某些节点上数据至关重要,不容丢失,并且在某些时刻这些数据需要在几秒钟就处理完毕传向下一节点才会有意义。对于这些方面NIFI也可以做细粒度的配置。

NIFI关键特性:易用性

        可视化流程 数据流的处理逻辑和过程可能会非常复杂。能够可视化这些流程并以可视的方式来表达它们可以极大地帮助用户降低数据流的复杂度,并确定哪些地方需要简化。NiFi可以实现数据流的可视化建立,而且是实时的。并不是“设计、部署”,它更像泥塑。如果对数据流进行了更改,更改就会立即生效,并且这些更改是细粒度的和组件隔离的。用户不需要为了进行某些特定修改而停止整个流程或流程组。 流模版 FlowFIle往往是高度模式化的,虽然通常有许多不同的方法来解决问题,但能够共享这些最佳实践却大有帮助。流程模板允许设计人员构建和发布他们的流程设计,并让其他人从中受益和复用。 数据起源跟踪 在对象流经系统时,甚至在扇入、扇出、转换等过程,NIFI会自动记录、索引并提供可用的源数据。这些信息在支持法规遵从性、故障排除、优化以及其他方案中变得极其关键。 可以记录和重放的细粒度历史记录缓冲区 NiFi的content repository旨在充当历史数据的滚动缓冲区。数据仅在content repository老化或需要空间时才会被删除。content repository与data provenance能力相结合,为在对象的生命周期中的特定点(甚至可以跨越几代)实现可以查看内容,内容下载和重放等功能提供了非常有用的基础。

NIFI安全特性

        系统到系统 数据流只是安全的同样好。数据流中每一点的NiFi均可以经过使用诸如双向SSL等加密协议提供安全交换。此外,NiFi使得流能够加密和解密内容,并使用发件人/收件人方程的任一侧上的共享密钥或其余机制。 用户到系统 NiFi支持双向SSL身份验证,并提供可插拔受权,从而能够正确控制用户的访问和特定级别(只读,数据流管理器,管理员)。若是用户在流程中输入密码等敏感属性,则当即加密服务器端,即便在加密形式下也不会再次暴露在客户端。 多租户受权 给定数据流的权限级别适用于每一个组件,容许管理员用户具备细粒度的访问控制。这意味着每一个NiFi集群都可以处理一个或多个组织的要求。与独立拓扑相比,多租户受权可实现数据流管理的自助服务模式,从而容许每一个团队或组织对流程进行管理,同时充分了解流程的其余部分,没法访问。

NIFI关键特性:灵活的缩放模型

        水平扩展 (Clustering) NiFi的设计是可集群,可横向扩展的。如果配置单个节点并将其配置为每秒处理数百MB数据,那么可以相应的将集群配置为每秒处理GB级数据。但这也带来了NiFi与其获取数据的系统之间的负载平衡和故障转移的挑战。采用基于异步排队的协议(如消息服务,Kafka等)可以提供帮助解决这些问题。 扩展和缩小 NiFi还可以非常灵活地扩展和缩小。从NiFi框架的角度来看,在增加吞吐量方面,可以在配置时增加“调度”选项卡下处理器上的并发任务数。这允许更多线程同时执行,从而提供更高的吞吐量。另一方面,您可以完美地将NiFi缩小到适合在边缘设备上运行,因为硬件资源有限,所需的占用空间很小,这种情况可以使用MINIFI。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/558284
推荐阅读
相关标签
  

闽ICP备14008679号