Apache NiFi流中无需存储文件/数据库 下游处理器如何调用首处理器输入输出
Apache NiFi 跨处理器缓存值实现方案
一、可用原生处理器实现方式
不需要落地存储的情况下,可选择以下两种适配不同场景的方案:
UpdateAttribute+ FlowFile属性传递(单链路场景首选)
这是最轻量化的实现方式,直接在processor1中通过UpdateAttribute把产出的a值写入FlowFile的自定义属性(例如命名为cached_a),processor2同理把产出的b值写入自定义属性cached_b。NiFi的同一条链路中,FlowFile的属性会默认向后传递,你在processor4直接通过表达式${cached_a}即可调用processor1的产出值,processor5通过${cached_b}即可调用processor2的产出值,全程数据都存在FlowFile元数据中,不会落地到文件或数据库。提示:如果数据流中间有FlowFile拆分、合并操作,需要提前配置属性继承规则,确保拆分/合并后的新FlowFile仍携带上述两个缓存属性。
DistributedMapCacheServer+PutDistributedMapCache+FetchDistributedMapCache组合(全局共享缓存场景)
如果你需要缓存的值可以跨不同FlowFile、甚至跨不同数据流调用,可使用这套内置缓存组件:- 先启动
DistributedMapCacheServer控制器服务,配置缓存大小、过期时间,数据全程存储在内存中不会落地 - 在processor1后串联
PutDistributedMapCache,把a值写入缓存,自定义全局唯一key例如global_cached_a - 在processor2后串联
PutDistributedMapCache,把b值写入缓存,自定义key例如global_cached_b - 在processor4、processor5前分别串联
FetchDistributedMapCache,根据对应key把缓存值取出写入FlowFile属性即可调用
- 先启动
二、是否可以通过bash脚本实现
可以实现,但性价比远低于原生处理器方案,非特殊场景不推荐。
实现逻辑:你可以通过ExecuteStreamCommand处理器调用自定义bash脚本,把需要缓存的值写入Linux系统默认的共享内存挂载目录/dev/shm(该目录数据全部存储在内存中,不会落地到磁盘),写入命令可写为echo $a > /dev/shm/cache_a,读取命令可写为a=$(cat /dev/shm/cache_a)。
提示:该方案需要自行处理缓存并发读写冲突、过期清理、集群多节点缓存同步等问题,运维成本较高。
内容的提问来源于stack exchange,提问作者newbie
相关产品推荐
相关产品推荐

