目录
NiFi概念
NiFi是什么
Apache NiFi 包括以下功能
NIFI核心概念
NiFi架构
NiFi入门
常用术语
下载安装NiFi
启动和关闭NIFI
NIFI处理器
查看处理器
常用处理器
配置处理器
其他组件
应用场景
1.添加和配置第一个处理器GetFile
2.添加第二个处理器PutFile
NiFi2006年由美国国家安全局(NSA)的Joe Witt创建,之后在2014年贡献给Apache社区,随后在2015 年成为Apache顶级项目之一。NiFi 是一个易于使用、功能强大而且可靠的流式数据处理和分发系统。NiFi 是为数据流设计,支持从多种数据源动态的拉取数据,并基于WEB图形界面,通过拖拽、连接、配置完成基于流程的编程,实现数据采集、处理等功能。目前,NiFi社区活跃度非常高,其中Cloudera是最大的贡献者,仅2020年就发布了7个版本。NiFi作为一个致力于数据对接的集成框架在物联网IOT和大数据领域得到很多公司的青睐。
Apache Nifi是一个易于使用,功能强大且可靠的系统,用于处理和分发数据。可以自动化管理系统间的数据流。它使用高度可配置的指示图来管理数据路由、转换和系统中介逻辑,支持从多种数据源动态拉取数据。NiEi原来是NSA的一个项目,目前已经代码开源,是Apache基金会的顶级项目之一。
NiFi是基于Java的,使用Maven支持包的构建管理。NiFi基于Web方式工作,后台在服务器上进行调度。用户可以将数据处理定义为一个流程,然后进行处理,NiEi后台具有数据处理引擎、任务调度等组件。
简单的说,NiFi就是为了解决不同系统间数据自动流通问题而建立的。
虽然dataflow这个术语在各种场景都有被使用,但我们在这里使用它来表示不同系统间的自动化的可管理的信息流。自企业拥有多个系统开始,一些系统会有数据生成,一些系统要消费数据,而不同系统之间数据的流通问题就出现了。这些问题出现的相应的解决方案已经被广泛的研究和讨论,其中企业集成eip就是一个全面且易于使用的方案。
NiFi可以解决:
1、系统故障导致调度失败的问题(高可用)
2、解决高并发而导致的流程问题(高性能、高并发)
3、提示错误数据(错误纠察)
4、对于现实业务的变更可以快速的响应
5、对于不同数据之间的格式都可以兼容
6、方便在测试环境和成产环境当中迁移
1、基于浏览器的用户界面
设计、控制、反馈和监控的无缝体验
2、数据来源跟踪
从头到尾完整的信息谱系
3、广泛的配置
防损且有保证的交付
低延迟和高吞吐量
动态优先级
流配置的运行时修改
背压控制
4、可扩展设计
定制处理器和服务的组件架构
快速开发和迭代测试
5、安全通信
具有可配置身份验证策略的 HTTPS
多租户授权和策略管理
用于加密通信的标准协议,包括 TLS 和 SSH
NiFi的基本设计概念与基于流程的编程fbp(Flow Based Programing)的主要思想密切相关。以下是一些主要的NiFi概念以及与FBP的关系:
NIFI术语 | FBP Term | 描述 |
FlowFile(流文件) | 信息包lnformationPacket | FlowFile表示在系统中移动的每个对象,对于每个FlowFile,NIFI都会记录它—个属性键值对和0个或多个字节内容(FlowFile有attribute(属性)和content(内容))。 |
FlowFile Processor(处理器) |
Black Box(黑盒) |
实际上是处理器起主要作用。在eip术语中,处理器就是不同系统间的数据路由,数据转换或者数据中介的组合。处理器可以访问给定FlowFile的属性及其内容。处理器可以对给定工作单元中的零或多个流文件进行操作,并提交该工作或回滚该工作。 |
Connection(连接) | BoundedBuffer(缓冲区) |
Connections用来连接处理器。它们充当队列并允许各种进程以不同的速率进行交互。这些队列可以动态地对进程优先级排序,并且可以在负载上设置上限,从而启用背压。 |
FlowController(流控制器) | Scheduler(调度器) | 流控制器维护流程如何连接,并管理和分配所有流程使用的线程。流控制器充当代理,促进处理器之间流文件的交换。 |
ProcessGroup(处理组) | subnet(分支网络) | 进程组里是一组特定的流程和连接,可以通过输入端口接收数据并通过输出端口发送数据,这样我们在进程组里简单地组合组件,就可以得到一个全新功能的组件(Process Group)。| |
1.FlowFile
attribute、 content
2. FlowFile Processor
处理FlowFile,及逆行逻辑判断、路由、转换等操作。
3. Connection
连接处理器。连接不同的Processor,充当队列的角色。
4.Flow Controller
代理角色,调度促进处理器流文件的交换。
5. Process Group
包含了一组特定的Processor和connection,组和组之间也可以进行连接和传输,组成新的大组。
1、Web Server(网络服务器)
web服务器的目的是承载NiFi基于http的命令和控制APl。
2、Flow controller(流控制器)
是整个操作的核心,为将要运行的组件提供线程,管理调度。
3、Extensions(扩展)
有各种类型的NIFl扩展,这些扩展在其他文档中进行了描述。这里的关键点是NIFI扩展在JVM中操作和执行。
4、FlowFile Repository(流文件存储库)
对于给定一个流中正在活动的FlowFile,FlowFile Repository就是NIFI保持跟踪这个FlowFile状态的地方。FlowFile Repository的实现是可插拔的(多种选择,可配置,甚至可以自己实现),默认实现是使用Write-Ahead Log技术(WAL的核心思想是:在数据写入库之前,先写入到日志,再将日志记录变更到存储器中)写到指定磁盘目录。
5、Content Repository(内容存储库)
Content Repository是给定FlowFile的实际内容字节存储的地方。Content Repository的实现是可插拔的。默认方法是一种相当简单的机制,它将数据块存储在文件系统中。可以指定多个文件系统存储位置,以便获得不同的物理分区以减少任何单个卷上的争用。(所以环境最佳实践时可配置多个目录,挂载不同磁盘,提高lO)
6、Provenance Repository(源头存储库)
Provenance Repository是存储所有事件数据的地方。Provenance Repository的实现是可插拔的,默认实现是使用一个或多个物理磁盘卷。在每个位置内的事件数据都是被索引并可搜索的。
NiFi结构总结:
FlowFile: 每条"用户数据”(即用户带进NiFi的需要进行处理和分发的数据)称为FlowFile。FlowFile由两部分组成: Attributes(属性)和Content(内容)。Content是用户数据本身。Attributes是与用户数据关联的键值对。
Processor:处理器,是NiFi组件,负责创建,发送,接收,转换,路由,拆分;合并和处理FlawFiles。它是NiFi用户可用于构建其数据流的最重要的构建块。
1、准备环境
Apache nifi即可运行在Windows平台,也可运行在Linux平台,需要安装jdk (nifi.1.x以上需要idk8以上,0.x需要jdk7以上)和maven(至少3.1.0以上版本)。
2、下载地址
Index of /dist/nifi/1.12.0
3、下载完成后使用Xftp工具将压缩包上传到Linux中并解压
tar -zcvf xxx.tar.gz 文件名 -C目录
4、修改nifi默认端口
同—系统启动多个服务时,避免端口冲突,建议修改默认端口
配置文件位置: /nifi/conf/nifi.properties
后台运行:进入到nifi/bin目录下执行 ./nifi.sh start(常用)
前台运行:进入到nifi/bin目录下执行 ./nifi.sh run
查看nifi运行状态: ./nifi.sh status
关闭nifi:./nifi.sh stop
启动后访问:服务器IP:58080/nifi 进行查看,访问界面如下
查看nifi日志
日志目录:nifi/logs
命令:cd logs && tail -f nifi-app.log
1、选择处理器组件
2、弹出窗口显示的就是所有处理器
ExecuteScript:执行脚本处理器,支持: clojure, ecmascript, groovy, lua, python, ruby。
QueryDatabaseTable:数据库查询处理器,支持 mysql。
ConvertAvroToJSON: avro数据格式转换为json。
SplitJson:将JSON文件拆分为多个单独的FlowFiles,用于由sonPath表达式指定的数组元素。
EvaluateJsonPath:根据FlowFile的内容评估一个或多个lsonPath表达式。这些表达式的结果将分配给FlowFile属性,或者写入FlowFile本身的内容,具体取决于处理器的配置。
ReplaceText:文本组装与替换,支持正则表达式。
PutHDFS:将FlowFile数据写入Hadoop分布式文件系统(HDFS)。
PutHiveQL:执行hive ddl/dml命令,如: insert, update。
PublishKafka_2_0:根据配置将消息发送到kafka topic。
SelectHiveQL:执行hive select语句并获取结果。
PutSQL:执行SQL的insert或update命令。
GetFile:从目录中的文件创建FlowEiles。
PutFile:将FlowFile数据写入文件。
GetHDFS:从Hadoop分布式文件系统获取文件。
CaptureChangeMysQL: 从MySQL数据库中检索更改数据捕获(CDC)事件。CDC事件包括INSERT,UPDATE,DELETE操作。事件作为单个流文件输出,这些文件按操作发生的时间排序。
ExecuteStreamCommand:一般用于执行sh脚本。
1、添加一个处理器,以GetFile为例
2、处理器配置说明
右键要配置的处理器,会弹出配置项菜单,如下图
3、选项说明
4、Configure(配置)
1)SETTING(设置)
2)SCHEDULING
3)PROPERTIES(属性)
4)COMMENTS(注释)
1.数据流传入点(input-port)
2.数据流输出点(output-port)
3.组(process-group)
4.远程组(remote process-group)
5.聚合(funnel)
6.模版(template)
7.便签(label)
8.导航(Navigate)
9.操作区(Operate)
1.1添加处理器,选中处理器组件拖拽到工作区,搜索GetFile,点击Add
1.2设置处理器名称,选中GetFile右键选择configure
1.3设置GetFile Properties
1.3.1GetFile属性说明
Name | DefaultValue | Allowable | Description |
InputDirectory(输入目录) | 要从中提取文件的输入目录 支持表达式语言:true(仅使用变量注册表进行评估) |
||
File Filter(文件过滤器) | [^.].* | 仅选择名称与给定正则表达式匹配的文件 | |
Path Filter(路径过滤器) | 如果“递归子目录”为true,则仅扫描其路径与给定正则表达式匹配的子目录 | ||
Batch Size(批量大小) | 10 | 每次迭代中提取的最大文件数 | |
KeepSourceFile(保留源文件) | flase | true false |
如果为true,则将文件复制到内容存储库后不会删除该文件;这会导致文件不断被拾取,对于测试目的很有用。如果没有保留原始Nifi,则需要从其提取目录中具有写权限,否则它将忽略该文件。 |
RecurseSubdirectories(递归子目录) |
true | true false |
指示是否从子目录中提取文件 |
Pollinglnterval(轮询间隔) | 0 sec | 指示执行目录列表之前要等待多长时间 | |
lgnore HiddenFiles(忽略隐藏文件) | true | true false |
指示是否应忽略隐藏文件 |
Minimum FileAge(最小档案年龄) | 0 sec | 档案必须被拉出的最小年龄;小于此时间(根据上次修改日期)的任何文件将被忽略 | |
Maximum FileAge(最长文件年龄) | 档案必须被拉出的最大年龄;任何超过此时间(根据上次修改日期)的文件将被忽略 | ||
Minimum FileSize(最小档案大小) | 0B | 档案必须达到的最小大小 |
Maximum FileSize(最大档案大小) | 可以拉出文件的最大大小 |
2.1添加处理器
2.2PutFile处理器属性说明
Name | DefaultValue | Allowable | Description |
Directory(目录) | 文件应写入的目录。您可以使用表达语言,例如/ aa / bb /$ {path}。 支持表达语言:true(将使用流文件属性和变量注册表进行评估) |
||
ConflictResolutionStrategy(解决冲突策略) | fail | replace ignore fail |
指示当输出目录中已经存在同名文件时应该怎么办 |
CreateMissingDirectories(创建缺失目录) | true | true false |
如果为true,则将创建缺少的目标目录。如果为false,则流文件将受到处罚并发送失败。 |
Maximum FileCount(最大文件数) | 指定输出目录中可以存在的最大文件数 | ||
Last ModifiedTime(上次修改时间) | 将输出文件上的lastModifiedTime设置为此属性的值。 格式必须为yyyy-MM-dd'T'HH: mm: ssZ。您也可以使用表达式语言,例如${file.lastModifiedTime}。支持表达式语言: true(将使用流文件属性和变最注册表进行评估) |
||
Permissions(权限) | 将输出文件的权限设置为此属性的值。格式必须是带有-的UNIX rwxrwxrwx(代替拒绝的权限)(例如rw-r--r--)或八进制数(例如644)。您也可以使用表达式语言,例如${file.permissions}。 支持表达式语言: true(将使用流文件属性和变量注册表进行评估) |
||
owner(所有者) | 将输出文件的所有者设置为此属性的值。您也可以使用${file.owner}之类的表达语言。请注意,在许多操作系统上,Nifi必须以超级用户身份运行才能拥有设置文件所有者的权限。 支持表达式语言: true(将使用流文件属性和变量注册表进行评估) |
||
Group(组) | 将输出文件上的组设置为此属性的值。您也可以使用表达语言,例如$ {file.group}。 支持表达式语言:true(将使用流文件属性和变量注册表进行评估) |
2.3创建写入文件目录
mkdir -p /export/tem/target
2.4设置处理器属性
2.5连接两个处理器
把GetFile处理器上的箭头 拉动到PutFile处理器上,弹出下图,点击ADD
2.6开启GetFile,右击点击statr
2.7新增输入文件
写完输入文件发现source文件夹下并没有刚才写的文件,是因为被GetFile读取到队列中了
2.8启动PutFIle
双击PutFile处理器,在settings下勾选上failure(失败)和success(成功)
右击PutFile处理器点击start启动
2.9覆盖写入
PutFile属性配置项中有一个ConflictResolutionStrategy(解决冲突策略),默认是fail,文件名重复报错,他还有三个可选的值,默认fail、replace(覆盖写入)、ignore(忽略)
2.10关闭处理器
为了创建有效的数据流处理流程,用户必须了解可用的处理器类型。NiFi包含许多不同的处理器。这些处理器提供了可从众多不同系统中提取数据,路由,转换,处理,拆分和聚合数据以及将数据分发到多个系统的功能。
几乎每个Nifi版本中可用的处理器数量都在增加。因此,我们不会尝试在这里介绍每一个可用的处理器,但我们将重点介绍一些最常用的处理器,按功能对它们进行分类。