1. 关于 Apache NiFi
NiFi 是Apache开源的一个系统间数据自动化处理和流转工具,具有可视化开发和运维、调度灵活、背压和水平扩展等能力。Apache NiFi的一般使用场景为作为ETL工具,可以对单个数据项进行各种处理。Apache NiFi的插件非常丰富,支持Kafka、JDBC数据源、HTTP、TCP、MySQL CDC、Hadoop等几乎所有已知数据源读取和写入;支持JSON、CSV、AVRO等多种数据格式;支持使用 SQL、JSONPath、RegEx、数据库查找替换、缓存查找替换等多种方式对数据进行处理。
2. 关于 Apache Flink
Apache Flink 是一个在无界和有界数据流上进行状态计算的框架和分布式处理引擎。Flink 已经可以在所有常见的集群环境中运行,并以 in-memory 的速度和任意的规模进行计算。
3. 问题提出
我们一直把 NiFi 当做 ETL 工具使用,将数据写入 Greenplum 数据库后,使用SQL对数据进行统计分析。随着业务量增加和对实时性要求的提高,这个方式越来越力不从心:
1.数据量增加,完成一次统计的时间越来越长;
2.实时性提高,客户对我们三十分钟更新一次统计结果不满意。
4. 问题分析
我们想到可以使用 Flink 对数据进行实时计算,进行增量数据统计分析,只将结果写入数据库,这样我们就解决了以上两个问题。
现有 Flink 的 nifi-connector 支持从 NiFi 接收数据流,需要在 Flink 程序中对接收到的数据流进行解析和处理。这就需要根据数据开发特定的 Flink 程序,对使用者很不友好(另外,nifi-connector 已废弃,将从 Flink 1.16 版本起移除)。
5. 解决方案
我们计划开发一个NiFi 处理器,来执行用户指定的 Flink SQL:
1. 利用 NiFi 的Record Reader 和Record Writer 读写(解析)NiFi数据;
2. 向 Flink集群远程注入自定义的 connector jar包,与NiFi处理器通信;
3. 使用Flink SQL实现业务操作,支持部署和运维时简单修改业务逻辑。
设计方案如下图所示:
在不同场景下,可以使用不同的执行模式:
1. 对于简单(或演示)场景,可以使用 Flink Mini Cluster,完全运行在NiFi进程中,用户不感知 Flink 存在;
2. 对于复杂(或生产)场景,可以使用独立的外部 Flink 集群,运维人员对Flink 集群和 NiFi 集群进行管理。



