NIFI集群部署,非kerberos环境,依赖外部zookeeper.
环境规划
host-1 192.168.222.135 ZK NIFI
host-2 192.168.222.136 ZK NIFI
host-3 192.168.222.137 ZK NIFI
搭建时不要求与ZK共机,本次搭建资源有限,采取共机模式。
1、下载相关的安装包
官方网址:https://nifi.apache.org/download.html
wget --no-check-certificate https://dlcdn.apache.org/nifi/1.16.3/nifi-toolkit-1.16.3-bin.zip
wget --no-check-certificate https://dlcdn.apache.org/nifi/1.16.3/nifi-1.16.3-bin.zip
2、集群搭建需要更改两个配置文件(使用外部zookeeper,3.5版本以上)每个节点都需修改。
更改 conf/nifi.properties
文件中的相关配置
###### #
# State Management
###### #
nifi.state.management.configuration.file=./conf/state-management.xml
# The ID of the local state provider
nifi.state.management.provider.local=local-provider #使用自带provider
# The ID of the cluster-wide state provider. This will be ignored if NiFi is not clustered but must be populated if running in a cluster.
nifi.state.management.provider.cluster=zk-provider #使用zk进行cluster控制(还可以使用redis等
# Specifies whether or not this instance of NiFi should run an embedded ZooKeeper server
nifi.state.management.embedded.zookeeper.start=false #使用内部zk(nifi自带zk,本次搭建使用外部的)
# Properties file that provides the ZooKeeper properties to use if <nifi.state.management.embedded.zookeeper.start> is set to true
nifi.state.management.embedded.zookeeper.properties=./conf/zookeeper.properties #如果使用内部zk 该属性无效
# Site to Site properties
nifi.remote.input.host=
nifi.remote.input.secure=false #这表明该 NiFi 实例与远程 NiFi 实例之间的通信是否应该是安全的(即,安全的站点到站点)。默认情况下,它设置为true。这里我们关闭掉。
nifi.remote.input.socket.port=10443
nifi.remote.input.http.enabled=false #指定是否应在此主机上启用 HTTP 站点到站点。默认情况下,它设置为true。这里我们也关闭掉。
nifi.remote.input.http.transaction.ttl=30 sec
nifi.remote.contents.cache.expiration=30 secs
# web properties #
#############################################
# For security, NiFi will present the UI on 127.0.0.1 and only be accessible through this loopback interface.
# Be aware that changing these properties may affect how your instance can be accessed without any restriction.
# We recommend configuring HTTPS instead. The administrators guide provides instructions on how to do this.
nifi.web.http.host=192.168.222.135 # 非常重要,nifi的界面化控制ip地址,填对应节点的IP
nifi.web.http.port=8888 # 控制ip地址的端口
nifi.web.http.network.interface.default=
#############################################
这几个默认打开的 不用https 注释掉
#nifi.web.https.host=host-1
#nifi.web.https.port=9443
#nifi.web.https.network.interface.default=
# security properties #
nifi.sensitive.props.key=testpassword # 这是用于加密处理器中配置的任何敏感属性值的密码。默认情况下,它是空白的,但系统管理员应该为它提供一个值。它可以是任意长度的字符串,但建议的最小长度为 10 个字符。请注意,一旦设置了此密码并配置了一个或多个敏感处理器属性,则不应更改此密码。这里通过 执行 bin/nifi.sh set-sensitive-properties-key testpassword 为其指定密码为testpasswd,可根据实际修改。
nifi.sensitive.props.key.protected=
nifi.sensitive.props.algorithm=NIFI_PBKDF2_AES_GCM_256
nifi.sensitive.props.additional.keys=
# cluster node properties (only configure for cluster nodes) #
nifi.cluster.is.node=true # 指定这个nifi节点是否是集群中的一员, 如false则单节点运行
nifi.cluster.node.address=192.168.222.135 # 与其他节点进行通讯的ip地址和端口,这里填对应节点的IP
nifi.cluster.node.protocol.port=11443 # 通讯的ip的端口
nifi.cluster.node.protocol.max.threads=50 # 使用多少个线程进行通讯,推荐节点数*2
nifi.cluster.node.event.history.size=25
nifi.cluster.node.connection.timeout=5 sec
nifi.cluster.node.read.timeout=5 sec
nifi.cluster.node.max.concurrent.requests=100
nifi.cluster.firewall.file=
nifi.cluster.flow.election.max.wait.time=20 secs # 选举等待时间
nifi.cluster.flow.election.max.candidates=1 # nifi中有选举员和老大,要选举的时候由选举员来统计票数,这个数值设定了需要多少个人来求出一个老大,配置1让nifi快速选举
# cluster load balancing properties #
nifi.cluster.load.balance.host=192.168.222.135 # 均衡的沟通ip端口,这里填对应节点的IP
nifi.cluster.load.balance.port=6342 # 端口
nifi.cluster.load.balance.connections.per.node=1 # 这个参数在数据量/文件个数多的时候配置大一点
nifi.cluster.load.balance.max.thread.count=8
nifi.cluster.load.balance.comms.timeout=30 sec
# zookeeper properties, used for cluster management #
nifi.zookeeper.connect.string=192.168.222.135:2181,192.168.222.136:2181,192.168.222.137:2181 #zk集群
nifi.zookeeper.connect.timeout=10 secs
nifi.zookeeper.session.timeout=10 secs
nifi.zookeeper.root.node=/nifi # zk上的注册的节点 同一个zk集群的同一个节点设定为同一个nifi集群
nifi.zookeeper.client.secure=false
nifi.zookeeper.security.keystore=
nifi.zookeeper.security.keystoreType=
nifi.zookeeper.security.keystorePasswd=
nifi.zookeeper.security.truststore=
nifi.zookeeper.security.truststoreType=
nifi.zookeeper.security.truststorePasswd=
nifi.zookeeper.jute.maxbuffer=
修改conf/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.222.135:2181,192.168.222.136:2181,192.168.222.137:2181</property> #zk集群
<property name="Root Node">/nifi</property> #zk注册节点
<property name="Session Timeout">10 seconds</property>
<property name="Access Control">Open</property>
</cluster-provider>
修改conf/bootstrap.conf
# JVM memory settings 默认1024 需要根据实际修改
java.arg.2=-Xms1024m
java.arg.3=-Xmx1024m
3、设置登录用户和密码
bin/nifi.sh set-single-user-credentials <username> <password>
4、启动nifi
每个节点依次执行 bin/nifi.sh start
启动,集群将选举产生主节点。NiFi 集群中的任一节点均可访问。后续可以用Nginx反向代理配置负载均衡,进行负载优化。
5、登录nifi
初次搭建登录时采用小节3所设置的用户名和密码,后续再次登录时无须输入密码,根据nifi自带算法自动生成密码登录。
6、conf/nifi.properties
配置文件中各配置参数的具体意思。
详见:https://nifi.apache.org/docs/nifi-docs/html/administration-guide.html#security_properties
NIFI集群部署,kerberos环境,依赖外部zookeeper.
环境规划
host-1 192.168.222.135 ZK NIFI kerberos-server NIFI-toolkit
host-2 192.168.222.136 ZK NIFI kerberos-client
host-3 192.168.222.137 ZK NIFI kerberos-client
搭建时不要求与ZK、kerberos共机,本次搭建资源有限,采取共机模式。
1、下载相关的安装包
官方网址:https://nifi.apache.org/download.html
wget --no-check-certificate https://dlcdn.apache.org/nifi/1.16.3/nifi-toolkit-1.16.3-bin.zip
wget --no-check-certificate https://dlcdn.apache.org/nifi/1.16.3/nifi-1.16.3-bin.zip
2、生成证书
为集群相关host[1-3]节点生成密钥库,truststore,nifi.properties以及具有给定DN的客户端证书。
进入配套的toolkit的bin 目录下执行命令
sh tls-toolkit.sh standalone -C 'CN=192.168.222.135, OU=NIFI' -n '192.168.222.135' --keyPassword hdoopnifi --keyStorePassword hdoopnifi --trustStorePassword hdoopnifi --subjectAlternativeNames '192.168.222.135,0.0.0.0' -o '../target'
其中
-C,-clientcertDn生成适合在指定浏览器中使用的客户端证书。
-n,-hostnames要生成证书的主机名列表(以逗号分隔),可指定多次,支持范围和实例模式。
-c, -certificateAuthorityHostname 为Hostname of NiFi Certificate Authority。
-o, -outputDirectory 指定生成证书的路径
-subjectAlternativeNames 在证书中用作主题备用名称的域的逗号分隔列表。
!!注意:证书的生成是个简单又很容易犯错的步骤,这里总结一下本人在此遇到的一些坑。
(1)CN=192.168.222.135,OU=NIFI 这两个参数中,前面那个是你后续访问的链接地址,如何是域名访问则将主机IP改为对应的域名,并做好域名解析。后面那个基本不用更改照着来就可以。
(2)hdoopnifi是我个人指定的密码,这里是根据自己需要来修改,或者不定义这几个参数采用默认值。
(3)这里集群模式时一次指定一个机器IP或一个访问域名,切莫偷懒,指定的目录最后指定的目录也不要有变动,例如本次搭建我的集群有三个节点,则只需要修改命令中对应的主机IP后直接执行三次。如每次执行都更换一次指定目录时会导致后续集群内部通信出现认证问题。
执行完后会在target目录下根据我们指定的主机名列表或主机IP生成相关的配置文件和秘钥库,我们将其各主机名或IP下的相关文件分发到对应节点的nifi的安装目录的conf目录下,相同文件的选择覆盖。
3、配置相关kerberos服务主体的相关信息(这里采用已经搭建好的kerberos服务,关于kerberos可单独查看kerberos搭建部署的文档)
#在kerberos-server新增一个nifi/admin的服务主体
kadmin.local #连接kerberos数据库
addprinc -pw hadoop nifi/admin@HADOOP.CHINATELECOM.CN #新增一个指定密码为hadoop的服务主体
ktadd -k /opt/nifi-admin.keytab -norandkey nifi/admin@HADOOP.CHINATELECOM.CN #导出相关的服务主体的keytab到/opt目录下,因为在执行导出命令的时候会使得服务主体的密码发生改变,添加参数-norandkey可解决该问题。
#kerberos-client验证
kinit nifi/admin@HADOOP.CHINATELECOM.CN #zz执行命令
Password for nifi/admin@HADOOP.CHINATELECOM.CN: #手动输入设置的密码hadoop
#无报错则表示验证没有问题。
#验证完毕后将kerberos-server的/etc/krb5.conf 和导出的服务主体keytab文件/opt/nifi-admin.keytab拷贝至节点的nifi的安装目录的conf目录下
4、kerberos集群搭建需要更改五个配置文件(使用外部zookeeper,3.5版本以上)每个节点都需修改。
更改 conf/nifi.properties
文件中的相关配置,这块和非kerberos环境不同
###### #
# State Management
###### #
nifi.state.management.configuration.file=./conf/state-management.xml
# The ID of the local state provider
nifi.state.management.provider.local=local-provider #使用自带provider
# The ID of the cluster-wide state provider. This will be ignored if NiFi is not clustered but must be populated if running in a cluster.
nifi.state.management.provider.cluster=zk-provider #使用zk进行cluster控制(还可以使用redis等
# Specifies whether or not this instance of NiFi should run an embedded ZooKeeper server
nifi.state.management.embedded.zookeeper.start=false #使用内部zk(nifi自带zk,本次搭建使用外部的)
# Properties file that provides the ZooKeeper properties to use if <nifi.state.management.embedded.zookeeper.start> is set to true
nifi.state.management.embedded.zookeeper.properties=./conf/zookeeper.properties #如果使用内部zk 该属性无效
# Site to Site properties
nifi.remote.input.host=192.168.222.135
nifi.remote.input.secure=true #这表明该 NiFi 实例与远程 NiFi 实例之间的通信是否应该是安全的(即,安全的站点到站点)。默认情况下,它设置为true。
nifi.remote.input.socket.port=10443
nifi.remote.input.http.enabled=true #指定是否应在此主机上启用 HTTP 站点到站点。默认情况下,它设置为true。
nifi.remote.input.http.transaction.ttl=30 sec
nifi.remote.contents.cache.expiration=30 secs
# web properties #
#############################################
# For security, NiFi will present the UI on 127.0.0.1 and only be accessible through this loopback interface.
# Be aware that changing these properties may affect how your instance can be accessed without any restriction.
# We recommend configuring HTTPS instead. The administrators guide provides instructions on how to do this.
#这几个默认打开的,使用kerberos认证时必须使用https, 不能用http,这里注释掉
#nifi.web.http.host=
#nifi.web.http.port=
#nifi.web.http.network.interface.default=
#############################################
nifi.web.https.host=host-1 # 非常重要,nifi的界面化控制ip地址,填对应节点的IP
nifi.web.https.port=9443 # 控制ip地址的端口
nifi.web.https.network.interface.default=
# security properties #
nifi.sensitive.props.key=testpassword # 这是用于加密处理器中配置的任何敏感属性值的密码。默认情况下,它是空白的,但系统管理员应该为它提供一个值。它可以是任意长度的字符串,但建议的最小长度为 12 个字符。请注意,一旦设置了此密码并配置了一个或多个敏感处理器属性,则不应更改此密码。这里通过 执行 bin/nifi.sh set-sensitive-properties-key testpassword 为其指定密码为testpasswd,可根据实际修改。
nifi.sensitive.props.key.protected=
nifi.sensitive.props.algorithm=NIFI_PBKDF2_AES_GCM_256
nifi.sensitive.props.additional.keys=
nifi.security.autoreload.enabled=false
nifi.security.autoreload.interval=10 secs
nifi.security.keystore=./conf/keystore.jks
nifi.security.keystoreType=jks
nifi.security.keystorePasswd=hdoopnifi
nifi.security.keyPasswd=hdoopnifi
nifi.security.truststore=./conf/truststore.jks
nifi.security.truststoreType=jks
nifi.security.truststorePasswd=hdoopnifi
nifi.security.user.authorizer=file-provider #用户登录采用文件方式
nifi.security.allow.anonymous.authentication=false
nifi.security.user.login.identity.provider=kerberos-provider #采用kerberos认证
nifi.security.user.jws.key.rotation.period=PT1H
nifi.security.ocsp.responder.url=
nifi.security.ocsp.responder.certificate=
# cluster common properties (all nodes must have same values) #
nifi.cluster.protocol.heartbeat.interval=5 sec
nifi.cluster.protocol.heartbeat.missable.max=8
nifi.cluster.protocol.is.secure=true #这里必须设置为true
# cluster node properties (only configure for cluster nodes) #
nifi.cluster.is.node=true # 指定这个nifi节点是否是集群中的一员, 如false则单节点运行
nifi.cluster.node.address=192.168.222.135 # 与其他节点进行通讯的ip地址和端口,这里填对应节点的IP
nifi.cluster.node.protocol.port=11443 # 通讯的ip的端口
nifi.cluster.node.protocol.max.threads=50 # 使用多少个线程进行通讯,推荐节点数*2
nifi.cluster.node.event.history.size=25
nifi.cluster.node.connection.timeout=5 sec
nifi.cluster.node.read.timeout=5 sec
nifi.cluster.node.max.concurrent.requests=100
nifi.cluster.firewall.file=
nifi.cluster.flow.election.max.wait.time=20 secs # 选举等待时间
nifi.cluster.flow.election.max.candidates=1 # nifi中有选举员和老大,要选举的时候由选举员来统计票数,这个数值设定了需要多少个人来求出一个老大,配置1让nifi快速选举
# cluster load balancing properties #
nifi.cluster.load.balance.host=192.168.222.135 # 均衡的沟通ip端口,这里填对应节点的IP
nifi.cluster.load.balance.port=6342 # 端口
nifi.cluster.load.balance.connections.per.node=1 # 这个参数在数据量/文件个数多的时候配置大一点
nifi.cluster.load.balance.max.thread.count=8
nifi.cluster.load.balance.comms.timeout=30 sec
# zookeeper properties, used for cluster management #
nifi.zookeeper.connect.string=192.168.222.135:2181,192.168.222.136:2181,192.168.222.137:2181 #zk集群
nifi.zookeeper.connect.timeout=10 secs
nifi.zookeeper.session.timeout=10 secs
nifi.zookeeper.root.node=/nifi # zk上的注册的节点 同一个zk集群的同一个节点设定为同一个nifi集群
nifi.zookeeper.client.secure=false
nifi.zookeeper.security.keystore=
nifi.zookeeper.security.keystoreType=
nifi.zookeeper.security.keystorePasswd=
nifi.zookeeper.security.truststore=
nifi.zookeeper.security.truststoreType=
nifi.zookeeper.security.truststorePasswd=
nifi.zookeeper.jute.maxbuffer=
# kerberos #
nifi.kerberos.krb5.file=/etc/krb5.conf #kerberos的配置文件,根据文件实际存在位置设定
# kerberos service principal
nifi.kerberos.service.principal=nifi/admin@HADOOP.CHINATELECOM.CN #配置的服务主体
nifi.kerberos.service.keytab.location=/opt/nifi-admin.keytab #配置的服务主体的keytab
修改conf/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.222.135:2181,192.168.222.136:2181,192.168.222.137:2181</property> #zk集群
<property name="Root Node">/nifi</property> #zk注册节点
<property name="Session Timeout">10 seconds</property>
<property name="Access Control">Open</property>
</cluster-provider>
修改login-identity-providers.xml
#放开kerberos的配置
<provider>
<identifier>kerberos-provider</identifier>
<class>org.apache.nifi.kerberos.KerberosProvider</class>
<property name="Default Realm">HADOOP.CHINATELECOM.CN</property>#这里填写kerberos的Realm
<property name="Authentication Expiration">12 hours</property>#这里是用户登录超12小时后必须重新登录
</provider>
修改authorizers.xml
#放开file-provider的配置项
<authorizer>
<identifier>file-provider</identifier>
<class>org.apache.nifi.authorization.FileAuthorizer</class>
<property name="Authorizations File">./conf/authorizations.xml</property>
<property name="Users File">./conf/users.xml</property>
#页面登录用户也是整个nifi集群的管理用户需要带上主体信息
<property name="Initial Admin Identity">nifi/fanzhu@HADOOP.CHINATELECOM.CN</property>
<property name="Legacy Authorized Users File"></property>
#这里填写生成证书时指定的CN和OU,这里需要注意这个空格的问题,生成证书的时候用空格的话这里填写的时候也需要有,生成证书的时候没有的话,这里也不要加,不然会报错,需要把集群中所有节点的信息全加进来,本次实验我这里只加了两个机器作为示例
<property name="Node Identity 1">CN=192.168.222.135, OU=NIFI</property>
<property name="Node Identity 2">CN=192.168.222.136, OU=NIFI</property>
</authorizer>
#同上一样进行修改
<userGroupProvider>
<identifier>file-user-group-provider</identifier>
<class>org.apache.nifi.authorization.FileUserGroupProvider</class>
<property name="Users File">./conf/users.xml</property>
<property name="Legacy Authorized Users File"></property>
<property name="Initial User Identity 0">nifi/fanzhu@HADOOP.CHINATELECOM.CN</property>
<property name="Initial User Identity 1">CN=192.168.222.135, OU=NIFI</property>
<property name="Initial User Identity 2">CN=192.168.222.136, OU=NIFI</property>
</userGroupProvider>
<accessPolicyProvider>
<identifier>file-access-policy-provider</identifier>
<class>org.apache.nifi.authorization.FileAccessPolicyProvider</class>
<property name="User Group Provider">file-user-group-provider</property>
<property name="Authorizations File">./conf/authorizations.xml</property>
<property name="Initial Admin Identity">nifi/fanzhu@HADOOP.CHINATELECOM.CN</property>
<property name="Legacy Authorized Users File"></property>
<property name="Node Identity 1">CN=192.168.222.135, OU=NIFI</property>
<property name="Node Identity 2">CN=192.168.222.136, OU=NIFI</property>
<property name="Node Group"></property>
</accessPolicyProvider>
修改conf/bootstrap.conf
# JVM memory settings 默认1024 需要根据实际修改
java.arg.2=-Xms1024m
java.arg.3=-Xmx1024m
5、登录
完成各个节点的配置后依次启动nifi后就可以去页面访问登录了,登录的用户名为在kerberos时设置的nifi/admin
密码为hadoop,登录后页面有相应的用户名显示和用户配置则为配置成功。
6、遇到问题
本人在搭建过程遇到了以下两个报错,第一个是登录页面时报错,第二个是往集群中加其他机器时报错,造成这两个问题的根本原因均是证书配置有误导致,可见nifi官方的证书配置或参考第二节相关内容重新进行证书的配置和生成。除此以外,请切记每次修改完nifi.properties
文件时请删除flow.json.gz
和flow.xml.gz
两个文件让其启动的时候重新生成,每次修改完authorizers.xml
文件请删除authorizations.xml
和users.xml
两个文件让其启动的时候重新生成。如何没有删除相关的文件时可能会导致参数修改不生效。
7、本人在生产环境所用的服务器性能是内存:384G CPU:96 存储:12*16T,对此进行了以下相关参数的调优,可供参考。
# JVM memory settings 默认1024 需要根据实际修改
java.arg.2=-Xms1024m
java.arg.3=-Xmx1024m
nifi.flow.configuration.archive.enabled=true
nifi.content.claim.max.appendable.size=50 MB
nifi.cluster.node.protocol.max.threads=200
nifi.provenance.repository.max.storage.size=100 GB
nifi.provenance.repository.max.storage.time=4 days
nifi.provenance.repository.rollover.time=5 mins
nifi.provenance.repository.rollover.size=300 MB
nifi.provenance.repository.index.shard.size=2 GB
nifi.bored.yield.duration=30 millis
nifi.content.repository.archive.max.usage.percentage=75%