当NiFi节点发生故障时的错误处理
当NiFi节点出现故障时的错误处理有两种模式。
1)来自外部的数据进入NiFi,例如Listen***系列。
2)NiFi内部的数据在处理器之间流动。
以下是两种模式的详细信息。
选项:数据从外部进入NiFi。
比如Listen***系。
我将Listen系的处理统一在NiFi的网络监听处理器机制中。
要说的是,如果NiFi的Listen系处理无法跟得上,数据就会溢出。
为了防止这种情况发生,需要进行NiFi的调优或者进行硬件扩展。
参考资料:
* Apache NIFI中的至少一次传递与仅一次传递语义
-
- NiFi/MiNiFi間のS2Sプロトコルでデータ伝送するなら、at least onceは問題無い。
-
- 更に、S2Sポートの後ろにDetectDuplicateを正しく使えば、Exactly onceも可能。
-
- それ以外のプロトコル、2-phase commitが対応出来るなら(例えばKafka)least onceは保証出来る
- ** support 2-phase commit未対応のプロトコル、例えばSyslog protocolなら、NiFiではleast onceの保証は出来ない、あくまでもat most onceレベル。
选项1:
模式2: NiFi内部数据在处理器之间流动
每个NiFi处理器都有一个事务。
GitHub网址:https://github.com/apache/nifi/blob/master/nifi-api/src/main/java/org/apache/nifi/processor/AbstractProcessor.java
public final void onTrigger(final ProcessContext context, final ProcessSessionFactory sessionFactory) throws ProcessException {
final ProcessSession session = sessionFactory.createSession();
try {
onTrigger(context, session);
session.commit();
} catch (final Throwable t) {
session.rollback(true);
throw t;
}
}
-
- Session is started
-
- Flow file is obtained
-
- Operations performed
-
- Flow file is transferred or removed
- Session is committed
如果从处理器A向处理器B传输数据时,处理器B(例如PutHDFS或PutFile)在处理过程中崩溃,
则不会进行提交。
重新启动后,会再次执行上次的操作,因此数据不会丢失。