部署手册-NIFI一站式部署

96 阅读7分钟

简介

NiFi最初由美国安全局开发和使用的一个可视化、可定制的数据集成产品。2014年贡献为Apache开源社区。

特性

NiFi 为数据流而设计,它可以用来在不同的数据中心之间搭建数据流通的管道。NiFi 通过拖拽界面、配置参数、简单地连接,即可完成对数据流的托管和系统间的自动化传输,使用者可以可视化整个过程并实时进行更改。它还有很多优秀的特性:

  1. Web界面拖放组件,并支持图形化配置

  2. 使用人员无需代码开发

  3. 支持多种数据源

  4. 自动进行负载均衡和反压

  5. 方便监控

  6. 便于扩展易恢复

总而言之:nifi就是一个数据接入、处理、清洗、分发的系统(基于web方式工作、后台在服务器进行调度)。

名词解释

nifi名词描述
FlowFileFlowFile表示在系统中移动的每个对象,对于每个对象,NiFi跟踪 key/value 属性字符串的映射及其相关的零个或多个字节的内容。
FlowFile Processor处理器实际上执行工作。在
ConnectionConnections提供处理器之间的实际链接。它们充当队列并允许各种进程以不同的速率进行交互。这些队列可以动态优先化,并且可以在负载上具有上限,从而实现反压。
Flow Controller流控制器维护流程如何连接和管理所有流程使用的线程及其分配的知识。Flow Controller充当促进处理器之间FlowFiles交换的代理。
Process Group进程组是一组特定的进程及其连接,可以通过输入端口接收数据并通过输出端口发送数据。以这种方式,进程组允许仅通过组合其他组件来创建全新组件。

集群模式

简介

NiFi 也支持集群模式,运行时每个节点执行相同操作、不同数据。集群依赖 ZooKeeper。ZooKeeper 会选出主节点以及集群协调器,负责监督其他节点的心跳。

WEBRESOURCE1951d309114c923db03b2aa8108ae6451709470276910.png

WEBRESOURCE74c42aec5ce7aa96622cf08d750fcc3dimage.png

零主集群

NiFi采用Zero-Master Clustering。集群中的每个节点都对数据执行相同的任务,但每个节点都在不同的数据集上运行。其中一个节点自动被选择(通过Apache ZooKeeper)作为集群协调器。然后,集群中的所有节点都会向此节点发送心跳/状态信息,并且此节点负责断开在一段时间内未报告任何心跳状态的节点。此外,当新节点选择加入集群时,新节点必须首先连接到当前选定的集群协调器,以获取最新的流。如果集群协调器确定允许该节点加入(基于其配置的防火墙文件),则将当前流提供给该节点,并且该节点能够加入集群,假设节点的流副本与集群协调器提供的副本匹配。如果节点的流配置版本与集群协调器的版本不同,则该节点将不会加入集群。

  • NiFi集群协调器(NiFi Cluster Coordinator):NiFi集群协调器是NiFi集群中的节点,负责管理集群中允许执行任务的节点,并为新加入的节点提供最新的数据流量。当DataFlow Manager管理集群中的数据流时,可以通过集群中任何节点的用户界面执行此操作。然后,所做的任何更改都将复制到集群中的所有节点。

  • 节点(Nodes):每个集群由一个或多个节点组成。节点执行实际的数据处理。

  • 主节点(Primary Node):每个集群都有一个主节点。在此节点上,可以运行"隔离处理器"。ZooKeeper用于自动选择主节点。如果该节点由于任何原因断开与集群的连接,将自动选择新的主节点。用户可以通过查看用户界面的"集群管理"页面来确定当前选择哪个节点作为主节点。

  • 孤立的Processor:在NiFi集群中,相同的数据流会在所有节点上运行。但是,可能存在DFM不希望每个处理器在每个节点上运行的情况。最常见的情况是使用的处理器存在与外部服务进行通信得的情况。例如,GetSFTP处理器从远程目录中提取。如果GetSFTP处理器在集群中的每个节点上运行并同时尝试从同一个远程目录中提取,则可能存在重复读取。因此,DFM可以将主节点上的GetSFTP配置为独立运行,这意味着它仅在该节点上运行。通过适当的数据流配置,它可以提取数据并在集群中的其余节点之间对其进行负载平衡。注意,虽然存在此功能,但仅使用独立的NiFi实例来提取数据并将其输出内容分发给集群也很常见。它仅取决于可用资源以及管理员配置集群的方式。

  • 心跳:节点通过"心跳"将其健康状况和状态传达给当前选定的集群协调器,这使协调器知道它们仍然处于连接状态并正常工作。默认情况下,节点每5秒发出一次心跳,如果集群协调器在40秒内没有从节点收到心跳,则由于"缺乏心跳"而断开节点。5秒设置可在_nifi.properties_文件中配置。集群协调器断开节点的原因是协调器需要确保集群中的每个节点都处于同步状态,并且如果没有定期收听到节点,协调器无法确定它是否仍与其余节点同步。如果在40秒后节点发送新的心跳,协调器将自动把请求节点重新加入集群。一旦接收到心跳,由于心跳不足导致的断开连接和重新连接信息都会报告给用户界面中的DFM

集成式部署

环境准备

JDK1.8以上 系统centos7

最佳实践配置

最大文件句柄

NiFi在任何时候都可能会打开非常大量的文件句柄。通过编辑

* hard nofile 65535
* soft nofile 65535

*  hard  nproc  65535
*  soft  nproc  65535
增加可用的TCP套接字端口数

如果你的流程将在短时间内建立并拆除大量套接字,则如下配置尤其重要

sudo sysctl -w net.ipv4.ip_local_port_range ="10000 65000"

kernel 2.6
sudo sysctl -w net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait ="1"


kernel3.00
sudo sysctl -w net.netfilter.nf_conntrack_tcp_timeout_time_wait="1"

# 关闭liunx不发生swap
vm.swappiness = 0

更改配置文件

更改nifi.properties

通过修改配置文件中

WEBRESOURCE03bdbe7bf04a5afff09e3a9b3c68199aimage.png

更改zookeeper**.properties**

文件列表如下:

initLimit=10
autopurge.purgeInterval=24
syncLimit=5
tickTime=2000
dataDir=./state/zookeeper
autopurge.snapRetainCount=30

# 服务器列表
# server.1=nifi-node1-hostname:2888:3888;2181
# server.2=nifi-node2-hostname:2888:3888;2181
# server.3=nifi-node3-hostname:2888:3888;2181

需要注意的是,由于Zookeeper将监听一些端口,需要在防火墙开辟端口,默认为2181,也可以同ing过client_port属性来进行配置。

具有名为dataDir的属性。默认情况下,此值为./state/zookeeper。如果多个NiFi节点正在运行嵌入式ZooKeeper,则必须告知服务器它是哪一个。通过创建名为_myid_的文件 并将其放在ZooKeeper的数据目录中来实现。此文件的内容应该是不同服务器的唯一索引值。

对于某一个Zookeeper服务器进行如下操作

cd $NIFI_HOME
mkdir state
mkdir state/zookeeper
echo 1 > state/zookeeper/myid

采用三个节点的集群,且在一台机器上搭建,不同节点的端口会不同;如果搭建在三台机器上,IP不同,那么端口可以相同。

部署步骤

1. 上传文件

将文件上传到服务器指定目录下,并解压。此处先按伪节点构造。创建三个目录副本。

tar -zxvf nifi-1.9.2-bin.tar.gz -C /usr/local/bigdata/nifi-1.9.2-18001
cp -r nifi-1.9.2-18001/ nifi-1.9.2-18002
cp -r nifi-1.9.2-18001/ nifi-1.9.2-18003
2. 修改zookeeper配置文件
# zk客户端连接接口:1节点12181,2节点12182,1节点12183
clientPort=12181
# 不同服务的IP和选举端口号
server.1=192.168.52.15:12888:13888,12181
server.2=192.168.52.15:14888:15888,12182
server.3=192.168.52.15:16888:17888,12183
3. 添加节点id

在单个实例中新建文件夹,

1
4. 修改nifi配置文件
####################
# State Management #
####################
nifi.state.management.configuration.file=./conf/state-management.xml
nifi.state.management.provider.local=local-provider
nifi.state.management.provider.cluster=zk-provider
#  指定此NiFi实例是否应运行嵌入式ZooKeeper服务器,默认是false
nifi.state.management.embedded.zookeeper.start=true

nifi.state.management.embedded.zookeeper.properties=./conf/zookeeper.properties 

# web properties #                                                 
nifi.web.war.directory=./lib
# HTTP主机。默认为空白
nifi.web.http.host=192.168.52.15
# HTTP端口。默认值为8080;修改为18001、18002、18003
nifi.web.http.port=18001

# cluster node properties (only configure for cluster nodes) #   
# 如果实例是群集中的节点,请将此设置为true。默认值为false
nifi.cluster.is.node=true 
# 节点的完全限定地址。默认为空白
nifi.cluster.node.address=192.168.52.15
# 节点的协议端口。默认为空白,修改为:28001、28002、28003
nifi.cluster.node.protocol.port=28001

# 指定在选择Flow作为“正确”流之前等待的时间量。如果已投票的节点数等于nifi.cluster.flow.election.max.candidates属性指定的数量,则群集将不会等待这么长时间。默认值为5 mins
nifi.cluster.flow.election.max.wait.time=1 mins 
# 指定群集中所需的节点数,以便提前选择流。这允许群集中的节点避免在开始处理之前等待很长时间,如果我们至少达到群集中的此数量的节点
nifi.cluster.flow.election.max.candidates=1

# cluster load balancing properties #  
nifi.cluster.load.balance.host=
# 修改为:16342、26342、36342
nifi.cluster.load.balance.port=16342

# zookeeper properties, used for cluster management # 
# 连接到Apache ZooKeeper所需的连接字符串。这是一个以逗号分隔的hostname:port对列表
nifi.zookeeper.connect.string=192.168.52.15:12181,192.168.52.15:12182,192.168.52.15:12183
nifi.zookeeper.connect.timeout=3 secs                                                      
nifi.zookeeper.session.timeout=3 secs                                                   
nifi.zookeeper.root.node=/nifi

# 节点2、节点3内容跟节点1相同,只是nifi.web.http.port、nifi.cluster.node.protocol.port、nifi.cluster.load.balance.port这三个端口区分开来,避免端口重复
5. 修改state-management.xml

编辑实例


<cluster-provider>
    <id>zk-provider</id>
    <class>
        org.apache.nifi.controller.state.providers.zookeeper.ZooKeeperStateProvider
    </class>
    <property name="Connect String">
        192.168.52.15:12181,192.168.52.15:12182,192.168.52.15:12183
    </property>
    <property name="Root Node">/nifi</property>
    <property name="Session Timeout">10 seconds</property>
    <property name="Access Control">Open</property>
</cluster-provider>
6. 配置tool.kit验证

NIFI如果想实现分布式需要使用nifi-toolkit生成验证证书,所以需要上传解压对应的文件。

(1) 在节点上解压文件

unzip nifi-toolkit-1.25.0-bin.zip.

(2) 执行脚本命令生成证书

bin/tls-toolkit.sh standalone -C 'CN=username,OU=NIFI' -n 'server1,server2,server3' -K passwd135798642 -P passwd135798642

对应参数解释:
-C: 生成适合在指定DN的浏览器使用的客户端证书,里面是一些标记配置。
-n 设置节点地址
-keyPassword (-K) :设置需要使用的密码
–keyStorePassword(-S)设置要使用的密钥库密码
–trustStorePassword (-P)设置要使用的密钥库密码
-o 设置一个输出目录

(3) 分发证书

把制作的证书全部分发到其他节点上。

[atguigu@hadoop102 outlog]$ cp CN* server1 
[atguigu@hadoop102 outlog]$ cp CN* server2 
[atguigu@hadoop102 outlog]$ cp CN* server3

[atguigu@hadoop102 outlog]$ cp nifi-* server1
[atguigu@hadoop102 outlog]$ cp nifi-* server2
[atguigu@hadoop102 outlog]$ cp nifi-* server3

[atguigu@hadoop102 outlog]$ scp server1/*    server1:/data/nifi/conf
[atguigu@hadoop102 outlog]$ scp server2/*    server2:/data/nifi/conf
[atguigu@hadoop102 outlog]$ scp server3/*    server3:/data/nifi/conf

(4)验证配置

vim conf/state-management.xml
<property name="Connect String">server1:2181,server2:2181,server3:2181</property>

------------------------
vim conf/nifi.properties
152行
    nifi.web.https.host=server1
258行
    nifi.cluster.is.node=true
    nifi.cluster.node.address=server1
278行
    nifi.zookeeper.connect.string=server1:2181,server2:2181,server3:2181

(5) 更新初始密码

所有节点都需要创建
bin/nifi.sh set-sensitive-properties-key  passwd135798642
bin/nifi.sh set-single-user-credentials admin 123456789012

(6) 启动nifi

/bin/nifi.sh start
集群模式下默认端口号为9443

需要注意的是:如果使用toolkit加载完毕安全证书后,nifi的配置文件被重新生成了,所以还要重新配置此配置文件。