暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Nifi概念和入门(一)

NIFI实战 2021-01-06
733

Nifi概念


Nifi是什么

Apache NiFi 是一个易于使用,功能强大且可靠的系统,用于处理和分发数据。可以自动化管理系统间的数据流。它使用高度可配置的指示图来管理数据路由、转换和系统中介逻辑,支持从多种数据源动态拉取数据。NiFi原来是NSA的一个项目,目前已经代码开源,是Apache基金会的顶级项目之一。

NiFi是基于Java的,使用Maven支持包的构建管理。NiFi基于Web方式工作,后台在服务器上进行调度。用户可以将数据处理定义为一个流程,然后进行处理,NiFi后台具有数据处理引擎、任务调度等组件。

简单的说,NiFi就是为了解决不同系统间数据自动流通问题而建立的。

虽然dataflow这个术语在各种场景都有被使用,但我们在这里使用它来表示不同系统间的自动化的可管理的信息流。自企业拥有多个系统开始,一些系统会有数据生成,一些系统要消费数据,而不同系统之间数据的流通问题就出现了。这些问题出现的相应的解决方案已经被广泛的研究和讨论,其中企业集成eip就是一个全面且易于使用的方案。


dataflow要面临的一些挑战包括:

  • Systems fail

    系统调用失败,网络故障,磁盘故障,软件崩溃,人为事故。

  • Data access exceeds capacity to consume

    数据访问超出了消耗能力。有时,给定的数据源可能会超过处理链或交付链的某些部分的处理能力,而只需要一个环节出现问题,整个流程都会受到影响。

  • Boundary conditions are mere suggestions

    超出边界问题,总是会得到太大、太小、太快、太慢、损坏、错误或格式错误的数据。

  • What is noise one day becomes signal the next

    现实业务或需求变更快,设计新的数据处理流程或者修改已有的流程必须要迅速。

  • Systems evolve at different rates

    给定的系统所使用的协议或数据格式可能随时改变,而且常常跟周围其他系统无关。dataflow的存在就是为了连接这种大规模分布的,松散的,甚至根本不是设计用来一起工作的组件系统。

  • Compliance and security

    法律,法规和政策发生变化。企业对企业协议的变化。系统到系统和系统到用户的交互必须是安全的,可信的,负责任的。

  • Continuous improvement occurs in production

    通常不可能在测试环境中完全模拟生产环境。


多年来,数据流一直是架构中不可避免的问题之一。现在有许多活跃的、快速发展的技术,使得dataflow对想要成功的特定企业更加重要,比如soa,API,iot,bigData。此外,合规性,隐私性和安全性所需的严格程度也在不断提高。尽管不停的出现这些新概念新技术,但dataflow面临的困难和挑战依旧,其中主要的区别还是复杂的范围,需要适应需求变化的速度以及大规模边缘情况的普遍化。NiFi旨在帮助解决这些现代数据流挑战。


NIFI核心概念

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

NiFi术语FBP Term描述
FlowFile信息包Information PacketFlowFile表示在系统中移动的每个对象,对于每个FlowFile,NIFI都会记录它一个属性键值对和0个或多个字节内容(FlowFile有attribute和content)。
FlowFile Processor黑盒Black Box实际上是处理器起主要作用。在eip术语中,处理器就是不同系统间的数据路由,数据转换或者数据中介的组合。处理器可以访问给定FlowFile的属性及其内容。处理器可以对给定工作单元中的零或多个流文件进行操作,并提交该工作或回滚该工作。
Connection缓冲区Bounded BufferConnections用来连接处理器。它们充当队列并允许各种进程以不同的速率进行交互。这些队列可以动态地对进行优先级排序,并且可以在负载上设置上限,从而启用背压。
Flow Controller调度器Scheduler流控制器维护流程如何连接,并管理和分配所有流程使用的线程。流控制器充当代理,促进处理器之间流文件的交换。
Process Group分支网络subnet进程组里是一组特定的流程和连接,可以通过输入端口接收数据并通过输出端口发送数据,这样我们在进程组里简单地组合组件,就可以得到一个全新功能的组件(Process Group)。

此设计模型也类似于seda(分阶段),带来了很多好处,有助于NiFi成为非常有效的、构建功能强大且可扩展的数据流的平台。其中一些好处包括:

  • 有助于处理器有向图的可视化创建和管理

  • 本质上是异步的,允许非常高的吞吐量和足够的自然缓冲

  • 提供高并发的模型,开发人员不必担心并发的复杂性

  • 促进内聚和松散耦合组件的开发,然后可以在其他环境中重复使用并方便单元测试

  • 资源受限的连接(流程中可配置connections)使得背压和压力释放等关键功能非常自然和直观

  • 错误处理变得像基本逻辑一样自然,而不是粗粒度的全部捕获(catch-all)

  • 数据进入和退出系统的点,以及它是如何流动的,都是容易理解和跟踪的。


NiFi架构

  • Web Server(网络服务器)

    web服务器的目的是承载NiFi基于http的命令和控制API。

  • Flow Controller(流控制器)

    是整个操作的核心,为将要运行的组件提供线程,管理调度。

  • Extensions(扩展)

    有各种类型的NIFI扩展,这些扩展在其他文档中进行了描述。这里的关键点是NIFI扩展在JVM中操作和执行。

  • FlowFile Repository(流文件存储库)

    对于给定一个流中正在活动的FlowFile,FlowFile Repository就是NIFI保持跟踪这个FlowFIle状态的地方。FlowFile Repository的实现是可插拔的(多种选择,可配置,甚至可以自己实现),默认实现是使用Write-Ahead Log技术(简单普及下,WAL的核心思想是:在数据写入库之前,先写入到日志.再将日志记录变更到存储器中。)写到指定磁盘目录。

  • Content Repository(内容存储库)

    Content Repository是给定FlowFile的实际内容字节存储的地方。Content Repository的实现是可插拔的。默认方法是一种相当简单的机制,它将数据块存储在文件系统中。可以指定多个文件系统存储位置,以便获得不同的物理分区以减少任何单个卷上的争用。(所以环境最佳实践时可配置多个目录,挂载不同磁盘,提高IO)

  • Provenance Repository(源头存储库)

    Provenance Repository是存储所有事件数据的地方。Provenance Repository的实现是可插拔的,默认实现是使用一个或多个物理磁盘卷。在每个位置内的事件数据都是被索引并可搜索的。


NiFi也能够在集群内运行。

Cluster Coordinator:集群协调器,用来进行管理节点添加和删除的操作逻辑

Primary Node:主节点,用来运行一些不适合在集群中运行的组件

Zookeeper Client:zk节点

从NiFi 1.0版本开始,NIFI集群采用了Zero-Master Clustering模式。NiFi群集中的每个节点对数据执行相同的任务,但每个节点都在不同的数据集上运行。Apache ZooKeeper选择单个节点作为集群协调器,ZooKeeper自动处理故障转移。所有集群节点都会向集群协调器发送心跳报告和状态信息。集群协调器负责断开和连接节点。此外,每个集群都有一个主节点,主节点也是由ZooKeeper选举产生。我们可以通过任何节点的用户界面(UI)与NiFi群集进行交互,并且我们所做的任何更改都将复制到集群中的所有节点上。


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可以实现数据流的可视化建立,而且是实时的。并不是“设计、部署”,它更像泥塑。如果对数据流进行了更改,更改就会立即生效,并且这些更改是细粒度的和组件隔离的。用户不需要为了进行某些特定修改而停止整个流程或流程组。

  • 流模版

    FlowFIle往往是高度模式化的,虽然通常有许多不同的方法来解决问题,但能够共享这些最佳实践却大有帮助。流程模板允许设计人员构建和发布他们的流程设计,并让其他人从中受益和复用。

  • 数据起源跟踪

    在对象流经系统时,甚至在扇入、扇出、转换等过程,NIFI会自动记录、索引并提供可用的源数据。这些信息在支持法规遵从性、故障排除、优化以及其他方案中变得极其关键。

  • 可以记录和重放的细粒度历史记录缓冲区

    NiFi的content repository旨在充当历史数据的滚动缓冲区。数据仅在content repository老化或需要空间时才会被删除。content repository与data provenance能力相结合,为在对象的生命周期中的特定点(甚至可以跨越几代)实现可以查看内容,内容下载和重放等功能提供了非常有用的基础。

灵活的缩放模型

  • 水平扩展 (Clustering)

    NiFi的设计是可集群,可横向扩展的。如果配置单个节点并将其配置为每秒处理数百MB数据,那么可以相应的将集群配置为每秒处理GB级数据。但这也带来了NiFi与其获取数据的系统之间的负载平衡和故障转移的挑战。采用基于异步排队的协议(如消息服务,Kafka等)可以提供帮助解决这些问题。

  • 扩展和缩小

    NiFi还可以非常灵活地扩展和缩小。从NiFi框架的角度来看,在增加吞吐量方面,可以在配置时增加“调度”选项卡下处理器上的并发任务数。这允许更多线程同时执行,从而提供更高的吞吐量。另一方面,您可以完美地将NiFi缩小到适合在边缘设备上运行,因为硬件资源有限,所需的占用空间很小,这种情况可以使用MINIFI。

文章转载自NIFI实战,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论