NIFI经验交流
1.如何实现nifi汉化
nifi汉化实质就是将nifi界面上显示的文字改为汉字,主要是包括两部分,界面的汉化和处理器的汉化。为了方便以后nifi国际化的扩展,选择i18n.properties技术进行。
i18n.properties的使用方法很简单,只需要在项目中引用jquery.js和jquery.i18n.properties-min-1.0.9.js文件,然后对需要汉化的地方添加lable标签,然后编写汉化的词或句的properties文件,最后写javascript函数,通过i18n的固定调用方式调用相应的词或句,赋值给对应的地方即可。
对处理器进行汉化时使用ResourceBundle类进行,同样是编写原语言properties和汉化后的properties,然后创建类使用ResourceBundle的getBundle方法获取对应的语言文件,最后在需要汉化的地方调用该类的方法的getString()方法实现相关语言的替换。
2.nifi的打包规则及实现
nifi处理器的编写主要是通过nifi-nar-bundles实现的,在该部分下根据处理器的功能和类别分为很多模块,每个模块主要又分为nar和processor两个子模块,每个模块和子模块都是独立的工程,可以单独进行打包和运行。
其中processor模块就是处理器的编写模块,在该模块下根据nifi的规则进行处理器的编写。nar模块主要是打包模块,它将processor模块的所有资源及依赖打成nar包,然后在nifi整个工程打包时,放入lib目录下,在nifi运行时,解压nar包,将其中的资源放到相应的目录下进行运行。
3.nifi数据流的传输和参数的传递
nifi数据的传输和参数的传递都是通过nifi定义的FlowFile对象和 ProcessSession对象实现的,其中FlowFile对象负责数据和参数的承载,ProcessSession负责FlowFile对象的更新、写入、删除、传递等动作。
通过重写ProcessSession.write方法中的process方法,实现flowfile对象的更新,process方法会提供InputStream和OutputStream,前者负责原flowfile数据的传入,后者负责flowfile数据的传出。若只需要获取FlowFile而不需要传递出去,则可以使用ProcessSession.read方法,重写其中的process,该process只有InputStream一个输入用来获取flowfile的数据。
通过FlowFile. getAttributes()方法可以获得flowfile带的所有参数,通过ProcessSession.putAttribute()方法可以将参数写入flowfile,通常情况下若不对flowfile的参数进行改变,则flowfile里面的参数会随着ProcessSession一直向后传递。处理器本身输入的参数可以通过ProcessContext. getProperty()获取。
4.nifi不同remote之间的传输
nifi不同节点之间传输数据是通过site-to-site协议实现的。发送节点将数据输出到输出端口,接收节点通过RemoteProcessGroup接收数据,RemoteProcessGroup需要设定接收数据节点的连接及数据传输协议,然后选择发送节点的输出端口,用处理器进行数据的接收和处理。
5.nifi如何新增自定义处理器
使用mvn archetype:generate命令创建nifi处理器模板工程,模板工程包含一个nar子工程一个processor子工程,在processor中编写处理器,然后在processor的resources目录下的META-INF.services下的org.apache.nifi.processor.Processor文件中注册处理器。install整个工程,会自动打包到本地仓库,然后在nifi的nifi-assembly模块的pom.xml文件中填写该工程的依赖。打包nifi工程再运行时,新增的处理器即生效。
也可打包完新增的工程后,将nar包放入nifi运行程序的lib中,然后重新运行nifi,新增处理器即生效。
同功能类型的处理器可以写在一个工程中,只要在org.apache.nifi.processor.Processor文件中进行注册即可。处理器编写主要是参数的定义、获取及装填,然后重写onTrigger方法,在其中写处理器的逻辑,详细步骤可查阅相关资料。
6.nifi如何实现文件回溯
nifi实现文件的回溯基于其存储方式,nifi的存储包括FlowFile Repository,Content Repository,Provenance Repository三个部分。其中FlowFile Repository存储了flowfile的相关的属性,一个指向的flowfile实际内容的指针,和FlowFile的状态。Content Repository存放了flowfile的内容, Provenance Repository存放了flowfile的运行时状态。
Content Repository中存放的content是“只读”状态,也就说等写到磁盘上后不会被更新,直到数据过期。这种特性导致nifi在对数据进行处理时都会将数据拷贝一份,然后原数据不动,对拷贝的数据进行处理。
Provenance Repository是存放FlowFile历史的地方,为每一条数据提供了数据血统图。每当FlowFile产生动作(FlowFile is created, forked, cloned, modified, etc.),那么就会产生一条provenance event。每一条provenance event中存放了FlowFile的所有属性和指向FlowFile content的指针。Provenance Repository会存放一段时间内的provenance event。
nifi就是通过上述特性实现文件的回溯,主要是文件的“只读”性和Provenance产生的provenance event。
7.nifi如何实现接口调用开发
nifi提供接口供开发者调用,如果nifi没有启用https,则直接按照文档直接调用即可,若开启了https,则需要进行安全认证之后再调用,这里以nifi集群结合ldap开启https为例说明。
首先需要在机器上安装证书,安装证书的命令如下所示,需要注意的是当nifi为集群模式时,你调用哪个节点的接口,就需要添加哪个节点的证书。
keytool -import -alias nifi -keystore $JAVA_HOME/jre/lib/security/cacerts -file /opt/nifi.cer -storepass changeit -noprompt
证书安装完成之后,需要调用access/token接口,通过传入用户名和密码获取到token,之后接口的调用需要带着token去调用,将Bearer token的组合放到header的Authorization中,注意token默认只有12个小时的有效期,超期无效。注意你获取的哪个节点的token,调用后续接口时,url的地址就要写那个节点的地址,要相互对应。
卸载证书的命令如下:
keytool -delete -alias nifi -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit -noprompt