赞
踩
## 因为nifi是用Java写的,所以在Linux上部署nifi的时候,应当具有Java环境
## 可通过java命令查看java是否存在
## 不存在需自行安装
[root@zxy_slave1 bin]# java -version
java version "1.8.0_311"
Java(TM) SE Runtime Environment (build 1.8.0_311-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.311-b11, mixed mode)
jdk安装
#java安装大致步骤 #一、可通过wget下载,或者上传安装包 #二、配置环境变量 [root@zxy_slave1 /]# vim /etc/profile # 在unset i前添加如下内容即可 export JAVA_HOME=/zxy/apps/jdk1.8.0_311 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH unset i unset -f pathmunge #三、刷新环境变量 [root@zxy_slave1 /]# source /etc/profile #四、通过输入java命令即可检查是否具有Java环境
[root@zxy_slave1 software]# tar -zxvf nifi-1.9.2-bin.tar.gz -C /zxy/apps
nifi-1.9.2/README
nifi-1.9.2/LICENSE
nifi-1.9.2/NOTICE
nifi-1.9.2/extensions/
nifi-1.9.2/lib/javax.servlet-api-3.1.0.jar
nifi-1.9.2/lib/jetty-schemas-3.1.jar
nifi-1.9.2/lib/logback-classic-1.2.3.jar
nifi-1.9.2/lib/logback-core-1.2.3.jar
nifi-1.9.2/lib/slf4j-api-1.7.25.jar
nifi-1.9.2/lib/jcl-over-slf4j-1.7.25.jar
........
[root@zxy_slave1 apps]# mv nifi-1.9.2 nifi01
[root@zxy_slave1 apps]# cd nifi01 [root@zxy_slave1 nifi01]# cd conf/ # 单机安装比较简单,可根据需要自行修改端口 # nifi.web.http.port [root@zxy_slave1 conf]# vim nifi.properties # web properties # nifi.web.war.directory=./lib nifi.web.http.host= nifi.web.http.port=58080 nifi.web.http.network.interface.default= nifi.web.https.host= nifi.web.https.port= nifi.web.https.network.interface.default= nifi.web.jetty.working.directory=./work/jetty nifi.web.jetty.threads=200 nifi.web.max.header.size=16 KB nifi.web.proxy.context.path= nifi.web.proxy.host=
# 可通过./nifi.sh实现启动、关闭、重启、查看状态等
[root@zxy_slave1 bin]# ./nifi.sh
Usage nifi {start|stop|run|restart|status|dump|install}
# 启动命令
[root@zxy_slave1 bin]# ./nifi.sh start
Java home: /zxy/apps/jdk1.8.0_311
NiFi home: /zxy/apps/nifi01
Bootstrap Config File: /zxy/apps/nifi01/conf/bootstrap.conf
使用systemctl status firewalld
查看防火墙状态,以及服务器需要开放58080端口。
# 因为nifi启动需要时间,使用./nifi.sh start后
# 可以使用netstat -nltp查看端口是否启动起来
# 通过netstat -nltp
[root@zxy_slave1 bin]# netstat -nltp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:58080 0.0.0.0:* LISTEN 2961/java
ip:port:/nifi
单个服务器部署一个Nifi实例不足以处理当前的数据量,那么就会有两种处理方案。一则是在多个Nifi服务器上处理相同的数据流,但是这样就会产生管理问题,每次更改或更新数据流,都需要在各个服务器上做调整。二则是使用Nifi集群,在增加处理能力的同时,也支持单接口控制,通过一个接口更改整个集群数据流并监控数据流。
零主集群即每个节点都可以作为主节点执行任务,节点通过Zookeeper协调,首先Zookeeper会选择一个节点作为集群协调器,然后集群中所有节点都会像该节点发送心跳。如果存在节点长时间未发送心跳,则集群协调器有权断开该节点的连接。当有新的节点加入集群时,新节点必须首先连接到集群协调器,获得最新的流信息。如果集群协调器确定允许该节点加入,则将当前流提供给该节点,当节点的流配置版本与集群协调器的版本相同,则该节点可以加入集群,否则不能加入。
NiFi集群协调器(NiFi Cluster Coordinator):集群协调器是Nifi集群中的一个节点,由Zookeeper选举出,负责管理集群中允许执行任务的节点,并为新加入的节点提供最新的数据流量。当DataFlow Manager管理集群中的数据流时,可以通过集群中任何节点的用户界面执行此操作,所做的节点会复制到集群中的所有节点。
节点(Nodes):每个集群有一个或多个节点组成,节点执行数据的处理操作。
主节点(Primary Node):每个集群都有一个主节点,可以运行隔离处理器
。zookeeper用于自动选择主节点,如果该节点断开了与集群的连接,则Zookeeper负责选举新的主节点。用户可以通过Cluster页面查看哪个节点作为主节点。主节点的Status会有PRIMARY
字样。
孤立的Processor:Nifi集群中,相同的数据流会在所有节点运行。但是可能存在不希望每个节点都运行的场景。比如我使用ExecuteSQL
执行Truncate
语句,如果选择All nodes
,那么你集群中有几个节点,就会执行几次,这样会导致传给下一步重复的行为,最终导致数据不一致。那么像这种情况,使用Primary node
无疑是最佳的选择。
心跳:节点通过"心跳"将本节点的讲课状况和状态传达给集群中的集群协调器节点。集群协调器接收到各节点的心跳,就知道哪些节点处于正常情况。默认情况下,节点每5秒发送一次心跳,如果集群协调器在40秒内还没有接收到心跳,则断开该节点的连接。发送心跳时间可在nifi.properties
配置文件中修改。集群协调器断开节点的原因是协调器需要确保集群中每个节点都处于同步状态,如果没有定期接收到心跳,协调器就无法确定该节点是否正常同步。如果在40秒后该节点发送新的心跳,则协调器自动把请求节点加入集群。一旦接收到心跳,由于心跳不足导致的断开和重新了解信息都会报给给用户界面的DFM。
部署Nifi集群,因为服务器有限,为实现集群模式,这里采用伪集群(在单台服务器上部署三个Nifi节点来实现Nifi集群)。正常集群与伪集群的安装区别不大,正常集群通常是通过IP来区分各个节点,而伪集群通常是通过不同的IP地址来实现区分各个节点。
[root@zxy_slave1 apps]# ls | grep nifi
nifi01
nifi02
nifi03
修改conf目录下的zookeeper.properties配置文件。server1,server2,server3代表zookeeper的集群。
#客户端连接的端口号
ClientPort=2181
# 不同的IP和选举端口号
server.1=ip:2887:3887
server.2=ip:2888:3888
server.3=ip:2889:3889
修改conf目录下的state-management.xml文件,找到stateManagement根节点下的cluster-provider节点,修改id为zk-provider的name="Connect String"的property。
<cluster-provider>
<id>zk-provider</id>
<class>org.apache.nifi.controller.state.providers.zookeeper.ZooKeeperStateProvider</class>
<property name="Connect String">ip:2181,ip:2182,ip:2183</property>
<property name="Root Node">/nifi</property>
<property name="Session Timeout">10 seconds</property>
<property name="Access Control">Open</property>
</cluster-provider>
Nifi依赖于zookeeper以实现集群配置。但是有些环境中,部署了Nifi,而没有现有的zookeeper。为了减少zookeeper维护的负担,nifi提供内置的zookeeper使用。
是否应用内置zookeeper,默认为false,修改为true即可
修改host和port。这里的端口号是用来查看nifi的web端口
第一条:实例是否是集群中的节点,设置为true。第二条:节点地址。第三条:节点的协议端口。第四条:指定在选择flow作为正确流之前等待的时间。如果已投票的节点数等于nifi.cluster.flow.election.max.candidates
对应的数量,则集群不会等待太久。第五条:指定集群中的节点数,以便提前选择流。允许集群中的节点避免在开始处理之前等待很长时间,集群中的节点至少要达到以下数量。
连接zookeeper的字符串。
启动三台nifi节点。
nifi集群启动好之后,可以通过各个节点的ip:port访问nifi.web.http.host和nifi.web.http.port
。nifi三台节点连接后,常用模块会出现一个图标,可以看出有三个节点。
通过cluster可以查看三个集群状态。
如果在集群启动或运行期间出现问题,可通过logs目录下的nifi-app.log
和nifi-user.log
排查,使用tail -f nifi-app.log
可以帮你实时打印日志到控制台。nifi默认打印日志级别是info
,这样获取对你查看日志没有帮助,可以通过修改conf目录下的logback.xml
文件,并将日志级别更改为DEBUG
。
在集群的各个节点,修改name="org.apache.nifi.web.api.config"的日志级别。
<logger name="org.apache.nifi.web.api.config" level="INFO" additivity="false">
<appender-ref ref="USER_FILE"/>
</logger>
DFM可以手动断开集群中的连接。节点也会因为网络或其他原因导致缺乏心跳而被断开节点。手动点击断开节点图标,断开连接的节点可以连接,卸载或删除
当选择卸载节点后,该节点的流文件会重新平衡到活动中的其他节点。卸载节点后,连接和删除图标可能不会立即出现,刷新一下即可。如果因为内存或网络等问题而卸载节点的,可以重新连接到集群或将该节点删除。
DFM如果希望删除该节点,那么在卸载后可以单机卸载图标。删除后该节点就会从集群中退出,除非重新启动该节点,否则无法通过webUI将该节点加入集群中。
经过断开节点、卸载节点、删除节点后,在控制台停止该节点的nifi服务,就正式完成了退役节点。
# 通过netstat -nltp | grep port命令
# 可以看到删除的节点还在运行
[root@zxy_slave1 bin]# netstat -nltp | grep 58085
tcp 0 0 0.0.0.0:58085 0.0.0.0:* LISTEN 13437/java
[root@zxy_slave1 bin]# ./nifi.sh stop
Java home: /zxy/apps/jdk1.8.0_311
NiFi home: /zxy/apps/nifi02
Bootstrap Config File: /zxy/apps/nifi02/conf/bootstrap.conf
已退役的节点,如果需要重新加入集群,重启该节点即可。如果是新加入的节点,那么就需要修改配置文件。
[root@zxy_slave1 bin]# ./nifi.sh start
Java home: /zxy/apps/jdk1.8.0_311
NiFi home: /zxy/apps/nifi02
Bootstrap Config File: /zxy/apps/nifi02/conf/bootstrap.conf
集群启动的时候,Nifi需要确定哪个节点具有正确的流信息。这是通过节点之间投票完成的,当节点尝试连接到集群时,他会将其本地流的副本flow.xml.gz
提供给集群协调器。如果还未选择正确的流信息,那么会将该节点的流与每个节点流进行比较。每个节点对自己一样的流投票,如果没有相同的流,那么这一票会投给可能选择的流池中。如果投票时间到了,或者某个flow.xml.gz
已经达到票数,则选出一个正确的flow.xml.gz
。而与正确的flow.xml.gz
不一致的节点会自动挂掉,如果想要加入集群,需要删除该节点的flow.xml.gz
并重启。
当前有两台单机部署的nifi分别是nifi01和nifi02,其中nifi01是新的nifi实例,nifi02上有流程任务。想要把nifi02的任务流程迁移到nifi01上。
[root@zxy_slave1 apps]# ls | grep nifi
nifi01
nifi02
Nifi01
[root@zxy_slave1 apps]# cd nifi01/bin/
[root@zxy_slave1 bin]# ./nifi.sh start
Java home: /zxy/apps/jdk1.8.0_311
NiFi home: /zxy/apps/nifi01
Bootstrap Config File: /zxy/apps/nifi01/conf/bootstrap.conf
Nifi02
[root@zxy_slave1 apps]# cd nifi02/bin/
[root@zxy_slave1 bin]# ./nifi.sh start
Java home: /zxy/apps/jdk1.8.0_311
NiFi home: /zxy/apps/nifi02
Bootstrap Config File: /zxy/apps/nifi02/conf/bootstrap.conf
flow.xml.gz: DFM所有操作内容都会实时的记录到一个名为flow.xml.gz的配置文件中。该文件默认保存在nifi目录下的conf目录中。在画布中进行的任何更改都会自动保存到本文件中,无需额外保存操作。此外,nifi在更新时会自动在归档目录中创建此文件的备份副本。可以使用这些归档文件来回滚配置,如果想要回滚,先停止nifi,将flow.xml.gz替换为所需要的备份副本,然后重新启动nifi。在集群环境中,停止整个nifi集群,替换其中一个节点的flow.xml.gz,删除其他节点的flow.xml.gz,然后重新启动该节点。确认此节点启动为单节点集群后,然后启动其他节点。替换的流配置将在集群中同步。flow.xml.gz的名称和位置以及自动存档行为是可配置的。
# 1.删除nifi01的flow.xml.gz文件
[root@zxy_slave1 apps]# rm -f ./nifi01/conf/flow.xml.gz
# 2.查看
[root@zxy_slave1 apps]# ls ./nifi01/conf/
archive bootstrap.conf logback.xml nifi.properties zookeeper.properties
authorizers.xml bootstrap-notification-services.xml login-identity-providers.xml state-management.xml
# 3.复制flow.xml.gz文件到nifi01
[root@zxy_slave1 apps]# cp ./nifi02/conf/flow.xml.gz ./nifi01/conf/
# 4.查看
[root@zxy_slave1 apps]# ls ./nifi01/conf/
archive bootstrap.conf flow.xml.gz login-identity-providers.xml state-management.xml
authorizers.xml bootstrap-notification-services.xml logback.xml nifi.properties zookeeper.properties
[root@zxy_slave1 apps]# cd ./nifi01/bin
[root@zxy_slave1 bin]# ./nifi.sh start
Java home: /zxy/apps/jdk1.8.0_311
NiFi home: /zxy/apps/nifi01
Bootstrap Config File: /zxy/apps/nifi01/conf/bootstrap.conf
从单实例nifi的conf文件中获取flow.xml.gz
文件,我希望将这个nifi实例上的流数据信息迁移到当前的nifi集群中。
[root@zxy_slave1 apps]# ls | grep flow.xml.gz
flow.xml.gz
[root@zxy_slave1 apps]# ls | grep nifi0
nifi01
nifi02
nifi03
暂停各个节点
将准备好的flow.xml.gz
文件复制到nifi01节点的conf目录下,删除nifi02,nifi03的conf目录下的flow.xml.gz
重新启动集群各个节点
启动后,发现已经将flow.xml.gz
迁移到集群中
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。