简单地说,NiFi是为了自动化系统之间的数据流而构建的。虽然术语“数据流”在各种环境中使用,但我们在此处使用它来表示系统之间自动化和管理的信息流。这个问题空间一直存在,因为企业有多个系统,其中一些系统创建数据,一些系统消耗数据。已经讨论并广泛阐述了出现的问题和解决方案模式。企业集成模式中提供了一个全面且易于使用的表单。
NiFi的诞生,要致力于解决的问题:
NiFi的基本设计概念与基本流程的编程[FBP]的主要思想密切相关。以下是一些主要的NiFi概念以及他们如何映射到FBP:
NiFi条款 |
FBP术语 |
描述 |
FlowFile |
Information Packet |
FlowFile代表在系统中移动的每个对象,对于每个对象,NiFi都会跟踪键/值对属性字符串及其零个或多个字节的关联内容的映射。 |
FlowFile Processor |
Black Box |
处理器实际上执行工作。用[eip]术语来说,处理器是在系统之间进行数据路由,转换或中介的某种组合。处理器可以访问给定FlowFile及其内容流的属性。处理器可以在给定的工作单元中对零个或多个FlowFiles进行操作,并提交该工作或回滚。 |
Connection |
Bounded Buffer |
Connections提供了处理器之间的实际链接。这些充当队列,并允许各种进程以不同的速率进行交互。可以动态地对这些队列进行优先级排序,并且可以在负载上设置上限,从而实现反压。 |
Flow Controller |
Scheduler |
流控制器保持有关进程如何连接和管理所有进程使用的线程及其分配的知识。Flow Controller充当代理,促进处理器之间的FlowFiles交换。 |
Process Group |
subnet |
Process Group是一组特定的进程及其连接,可以通过输入端口接收数据,并通过输出端口发送数据。以这种方式,Process Group允许仅通过其他组件的组合来创建全新的组件。 |
1.3 NiFi架构原理
NiFi在主机操作系统上的JVM中执行。NiFi在JVM上的主要组件如下:
1.Web Server
Web Server的目的是托管NiFi基于HTTP的命令和控制API。
2.Flow Controller
Flow Controller是操作的大脑。它为扩展程序提供运行所需的线程,并管理扩展程序何时接收执行资源的时间表。
3.Extensions
其他文档中介绍了各种类型的NiFi扩展程序。这里的关键点是扩展在JVM中运行和执行。
4.FlowFile Repository
NiFi可以在FlowFile Repository中跟踪对流中当前处于活动状态的给定FlowFile的了解状态。存储库的实现是可插入的。默认方法是位于指定磁盘分区上的持久性预写日志。
5.Content Repository
Content Repository是给定FlowFile的实际内容字节所在的位置。存储库的实现是可插入的。默认方法是一种相当简单的机制,它将数据块存储在文件系统中。可以指定多个文件系统存储位置,以便使用不同的物理分区以减少任何单个卷上的争用。
6.Provenance Repository
来源库是存储所有来源事件数据的地方。存储库构造是可插入的,默认实现是使用一个或多个物理磁盘卷。在每个位置内,事件数据都被索引并可以搜索。
1.4 NiFi还可以在集群中运行
从NiFi 1.0版本开始,采用了零主群集模式。NiFi集群中的每个节点都对数据执行相同的任务,但是每个节点都对不同的数据集进行操作。Apache ZooKeeper选择一个节点作为集群协调器,并且故障转移由ZooKeeper自动处理。所有群集节点均向群集协调器报告心跳和状态信息。群集协调器负责断开和连接节点。此外,每个群集都有一个主节点,该节点也由ZooKeeper选择。作为DataFlow管理器,您可以通过任何节点的用户界面(UI)与NiFi群集进行交互。您所做的任何更改都将复制到群集中的所有节点,从而允许多个入口点。
下载地址:Apache NiFi Downloads
文档地址:Apache NiFi Documentation
2.2.1 NiFi安装
1) 把nifi-1.10.0-bin.tar.gz上传到Linux的/opt/software目录下
2) 解压nifi-1.10.0-bin.tar.gz到/opt/module/目录下面
tar –zxvf nifi-1.10.0-bin.tar.gz –C /opt/module
3) 修改/opt/module 目录下nifi-1.10.0的名称为NiFi
mv /opt/module/nifi-1.10.0/ nifi
2.2.2 NiFi核心配置
1) 编辑/etc/security/limits.conf来增加NiFi打开大量的文件数量和线程数量的限制。
vim /etc/security/limits.conf
*hard nofile 50000
*soft nofile 50000
*hard nproc 10000
*soft nproc 10000
vim /etc/security/limits.d/20-nproc.conf
*soft nproc 10000
2) 增加可用的TCP套接字端口数
修改之前
echo "10000 65000" > /proc/sys/net/ipv4/ip_local_port_range
或者:sysctl -w net.ipv4.ip_local_port_range="10000 65000"
修改之后
vim /etc/sysctl.conf
vm.swappiness = 0
3)修改默认端口(可选)
vim /opt/module/nifi/conf/nifi.properties
修改之后
2.2.3 启动NiFi
准备工作: 卸载自带的OpenJDK 使用rpm -qa | grep java查询java相关的包 使用rpm -qa | grep openjdk | xargs rpm -e --nodeps卸载之 安装oracle jdk 采用的tar.gz包安装,解压压缩包jdk-8u161-linux-x64.tar.gz,并且将解压到的文件夹jdk1.8.0_161复制到/usr/java/jdk1.8 tar zxvf jdk-8u161-linux-x64.tar.gz mkdir -p /usr/java/jdk1.8 mv jdk1.8.0_161/* /usr/java/jdk1.8/ rmdir jdk1.8.0_161/ 配置环境变量 vi /etc/profile 将以下内容添加到profile export JAVA_HOME=/opt/module/jdk1.8 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 然后刷新 source /etc/profile |
当需要将nifi以服务模式运行时,在nifi.sh中增加以下红色语句:
编辑NiFi的/opt/module/nifi/bin/nifi.sh,添加Java环境变量
vim /opt/module/nifi/bin/nifi.sh
添加Java环境变量
JAVA_HOME=/opt/module/jdk1.8
export JAVA_HOME=/opt/module/jdk1.8
1)NiFi后台启动/关闭命令
bin/nifi.sh start
bin/nifi.sh stop
bin/nifi.sh status
2)NiFi前台启动/关闭命令
bin/nifi.sh run #Ctrl+c 关闭
3)web访问
http://192.168.138.134:9191/nifi
注意:一定要关闭防火墙:centos7临时关闭防火墙
关闭防火墙:systemctl stop firewalld
查看状态:firewall-cmd --state
访问web:
先启动:bin/nifi.sh start
再访问:http://192.168.138.134:9191/nifi
需要等待几分钟才能访问
界面如下:后面详细介绍
2.2.4 安装NiFi服务作为系统服务
(可选,就不再截图了)
1)安装系统服务
bin/nifi.sh install
2)服务常用启动/关闭命令
sudo service nifi start
sudo service nifi stop
sudo service nifi status
1. NiFi登录后界面
2. NiFi登录界面解读
3. 全局菜单
4. NiFi登录界面解读
我们现在可以通过在画布中添加processor来开始创建数据流。要执行此操作,请将处理器图标()从屏幕左上方拖动到画布中间(图纸类背景)并将其放在那里。这将为我们提供一个对话框,允许我们选择要添加的处理器:
提示:各个处理器的用途及配置在官网上都有介绍,大约提供了近300个常用处理器。包含但不限于:数据格式转换、数据采集、数据(local/kafka/sorl/hdfs/hbase/mysql/hive/http等)的读写等功能,使用方便,如果不能满足需求,还可以自定义处理器。
5. 配置处理器(以GetFile为例)
需求:导出MySQL数据转换为Json串并保存到本地
3.2.1 添加ExecuteSQL
准备工作: MySQL的安装: 为了yum顺利进行,配置/etc/resolv.conf,删除原来的nameserver,添加 nameserver 192.168.1.1 nameserver 114.114.114.114 安装perl和numactl yum install -y perl yum install -y numactl 卸载已有的mysql-libs rpm -qa | grep mysql rpm -qa | grep maria rpm -e --nodeps 【包名】 上传mysql的jar包:rz 解压:tar xvf mysql-5.7.21-1.el7.x86_64.rpm-bundle.tar -C /opt/module/mysql/ 因为这里不是”.tar.gz”文件,所以使用参数“xvf”,如果是”.tar.gz”文件,使用“zxvf” rpm安装mysql rpm -ivh mysql-community-common-5.7.21-1.el7.x86_64.rpm rpm -ivh mysql-community-libs-5.7.21-1.el7.x86_64.rpm rpm -ivh mysql-community-client-5.7.21-1.el7.x86_64.rpm rpm -ivh mysql-community-server-5.7.21-1.el7.x86_64.rpm 如果在rpm -ivh mysql-community-server-5.7.21-1.el7.x86_64.rpm这一步报错: [root@node4 mysql]# rpm -ivh mysql-community-server-5.7.21-1.el7.x86_64.rpm 警告:mysql-community-server-5.7.21-1.el7.x86_64.rpm: 头V3 DSA/SHA1 Signature, 密钥 ID 5072e1f5: NOKEY 错误:依赖检测失败: net-tools 被 mysql-community-server-5.7.21-1.el7.x86_64 需要 下载net-tools即可: [root@node4 mysql]# yum install net-tools 再次rpm -ivh mysql-community-server-5.7.21-1.el7.x86_64.rpm即可成功: 设置开机启动 chkconfig mysqld on 启动mysql服务 service mysqld start 关闭密码校验 echo "validate_password=off" >> /etc/my.cnf 重启mysql服务 service mysqld restart 查看root的初始密码 cat /var/log/mysqld.log | more | grep password 修改 mysql root密码 mysql -uroot -p[查看得到的密码] [root@localhost ~]# mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 4 Server version: 5.7.12 Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> set password='123qwe'; Query OK, 0 rows affected (0.00 sec) mysql> exit Bye |
(1)添加ExecuteSQL到面板
(2)配置ExecuteSQL:
创建新的Dtabase Connection Polling Service
(3) 点击->配置Database Connection Polling Service
添加URL:jdbc:mysql://node4:3306/mysql(数据库名)
添加驱动:com.mysql.jdbc.Driver
添加本地驱动jar包:/opt/module/mysql/mysql_connector_java/mysql-connector-java-5.1.47.jar
注意:一定要将state改成Enable(操作如下)
添加SQL select Query:select * from mysql.user
修改等待时间:10秒
最终配置如下:
3.2.2 添加ConvertAvroToJSON
3.2.3 添加PutFile
添加输出路径:/opt/module/nifi_out
3.2.4 连接处理器
依次启动ExecuteSQL、ConvertAvroToJSON、PutFile
启动之后,界面如下:但是有一个特殊的地方,ExecuteSQL右上角有一个红色标识
鼠标悬浮在红色标识上:
小插曲: VMware安装的mysql,发现用nifi前台页面链接不上。 报错信息:is not allowed to connect tothis mmysql server。 解决办法: mysql -u root -p 登录到mysql中 修改帐号不允许从远程登陆,只能在localhost。这个时候只要在localhost的那台电脑,登入MySQL后,更改 "mysql" 数据库里的 "user" 表里的 "host" 项,从"localhost"改称"%" 刷新配置: 最后连接成功: |
再依次停止ExecuteSQL、ConvertAvroToJSON、PutFile
查看本地文件:
案例一结束,可以删除处理器了
需求:导出Hive数据转换为csv并保存到HDFS
3.3.1 添加SelectHiveQL
(1) 添加SelectHiveQL到面板
(2) 配置数据仓库连接池
注意:这里的目录是hdfs路径
3.3.2添加PutHDFS
3.3.3依次启动SelectHiveQL、PutHDFS
(1)查看生成的文件:http://192.168.138.134:50070/explorer.html#/nifi_test
可以下载查看详细信息,这里我就不操作了
(2)依次停止SelectHiveQL、PutHDFS