3 NiFi Processor应用介绍
对于NiFi的使用者来说,如果想要创建一个高效的数据流,那么就需要了解什么样的单元处理器才最适合这个数据流。NiFi拥有大量的可以用于各种业务场景的单元处理器可供使用者挑选和使用,这些单元处理器主要提供例如系统之间数据的传输,数据的路由,数据的转换、处理、分割和聚合等大类的功能。
在每个NiFi的版本发布中都会有大量的新的处理器单元产生,这就导致本书中讲重点介绍1.4.0版本及之前的常用处理器单元的功能,我们讲根据这些常用的处理器单元的不同用处进行分类。
2.3.1 数据转换类处理器单元
CompressContent
CompressContent处理器单元主要用途是对NiFi数据流的FlowFile的内容进行压缩和解压缩,支持的压缩种类如图

ConvertCharacterSet
ConvertCharacterSet处理器单元主要用途将NiFi数据流的FlowFile的内容从一种字符集转换成另外一种字符集。配置例子如图

EncryptContent
EncryptContent处理器单元主要用途将NiFi数据流的FlowFile的内容进行加密/解密传输。

ReplaceText
ReplaceText处理器单元主要用途是根据处理器属性配置的正则表达式对FlowFile的内容进行匹配,如果匹配成功将会降匹配成功的字段替换为配置属性中的字段。将FlowFile的内容全部替换为nifi的配置例子如图

⁃
2.3.2 数据路由类和调制处理器单元
ControlRate
ControlRate处理器单元用来控制数据流部分流量的速率。

上面的图中的例子表示1分钟内只允许最多1000个FlowFile流过。
DetectDuplicate
DetectDuplicate处理器单元用来依据用户定义的特征来监控和发现重复的FlowFile。通常这个处理器会搭配HashContent单元处理器来完成功能。

上面的图中的例子表示Processor根据输入的FlowFile的hash.value属性值作为去重条件对FlowFile进行匹配,将去重后的映射到non-duplicate的Relationship中,将重复的FlowFile映射到duplicate的Relationship中。
MonitorActivity
MonitorActivity处理器单元可以在用户定义的时段内如果没有数据流量就是发送告警通知,也可以选择附加功能,在数据流量恢复之后发送恢复通知。

上面的图中例子标示Processor每1分钟内没有FlowFile输入就会不间断的发出Inactivity Message属性的内容,且检测范围是本Node节点。
RouteOnAttribute
RouteOnAttribute处理器单元可以根据FlowFile的属性制定路由规则来对FlowFile进行路由。

上面的图中例子表示Processor根据输入的FlowFile的value属性进行路由,将含有hello的FlowFile路由到include hello text的Relationship中,将含有world的FlowFile路由到include world text的Relationship中。
ScanAttribute
ScanAttribute处理器单元用途是将FlowFile属性中被用户定义的属性与用户自定义的字典进行对比,看是否能够匹配。

上面的图中例子表示Processor输入的FlowFile中的属性值只要有一个包含了Sample.txt字典中任意一行的字符,那么Processor就会将这个FlowFile路由到matched的Relationship中。
RouteOnContent
RouteOnContent处理器单元的功能近似于RouteOnAttribute,区别在于RouteOnContent处理器单元进行路由判定的内容是FlowFile的内容而不是之前RouteOnAttribute处理器单元所使用的属性。

上面的图中例子表示Processor根据输入FlowFile的内容进行路由,如果输入的FlowFile的内容为hello,那么它将会被路由到hello relationship的relationship中。
ScanContent
ScanContent处理器单元同样也近似于ScanAttribute,区别在于前者用户选取的比对对象是内容而后者定义却是属性。

上面的图中例子表示Processor根据输入FlowFile内容进行扫描路由,如果FlowFile的内容为hello,那么它将会被路由到matched的relationship中。
ValidateXml
ValidateXml处理器单元将FlowFile的XML内容和用户的XML定义进行校验,将符合XML定义的FlowFile进行路由。

上面的图中表示Processor根据输入XML的Schema文件对输入的FlowFile内容进行校验匹配,如果校验合格的FlowFile会被映射到valid的relationship中。
上面的图中表示Processor根据输入的FlowFile中的HiveQL往Hive中写入或者更新数据。
2.3.3 数据接入类处理器单元
ConvertJSONToSQL
ConvertJSONToSQL处理器单元可以将结构化的Json转换成INSERT或者UPDATE这样命令的SQL,配合PutSQL处理器单元可以直接根据这鞋命令将数据插入数据库中。

上面的图中表示Processor根据输入的FlowFile的JSON内容,将JSON转化成Update的SQL语句。
ExecuteSQL
ExecuteSQL处理器单元直接运行运行用户配置的SQL查询语句,并将查询结果以Avro的格式写入到FlowFile的内容中去。

上面的图中表示Processor根据用户配置SQL select query语句,从数据库中查询出结果,并将结果FlowFile映射到success的relationship中。
PutSQL
PutSQL处理器单元可以根据传入的FlowFile内容中的DDM SQL对数据库进行更新操作。

上面的图中表示Processor根据输入的FlowFile的SQL内容,每100个SQL作为一个事务提交数据库,并将生成的Key返回且在事务提交失败的情况下对事务进行回滚。
SelectHiveQL
SelectHiveQL处理器单元执行Hive的查询语句HiveQL,并且将结果以Avro或者CSV的格式写入到FlowFile中。

上面的图中表示Processor根据HiveQL语句查询Hive,并将结果以CSV格式输出,CSV拥有Header为username和age。
PutHiveQL
PutHiveQL处理器根据传入的HiveQL DDM语句对Hive数据仓库的内容进行更新。

上面的图中表示Processor根据输入的FlowFile中的HiveQL往Hive中写入或者更新数据。
2.3.4 属性提取类处理器单元
EvaluateJsonPath
EvaluateJsonPath处理器单元根据用户定义的JSONpath表达式对FlowFile的JSON内容进行解析,将这些表达式所解析出来的内容替换FlowFile的内容或者将其更新到FlowFile的属性中,以便于后续的单元处理器的引用。

上面的图中表示Processor将输入内容为JSON格式的FlowFile例如{“name”:”zhangsan”,”phone”:”13734564321”},将其中的phone解析出来后输出到FlowFile的内容中。
EvaluateXPath
EvaluateXPath处理器单元功能近似于EvaluateJsonPath,根据用户提供的XPath表达式,将FlowFile的XML内容用表达式进行解析,将解析的结果替换如FlowFile的正文或者更新FlowFile的属性。

上面的图中表示Processor对输入内容为XML格式的FlowFile利用配置XPath表达式进行解析,并将结果输出到FlowFile的内容中。
EvaluateXQuery
EvaluateXQuery处理器单元根据用户定义的XQuery,将FlowFile的XML正文与表达式进行进行虬枝,将提取的结果替换FlowFile的正文或者更新FlowFile的属性。

上面的图中表示Processor对输入内容为XML格式的FlowFile利用配置的XQuery表达式进行解析,并将结果以XML格式输入到FlowFile的内容中。
HashAttribute
HashAttribute处理器单元对用户选择的已有属性列表的值拼接后的字符串进行Hash计算。

上面的图中表示Processor对输入的FlowFile中value属性值进行hash计算,并将结果输出到FlowFile的value属性中。
HashContent
HashContent处理器单元对FlowFile的内容进行Hash,并将Hash值添加到FlowFile的属性中。

上面的图中表示Processor对输入的FlowFile中的内容进行hash计算,并将结果输出到FlowFile的hash.value属性中。
IdentifyMimeType
IdentifyMimeType处理器单元对FlowFile的内容格式进行判定。此处理器能够检测许多不同的MIME类型,例如它能够判定出FlowFile的内容是图片,文本和压缩文件等格式。
UpdateAttribute
UpdateAttribute处理器单元可以对FlowFile添加任意的用户定义的属性。这将有利于对FlowFile添加静态的属性,也可以根据NiFi表达式语言来动态的添加属性。

上面的图中表示Processor对输入的FlowFile中属性进行修改,添加一个键值为value值为helloworld的属性。
2.3.5 系统交互类处理器单元
ExecuteProcess
ExecuteProcess处理器单元能够运行用户定义的操作系统命令,将处理完的标准输出内容写入flowfile中。该处理器是一个不需要输入的源处理器,它会输出产生一个新的FlowFile。如果需要提供输入源请使用下面介绍的executestreamcommand处理器单元。

上面的图中表示Processor根据输入的指令和参数执行命令ls –l /user,并将结果输出到FlowFile中。
ExecuteStreamCommand
ExecuteStreamCommand处理器单元运行用户定义的操作系统命令。输入的FlowFile的内容作为命令的标准输入。将处理完的标准输出内容写入FlowFile内容中。此处理器单元不同于ExecuteProcess,它必须有FlowFile的输入才能正常完成功能。

上面的图中表示Processor根据输入的FlowFile中的path属性值为/usr/cmd.sh命令脚本的运行参数来运行命令,并将结果输出到FlowFile中。
2.3.6 数据提取类处理器单元
GetFile
GetFile处理器单元从本地磁盘获取文件的内容到NiFi,并删除原有的磁盘文件。这个处理器应用场景是将一个文件从一个地方搬移到另外一个地方而不是对文件的拷贝。

上面的图中表示Processor将/user/sample.txt文件的内容输出到FlowFile的内容中。
GetFTP
GetFTP处理器单元从FTP服务器文件内容输出到FlowFile中,并可以选择删除原有文件。同样它的使用场景是文件的搬移而不是文件的拷贝。

上面的图中表示Processor将ftpServer01上/resource路径下的文件内容输出到FlowFile中,并将源文件删除。
GetSFTP
GetSFTP处理器单元从SFTP文件内容输出到FlowFile中,并可以选择删除原有文件。同样它的使用场景是文件的搬移而不是文件的拷贝。

上面的图中表示Processor将sftpServer01上/resource路径下的文件内容输出到FlowFile中,并将源文件删除。
GetJMSQueue
GetJMSQueue处理器单元从JMS队列中下载消息,并通过JMS Message来创建FlowFile的内容,同时也可以指定创建FlowFile的属性。

GetJMSTopic
GetJMSTopic处理器单元从JMS的Topic中下载消息,并根据JMS消息创建FlowFile的内容,通过选择也能生成FlowFile的属性。这个处理器单元支持长期和非长期的订阅模式。
GetHTTP
GetHTTP处理器单元能够根据URL通过HTTP或者HTTPS协议下载内容到NiFi,从而形成的新的FlowFile内容。同时处理器单元在下载的同时也记忆ETag和最新修改时间来防止数据的重复下载问题。

上面的图中表示Processor根据配置的URL进行http访问,将访问结果发送到FlowFile的内容中并且filename属性值为配置的Filename的值。
ListenHTTP
ListenHTTP处理器单元启动一个HTTP或者HTTPS监听端口,当监听到有POST请求过来的时候,会首先返回200状态,并利用POST的请求内容形成新的FlowFile。

上面的图中表示Processor监听8811端口的HTTP POST请求,当有POST请求访问http://localhost:8811/contentListener的时候,Processor就会首先返回200状态,让后将POST请求的参数输出到新的FlowFile的内容中。
ListenUDP
ListenUDP处理器单元监听UDP数据包,并根据配置获取一定量的包来创建一个FlowFile并将FlowFile发射到success的Relationships关系中。

GetHDFS
GetHDFS处理器单元监控用户定义的HDFS指定路径的文件变化,当有新的文件写入HDFS中的该路径下,那么文件的内容被用来创建新的FlowFile的内容,同时删除原有的文件。这个处理器同前面一样适用于文件的搬移场景而非文件的复制场景。

上面的图中表示Processor将HDFS上/target路径下的文件内容输出到FlowFile中,并将源文件删除。
2.3.7数据发送类处理器单元
PutEmail
PutEmail处理器单元主要功能是将FlowFile的内容以邮件的形式发送给配置的用户邮箱,也可以通过配置选择将FlowFile的内容以附件的方式发送出去。

PutFile
PutFile处理器主要功能是将FlowFile的内容以文件的形式写入本地磁盘。

上面的图中表示Processor将接收到的FlowFile的内容写入到本地的磁盘文件中。(注意:1.5.0之前此Processor不支持追加写入)
PutFTP
PutFTP处理器单元将FlowFile的内容拷贝到远程的FTP服务器上。

上面的图中表示Processor将输入的FlowFile的内容通过FTP协议写入到ftpServer01的/upload路径下且上传路径不存在的情况下自动创建路径。
PutSFTP
PutSFTP处理器单元主要功能将FlowFile的内容拷贝到远程的SFTP服务器上。

上面的图中表示Processor将输入的FlowFile的内容通过SFTP协议写入到sftpServer01的/upload路径下且上传路径不存在的情况下自动创建路径。
PutJMS
PutJMS处理器单元主要功能将FlowFile的内容座位JMS消息发送到JMS代理上,也可以通过配置根据FlowFile的属性来添加JMS配置属性。

PutSQL
PutSQL处理器单元的主要功能是将FlowFile的正文当作SQL DDL声明。FlowFile必须是正确的符合SQL规范的SQL声明。FlowFile的属性被用作DDL SQL的参数,这样可以有效的防止SQL注入攻击。

上面的图中表示Processor将输入的FlowFile的内容按照100个进行batch操作写入数据库。
PutKafka
PutKafka处理器单元专门是针对0.8.x版本的Kafka,它将FlowFile的内容以消息的形式发送到Kafka消息队列中。FlowFile的内容既可以作为一条完整的消息发送到Kafka,同时也可以通过分隔符将它切分为多个消息来发送到Kafka,例如换行符。

上面的图中表示Processor从localhost安装的Kafka的Sample_topic_A消费数据,并将数据输出到FlowFile的内容中。
PutMongo
PutMongo处理器单元将FlowFile的内容插入或者更新到MongoDB中。

上面的图中表示Processor根据输入的FlowFile内容中的doc来写入MongoDB。
2.3.8切分和聚合类处理器单元
SplitText
SplitText处理器单元可以将一个文本内容的FlowFile切分成你想要数量的FlowFile。

上面的图中表示Processor将输入的FlowFile的内容切分成多个FlowFile,每个FlowFile的内容都来自于FlowFile中的一行内容。
SplitJson
SplitJson处理器单元可以将一个JSON对象根据它的结构拆解成JSON内部的字对象。

上面的图中表示Processor将输入的FlowFile内容中的Json按照JsonPath表达式$.*进行第一级切分生成新的FlowFile。
SplitXml
SplitXml处理器单元可以将XML消息分解为多个FlowFile,且新的FlowFile中包含原有的分段信息。这种处理器单元经常适用于多个XML元素被封装在一个元素中,而此处理器单元允许这些元素分离成各自单独的XML元素。

上面的图中表示Processor对于输入的FlowFile内容中的XML按照第一层级进行切分,切分出来的子XML输出到FlowFile中。
UnpackContent
UnpackContent处理器单元可以对压缩格式的文件如ZIP和TAR进行解压,且解压后的文件作为一个FlowFile的内容输出。

上图中UnpackContent和IdentifyMimeType一起使用,后者输出的FlowFile由前者来进行处理,UnpackContent根据输入的FlowFile的mime.type属性对FlowFile的内容进行解压。
MergeContent
MergeContent处理器单元的主要功能是将多个FlowFile的内容合并成一个FlowFile。这些FlowFile的内容合并的同时,也可以通过配置对合并后的内容增加标题,页脚和分隔符,也可以对合并后的内容置顶归档格式,比如ZIP和TAR。在FlowFile合并的过程中可以依据相同的属性进行合并,也可以根据之前分片处理器分片后的序号来进行合并。用户可以定义合并后FlowFile内容的最大值和最小值,当达到这个值的时候FlowFile就合并完毕。为了防止在FlowFile没有达到配置的大小值的过程中时间太久,用户也可以通过配置超时参数来有效的解决这个问题。

上图中表示Processor将输入的FlowFile的内容按照从Queue中任意消费的FlowFile的内容进行Merge输出到新的FlowFile中,FlowFile的内容格式为TAR,选择各个输入FlowFile中一致的属性写入到新输出的FlowFile中,对于不同的Metadata不进行Merge,输出的新的FlowFile内容中同事也增加了页头和页脚。
SegmentContent
SegmentContent处理器单元可以根据配置切分后的FlowFile大小将一个大的FlowFile切分成许多小的FlowFile。分片是基于字节的偏移量而不是分隔符。这种将大的FlowFile以分片的形式进行传输可以有效的减少大文件传输过程中的延时问题。当这些分片传输到达目标端的时候,可以通过其它的处理器单元重新进行组装,例如上面所说的MergeContent处理器单元。

上面的途中表示Processor把输入的FlowFile的内容按照1MB的大小进行切分,切分成新的FlowFile且新的FlowFile中写入了分片的序号segment.index和数量segment.count属性。
SplitContent
SplitContent处理器单元的功能近似于SegmentContent将一个FlowFile分解成多个FlowFile。但区别在于SplitContent在进行分解的过程中不是按照设定的字节大小,而是根据分隔符进行分裂。

上面的图中表示Processor对输入的FlowFile的内容按照竖线 | 符号进行切分,切分成多个FlowFile。
2.3.9 HTTP协议类处理器单元
GetHTTP
GetHTTP处理器单元对配置的http或者https协议的URL发起请求并将返回结果输出到新的FlowFile中。而且GetHTTP会记录Etag和最新数据修改时间避免不停的访问给服务端产生不必要的开销。如下图

ListenHTTP
ListenHTTP处理器单元监听Http或者Https请求,如果有请求先返回200然后将POST的请求参数输出到新的FlowFile中。

上面的图中表示Processor监听locahost的http请求,请求URL为http://localhost:9080/contentListener
InvokeHTTP
InvokeHTTP处理器单元能够根据用户的配置发送HTTP协议请求。InvokeHTTP处理器单元通过更多的配置可以完成比GetHTTP和PostHTTP更多的功能。如下图

PostHTTP
PostHTTP处理器单元将FlowFile的内容作为HTTP POST请求的body消息。它通常与ListenHTTP处理器单元组合使用,应用于当多个NiFi实例之间不能通过Site-to-Site的方式进行数据交换的场景。如下图

HandleHttpRequest / HandleHttpResponse
HandleHttpRequest处理器单元可以作为一个源处理器单元来启动一个HTTP监听服务功能,类似于ListenHTTP。但是这个处理器不响应客户端,它将请求的参数以FlowFile的内容和属性的方式,响数据流的下游进行传递。HandleHttpResponse处理器单元能够响应并将处理后的FlowFile结果返回请求的客户端。这两个处理器通常都是在一起被使用的。