整体文件竟然1.5G左右。现在已经下载下来了。基本上视频教程大概两个小时左右。国内的使用比较少。
dataflow 数据流 不同系统之间的数据流通
Nifi 是用来处理数据集成场景的数据分发,BS结构的图形化。
1、高可用
2、高性能高并发
3、错误纠察
4、对于现实业务的变更可以快速响应
5、对于不同系统之间的数据格式可以进行兼容,兼容各种数据格式
6、安全性比较高
7、可以方便的在测试和生产环境中进行迁移。
这就是nifi的核心概念。FBP 流式编程
FlowFile 属性kv和内容 在系统中流动的对象 信息包
Processor 处理器 nifi中的核心组件,数据路由 数据 转换 数据中介的组合。对流文件进行操作 提交 或者回滚 逻辑的运算。黑盒
connection连接 多个processor 缓冲区
FlowController 调度器
process group 进程组 具有级联的组织关系 子组,可以让nifi成为非常有效功能强大的数据流平台
本质上市异步的,高并发的模型 被压 和 压力释放 错误处理像基本逻辑一样自然,精确的捕捉到错误原因
数据进入和退出系统的点,都是容易理解和跟踪查看定位的,方便使用开发以及进行单元测试。
二、Nifi核心组件的组件。 五个
1、FlowFile 流转对象 一个是属性 另一块就是内容
2、FlowFile Processor 处理器 主要就是用来处理我们的FlowFile 数据路由 转换与动作的算子 进行逻辑的判断或者路由 比如说Map Filter Reduce Sink等操作,类似于Flink中组件
3、Connection 连接 1连接不同的Processor 充当队列的角色,内部可以保存数据
4、FlowController 流控制器 充当代理,调度器的作业 促进处理器流文件的交换。
5、ProcessGroup 包含了一组的特定的Processor 和 Connection 组与组之间也可以进行连接和传输数据,组成新的大组
和我们基本的流式编程也是一样的。
Nifi优点
1、可视化管理 2、吞吐量高 3 高并发 4、内聚和松耦合 5、支持背压和压力释放 6、错误处理简单直接 7、数据流动方便跟踪
流文件存储库 默认实现是WAL Write ahead log 内容存储库,可以进行分区。
Nifi也可以在集群中使用,通过ZK来管理,集群协调器,管理节点。
集群协调器,主节点,ZK节点。Nifi1.0 集群 采用零主模式,负载均衡操作。会选择ZK的一个节点作为集群协调器。每个集群都有一个主节点,所有的任何更改,都会复制到其他节点上。
简单总结:
NIFI架构
1、WEB服务器
承载HTTP请求, 和 ControllerAPI 的接口请求
2、流控制器 FlowController 管理调度,提供线程
3、Extentions 扩展
基于JVM扩展 使用java进行扩展
4、FlowFile Repository
FlowFile的状态数据保存
5、FlowFile Content ReponSitory
FlowFile的内容数据存储
6、源头存储库 Source 事件存储库
Nifi集群
集群协调器
删除或者添加node节点
主节点
零主模式,单节点任务
ZK节点
选举 故障转移的工作
NIFI 性能
磁盘IO CPU 内存 流控制器可以为FlowController 配置一个属性值,去维护线程池的可用数量,理想的线程数取决于CPU的核数,对于典型的IO大流量,可以提高并行度。
内存,基于JAVA JVM运行的,可以配置足够大的内存和磁盘。
简单的总结
Nifi性能 主要优化点
1、磁盘IO
2、CPU 多线程处理机制
3、内存可配置优化 基于JVM的内存控制
nifi的关键特性
1、流管理
保证交付,核心交付,通过有效的使用WAL,和Content reponsitory来进行的,写时复制,保证交付送达
数据缓冲、 背压和压力释放,可以提供背压的能力,背压对象阈值 个数以及大小阈值,或者是达到指定时间点之后老化或者丢弃旧的数据。
队列优先级 先进先出 或者 后进后出
特殊流质量 (延迟和吞吐量)
2、易用性
可视化流程, 统计 通过Kettler sqoop 对于某些特定的任务,可以帮助我们降低使用的复杂度。而且是实时的。如果说对数据流进行了更改,实时应用,细粒度 和 组件进行隔离 对于工作效率有提升,降低工作门槛。
流模板 FlowFile 高度模板化的,类似的备份和恢复机制
数据起源跟踪,都会进行跟踪记录,数据的流转过程。历史过程。
可以记录和重放的细粒度历史缓冲区,内容库老化 或者 需要空间的时间才会被删除。重放历史数据,测试定位问题。
3、灵活缩放模型
水平扩展,是可以进行集群运转的,横向扩展的能力
放大和缩小 和 扩展一样。Mini Nifi
简单的总结
nifi的关键特性
1、流管理
细粒度的管理
2、应用型
3、灵活的缩放模型
FlowFile 每一条用户的数据,需要进行处理和分发的数据,就叫做FlowFile 一个是属性一个是content 数据本身 attribute 相关的键值对 名称 或者自定义其他属性
Processor 处理器 Nifi当中的核心组件 用户构建数据流的最重要的构建块,处理的就是FlowFile的处理器。
可以作为linux的一个服务来进行启动使用。
处理器常用的分为下面几种
ExecuteScript 执行脚本
QueryDatabaseTable 查询数据库
ConvertAvroToJson 数据格式转换
SplitJson 将JSON文件拆分成多个不同的FlowFile 每个对象就是一个单独的FlowFil JsonPath表达式
EvaluateJsonPath 将JSON属性 转成FlowFile的属性中,或者写入到内容当中,取决于自己的需求配置
ReplaceText 文本组装与替换 支持正则表达式
PutHDFS 将FlowFile写入到HDFS中
PutHiveQL 将FlowFile写入到Hive中
PublishKafka 根据配置将数据写入到Kafkatopic中
SelectHiveQL 查看hive中的数据 主要就是查询
PutSQL 执行mysql插入操作
GetFile 从目录当中读取文件 转换为FlowFile
PutFile 将数据写入到我们的本地目录磁盘文件中
GetHDFS 从hadoop中读取我们的文件
CaptrueChangeMysql 监控Mysql更新,传输给处理器 按照操作发生的顺序进行采集输出。实时采集Mysql的离线数据
ExecuteStreamCommand 主要用于执行脚本文件的,通过这个来执行Spark脚本 类似azkaban 常见的处理器
Nifi的安装与启动
我们要安装就得准备运行环境,VM虚拟机
下载安装包 解压运行 修改端口号 安装服务 linux脚本 bin/nifi.sh
处理器:设置,任务调度,属性,注释
Nifi其他组件
数据流传入点 input-port 不是整体数据流的起点,而是组与组之间的数据流接入的传入点和输出点
output-port 数据流传出点 用在处理器组里面。
process-group 处理器组 相当于文件夹,让数据流更工整清晰 解耦合
remote process-group 添加其他nifi服务器的组,可以支持集群之外,可以在不同的nifi集群之间进行交互。一般用不到,除非数据量特别大。
聚合 Funel 模板 快速复用与迁移 便签 label 写备注信息
导航组件 简单的应用场景
GetFile PutFile 处理器
1、首先是创建处理器 第一个是GetFile 然后设置处理器属性,配置的过程中,非常重要的点就是熟悉了解 处理器属性,需要提前通过官方的问题来了解。然后创建后续处理器PutFile 创建完毕之后进行属性配置和连接。都必须要熟悉处理器的属性,配置完毕之后进行连接。GetFile -> PutFile
Nifi的处理器类别划分
1、数据转换
CompressContent 压缩和解压
ConvertCharactSet 字符集转换
EncrytContent 加密或解密
ReplaceText 使用正则进行修改文本
TransformXML 转换XML
JoltTransformJSON 转换JSON
2、路由和调解
ControlRate 速率控制
DetectReplicate 检测是否重复 HashContent
DistributedLoad 数据分发 负载均衡 数据抽样
MonitorActivity 数据检测通知 指定时间段没有数据
RouteOnAttribute 根据路由属性来路由FlowFile
RouteOnContent 根据内容来路由 分发 定位FlowFile 依据正则匹配
ScanAttribute ScanContent 搜索指定字典字段信息 文本 或者二进制
ValidateXML 依据XML Schema来判断是否路由
3、数据库访问
ConvertJSONtoSQL insert or update 进行数据库插入或者更新
ExecuteSQL 执行select语句 avro格式的FlowFile
PutSql 更新数据库
SelectHiveQL 结果为avro格式
PutHiveSql 更新Hive数据库
4、属性提取处理器
EvaluateJsonPath 提供一个JSON PATH的表达式,根据json内容匹配json path结果值替换FlowFile的内容或者属性
EvaluateXpath xpath表达式 匹配xml内容 更新内容或者属性
EvaluateXQuery xml内容 进行匹配更新到flowfile的内容或者属性当中
ExtractText 根据正则来进行提取结果
HashAttribute 对于用于定义的属性进行hash分发
HashContent 对内容进行hash,并添加到FlowFile的属性中 只有一个hash值
IdentityMineType 检测文件的类型 图像 文本等
UpdateAttribute 添加或者更新FlowFile任意数量的属性
5、系统交互
ExcuteProcess 运行用户自定义的系统指令 shell命令 输出到FlowFile中 源处理器 打印出的数据发送到FlowFile 不接受任何的参数输入 只能执行没有参数的命令输入。
ExcuteStreamCommand 可以接受参数 可以接受stdin 也可以stdout为FlowFile 不能作为源处理器,必须要有输入的FlowFile,可以接受参数
6、数据提取处理器
GetFile 将文件内容读取磁盘文件,同时删除源文件 不是复制而是剪切
GetFTP 针对FTP进行剪切
GetSFTP 数据
GetJMSQueue JMS消息队列中读取数据
GetJMSTopic 从jms主题中读取
GetHttp 或者 https url请求 转换为FlowFile
ListenHttp 监听我们所设置的连接,对于任何传输的请求都可以作为FlowFile 同时返回200
ListenUDP 监听UDP数据包
GetHDFS 主要是针对HDFS中的目录,当有新的文件就会被剪切到目的文件中
ListHDFS /FetchHDFS 通常是配合来使用 ListHDFS主要用来监听指定的目录,当目录下有新文件中会发送出FlowFile 就是文件名,然后再Nifi中FetchHDFS 把文件的内容转换为新的FlowFile
GetKafka 从Kafka中提取数据
GetMongo 从mongo中提取数据
7、数据出口和发送
PutEmail 向收件人发送电子邮件 作为附件进行发送
PutFile 将文件写入到本地磁盘中
PutFtp 将文件写入到ftp中PutSftp
PutJms 将数据放入到jms中
PutSQL 作为sql语句来执行
PutKafka作为消息发送到Kafka中
PutMongo插入或者更新mongo数据库
8、分裂和聚合
SplitText 主要是接收FlowFile之后,必须是文本内容,根据配置信息,拆分为多个不同的FlowFile
SplitJson 主要是针对Json类型进行拆分 可以将数组进行拆分一个新的对象
SplitXML 主要把XML
UnpackContent 主要用来解压缩文件 作为全新单独的文件进行传输
SegmentContent 针对文件大小进行拆分 在进行传输之前进行拆分,可以并行多线程的发送数据
MergeContent 来进行重组 或者 汇总 合并成一个新的FlowFile
SplitContent 将某一个FlowFile拆分成不同的数据,按照指定的分割符进行拆分,segment是按照文件大小拆分
9 HTTP
GetHttp
ListenHttp 属于监听Http 类似一个web服务
InvokeHttp 执行用户自己配置的http请求 不能用作源处理器
PostHttp 主要就是Post请求
HandlerHttpRequest HandlerHttpResonse 会将流文件以Http请求的方式往后进行发送,最后再用response进行响应返回。这两个是配合使用,中间可以加入自己的许多处理器。通过可视化拖拽的方式。
小的总结:
Nifi处理器的类别
数据转换、路由、数据库操作、对属性本身进行提取转换设置等、可以对系统进行命令交互shell命令等,然后可以进行数据提取,多种来源,消息队列磁盘文件hdfs等,数据出口,数据监听和发送以及拆分和聚合,http请求 搭建web服务器
FlowFile的属性,不是处理器的属性。流文件
1、允许我们在流中做出路由的支撑,支持按照条件来进行分发,可以使用routeOnAttribute来路由。
2、处理器的属性是依赖于数据的,PutFile通过FlowFile来动态获取数据从而放到不同的目录中。
3、Nifi表达式的语言,${filename} 通过这个就可以获取Flowfile的属性值
4、属性提供了重要的上下文信息,在历史面板中搜索特定的属性,可以查看更多的上下文,可以很好的理解整个业务逻辑是如何进行的。
共同属性 表达式语言 流表达式语言 参数
每个FlowFile都有共同属性
-
filename 本地或者远程服务器的文件名
-
path 系统目录
-
uuid 通用的唯一的uuid 类似主键
-
entryDate 进入系统的日期 一个数字 毫秒数
-
lineageStartAge 克隆合并或者拆分 形成子的flowfile,最早的父节点 血缘关系
-
fileSize 表示flowFile的文本大小字节数
提取属性
-
属性提取 构建自定义处理器的典型用法。如何进行数据流转
-
可以添加自定义的属性updateAttribute处理器 去添加新的属性,自动提示属性名称和属性值。
-
nifi表达式语言,生成一个新的属性。UpdateAttribute 可以配置一些规则,什么时候添加属性什么时候不添加属性。
-
根据属性进行路由,可以根据我们的属性进行不同的路由。RouteOnAttribute 推荐使用这个,可以依据属性进行路由。
-
Route to property name 按照属性名称进行分发 路由分发。begin-with-r ${filename:startsWith('Y')}
-
表达式的语言可以在Property中使用attribute nifi表达式语言,就可以实现这样的功能。并不是所有的处理器允许使用。通过查看?图标查看提示信息即可。${uuid} 来使用这个属性变量的值,${'My Attribute Name'} 对变量名加上单引号或者双引号即可。还可以对这些属性执行比较或者切割。${filename:toLower():contains('r')} 是通过:调用的,而不是通过点。${attr1:equals(${attr2})} 来使用两个参数 Nifi官网 表达式语言,和java和scala类似。
表达式语言中使用自定义属性
灵活性会变得更高,可视化流处理编程。FlowFile每一个都有一些共同的属性,这些共同属性是不能修改的是nifi自己生成的,包含文件名,路径,uuid,创建日期等,是nifi服务生成的,不能进行修改,除了共同属性之外,还可以去通过处理器 UpdateAttribute 或者 RouteOnAttribute来进行属性设置,或者是自定义属性来使用,FlowFile属性。可以根据我们的属性进行路由,RouteOnAttribute 进行负载均衡或者逻辑判断等,还可以使用自己的表达式语言来添加自己的属性值。典型案例获取filename变量的小写 ${filename:toLower():contains('r')} 在nifi表达式也可以使用自定义属性。
Nifi模板
可重用的子流,相同的处理器流,提高nifi流程的复用性,通过使用模板管理功能,可以下载为xml文件,可以进行保存复用,如果想要导入,可以使用上传模板的按钮。任何标记为敏感属性的不会添加到模板中,比如说数据库密码,ControllerService 也需要添加到模板中。
监控Nifi
状态栏包含了条状的形状,重要的统计数据。活动线程数量,排队等待数据 五分钟之内的信息,允许查看,以及处理器生产的数量。
通过右键处理器 查看status状态信息,会有相应的图表 24小时之内的数据记录。可以通过配置文件来进行修改。Bug信息公告,如果使用的nifi集群的话,还会显示错误信息在哪个节点上发生的。
Nifi数据来源的监控工程 路由拆分转换聚合 DataProvenance 来进行查看。 展示最近的一千个信息。血缘关系 针对单个处理的。
Nifi概念和组件的关系,常见问题说明 Nifi是基于流式来处理数据的。处理数据不会往后流转,可以通过打上勾就可以了。报错信息会存在一段时间,可以通过时间戳来进行判断。
通过select组件查询出来的数据都是重复的
1、每隔一段时间执行一次
2、在特定的时间 仅执行一次 选错了调度的模式。
3、上游有数据的时候才会进行执行 这些问题都是可以在遇到的时候通过配置来进行解决的。
Nifi入门总结
Nifi模板功能,可以实现数据流程的高内聚和低耦合,同时也使数据流程 方便的进行备份和复用
Nifi监控功能 状态栏 提示了一些比较重要的统计信息,组件展示栏,展示了组件的输入和输出的信息,五分钟之内的,还有一个公告 错误信息的提示,还有数据来源 :一个是事件列表,还有就是事件详情,还可以查看事件发生的谱系图 血缘图,并且可以进行重复的执行操作。
至此 Nifi入门知识完成。