1.什么是 NiFi ?
简朴的说,NiFi 就是为了办理差别系统间数据自动流通题目而创建的。固然 dataflow 这个术语在各种场景都有被利用,但我们在这里利用它来表示差别系统间的自动化的可管理的信息流。自企业拥有多个系统开始,一些系统会有数据天生,一些系统要消耗数据,而差别系统之间数据的流通题目就出现了。这些题目出现的相应的办理方案已经被广泛的研究和讨论,其中企业集成 eip(Enterprise Integration Patterns) 就是一个全面且易于利用的方案。
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 旨在帮助办理这些现代数据流挑战。
2.NiFi 的核心概念
NiFi 的基本计划概念与基于流程的编程 FBP(Flow-based programming)的主要思想密切相干。以下是一些主要的 NiFi 概念以及它们如何映射到 FBP:
NiFi 术语FBP 术语描述FlowFileInformation PacketFlowFile 表示在系统中移动的每个对象,对于每个 FlowFile,NiFi 都会记录它一个属性键值对和 0 个或多个字节内容(FlowFile 有 attribute 和 content)FlowFile ProcessorBlack Box实际上是处理器起主要作用。在 eip 术语中,处理器就是差别系统间的数据路由,数据转换大概数据中介的组合。处理器可以访问给定 FlowFile 的属性及其内容。处理器可以对给定工作单元中的零或多个流文件进行操作,并提交该工作或回滚该工作ConnectionBounded BufferConnections 用来连接处理器。它们充当队列并允许各种历程以差别的速率进行交互。这些队列可以动态地对进行优先级排序,并且可以在负载上设置上限,从而启用背压Flow ControllerScheduler流控制器维护流程如何连接,并管理和分配所有流程利用的线程。流控制器充当代理,促进处理器之间流文件的互换Process GroupSubnet历程组里是一组特定的流程和连接,可以通过输入端口吸收数据并通过输出端口发送数据,如许我们在历程组里简朴地组合组件,就可以得到一个全新功能的组件(Process Group) 此计划模子也类似于 SEDA,带来了许多好处,有助于 NiFi 成为非常有效的、构建功能强盛且可扩展的数据流的平台。其中一些好处包括:
- 有助于处理器有向图的可视化创建和管理。
- 本质上是异步的,允许非常高的吞吐量和足够的自然缓冲。
- 提供高并发的模子,开发人员不必担心并发的复杂性。
- 促进内聚和松散耦合组件的开发,然后可以在其他环境中重复利用并方便单元测试。
- 资源受限的连接(流程中可配置 connections)使得背压和压力释放等关键功能非常自然和直观。
- 错误处理变得像基本逻辑一样自然,而不是粗粒度的全部捕捉(catch-all)。
- 数据进入和退出系统的点,以及它是如何流动的,都是轻易理解和跟踪的。
3.NiFi 的架构
NiFi 在操作系统上的 JVM 内实行。JVM 上 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 也能够在集群内运行。
从 NiFi 1.0 版本开始,NiFi 集群采用了 Zero-Master Clustering 模式。NiFi 集群中的每个节点对数据实行雷同的任务,但每个节点都在差别的数据集上运行。Apache ZooKeeper 选择单个节点作为集群和谐器,ZooKeeper 自动处理故障转移。所有集群节点都会向集群和谐器发送心跳报告和状态信息。集群和谐器负责断开和连接节点。此外,每个集群都有一个主节点,主节点也是由 ZooKeeper 选举产生。我们可以通过任何节点的用户界面与 NiFi 集群进行交互,并且我们所做的任何更改都将复制到集群中的所有节点上。
4.NiFi 的性能预期和特点
NiFi 的计划目标是充实利用其运行的底层主机系统的能力。这种资源的最大化在 CPU 和磁盘方面尤其明显。
- For IO:差别系统差别配置可预期的吞吐量或耽误会有很大差异,详细取决于系统的配置方式。鉴于大多数 NiFi 子系统都有可插拔的实现方法,所以性能取决于实现。但是,对于一些详细和广泛实用的地方,请思量利用现成的默认实现。这些实现都是持久的,有保证的让数据传播递,并且是利用本地磁盘来实现。因此,保守点说,假设在典型服务器中的普通磁盘或 RAID 卷上的每秒读 / 写速率大约为 50 MB,那么,对于大型数据流,NiFi 应该能够有效地达到每秒 100 MB 或更多的吞吐量。这是由于预期添加到 NiFi 的每个物理分区和 Content repository 都会出现线性增长,瓶颈将出现在 FlowFile repository 和 Provenance repository 的某个点上。我们计划提供一个基准测试和性能测试模板,然后允许用户能够轻松测试他们的系统并确定瓶颈在哪里,以及他们可能成为瓶颈的缘故原由。此模板还应使系统管理员可以轻松进行更改并验证其影响。(期待这个测试功能的出现)
- For CPU:Flow Controller 充当引擎的角色,指示特定处理器何时可以被分配线程去实行。编写处理器以在实行任务后立刻释放线程。可以为 Flow Controller 提供一个配置值,该值指示它维护的各种线程池的可用线程。理想的线程数取决于主机系统内核数量,系统中是否正在运行其他服务,以及流程中要处理的流的性子。对于典型的 IO 大流量,公道的做法是让多线程可用。
- For RAM:NiFi 在 JVM 中运行,因此限制于 JVM 提供的内存。JVM 垃圾接纳成为限制实际堆总大小以及优化应用程序的运行的一个非常重要的因素。NiFi 作业在定期读取雷同内容时可能会占用大量 I/O。可以配置足够大的磁盘以优化性能。
5.NiFi 关键特性的高级概览
- Flow Management
- Guaranteed Delivery:NiFi 的核心理念是,即使在非常高的规模下,也必须保证交付。这是通过有效地利用专门构建的 Write-Ahead Log 和 Content repository 来实现的。它们一起被计划成具备允许非常高的变乱速率、有效的负载分布、写时复制和能发挥传统磁盘读 / 写的上风。
- Data Buffering w/ Back Pressure and Pressure Release:NiFi 支持缓冲所有排队的数据,以及在这些队列达到指定限制时提供背压的能力,或在数据达到指定期限(其值已失效)时老化数据的能力。
- Prioritized Queuing:NiFi 允许设置一个或多个优先级方案,用于如何从队列中检索数据。默认情况是先进先出,但有时应该首先提取最新的数据(后进先出)、最大的数据先出或其他定制方案。
- Flow Specific QoS(latency v throughput, loss tolerance, etc.):可能在数据流的某些节点上数据至关重要,不容丢失,并且在某些时刻这些数据必要在几秒钟就处理完毕传向下一节点才会故意义。对于这些方面 NiFi 也可以做细粒度的配置。
- Ease of Use
- Visual Command and Control:数据流的处理逻辑和过程可能会非常复杂。能够可视化这些流程并以可视的方式来表达它们可以极大地帮助用户降低数据流的复杂度,并确定哪些地方必要简化。NiFi 可以实现数据流的可视化创建,而且是实时的。并不是 “计划、部署”,它更像泥塑。如果对数据流进行了更改,更改就会立刻见效,并且这些更改是细粒度的和组件隔离的。用户不必要为了进行某些特定修改而制止整个流程或流程组。
- Flow Templates:FlowFile 往往是高度模式化的,固然通常有许多差别的方法来办理题目,但能够共享这些最佳实践却大有帮助。流程模板允许计划人员构建和发布他们的流程计划,并让其他人从中受益和复用。
- Data Provenance:在对象流经系统时,甚至在扇入、扇出、转换等过程,NiFi 会自动记录、索引并提供可用的源数据。这些信息在支持法规服从性、故障清除、优化以及其他方案中变得极其关键。
- Recovery / Recording a rolling buffer of fine-grained history:NiFi 的 Content repository 旨在充当汗青数据的滚动缓冲区。数据仅在 Content repository 老化或必要空间时才会被删除。Content repository 与 Data provenance 能力相联合,为在对象的生命周期中的特定点(甚至可以跨越几代)实现可以检察内容,内容下载和重放等功能提供了非常有用的底子。
- Security
- System to System:数据流越安全越好。对于数据流中每个节点 NiFi 都是通过利用加密协议(如双向 SSL)来安全地互换数据。此外,NiFi 的流程能够加密和解密内容,并在发送方 / 吸收方任何一侧利用共享密钥或其他机制来保证数据的安全。
- User to System:NiFi 支持双向 SSL 身份验证,并提供可插拔授权方式,以便能够正确控制用户的访问权限和特定级别(只读,数据流管理,admin)。如果用户在流程中输入敏感属性(如密码),则会立刻在服务器端加密,保证敏感信息不会再次暴露在客户端(前端 UI)中(比如用户 A 在流程中输入了 MySQL 的用户密码,填写完毕后任何人即使是用户 A 也看不到明文密码)。
- Multi-tenant Authorization:NiFi 数据流的权限级别实用于每个组件,并且允许管理员用户拥有细粒度的控制访问级别。这意味着每个 NiFi 集群都能够处理一个或多个组织的需求。与隔离拓扑相比,多租户授权支持数据流管理的自助服务,允许每个团队或组织在完全相识流的其余部门的情况下管理流,而无法访问流。
- Extensible Architecture
- Extension:NiFi 的核心是可扩展,因此它是一个能以可猜测和可重复的方式去实行和交互的数据流流程平台。可扩展的包括:processors,Controller Services,Reporting Tasks,Prioritizers 和 Customer User Interfaces。
- Classloader Isolation:对于任何基于组件的系统,涉及依赖的题目时常发生。NiFi 通过提供自定义类加载器来办理这个题目,确保每个扩展包都暴露在一组非常有限的依赖中。因此,构建扩展包的时间不必担心它们是否可能与另一个扩展包冲突。这些扩展包的概念称为 “NiFi Archives”,在 Developer’s Guide 中有更详细的讨论。
- Site-to-Site Communication Protocol:NiFi 实例之间的首选通信协议是 NiFi 站点到站点(S2S)协议。S2S 轻松,高效,安全地将数据从一个 NiFi 实例传输到另一个实例。NiFi 客户端库可以轻松构建并捆绑到其他应用程序或装备中,通过 S2S 协议与 NiFi 进行通信。S2S 中支持以 Socket 的协媾和 HTTP / HTTPS 协议作为底层传输协议,使得可以将代理服务器嵌入到 S2S 协议的通信中。
- Flexible Scaling Model
- Scale-out (Clustering):NiFi 的计划是可集群,可横向扩展的。如果配置单个节点并将其配置为每秒处理数百 MB 数据,那么可以相应的将集群配置为每秒处理 GB 级数据。但这也带来了 NiFi 与其获取数据的系统之间的负载平衡和故障转移的挑战。采用基于异步排队的协议(如消息服务,Kafka 等)可以提供帮助办理这些题目。利用 NiFi 的 S2S 功能也非常有效,由于它是一种协议,允许 NiFi 和客户端(包括另一个 NiFi 群集)相互通信,共享有关加载的信息,以及互换特定授权的数据端口。
- Scale-up & down:NiFi 还可以非常灵活地扩展和缩小。从 NiFi 框架的角度来看,在增加吞吐量方面,可以在配置时增加 “调度” 选项卡下处理器上的并发任务数。这允许更多线程同时实行,从而提供更高的吞吐量。另一方面,您可以完美地将 NiFi 缩小到适合在边沿装备上运行,由于硬件资源有限,所需的占用空间很小,这种情况可以利用 MiNiFi。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |