今回は以前別の記事で紹介したApache NiFiについて、通常とは違う処理エンジンとして実装されているStatelessエンジンについて簡単に紹介します。
Apache NiFiについて紹介した記事は以下のリンクからどうぞ。 blog.jbs.co.jp
NiFi Statelessとは
バージョン1.10.0で実装された機能で、デフォルトのNiFiランタイムとは別に開発された軽量なStatelessランタイムを使用して実行され、パフォーマンス/効率/スケーラビリティが非常に良いものとなっています。
初期段階だと、別のバイナリを起動して動かさなければいけない等、使用しにくいところがあったのですが、NiFiがアップデートされるにしたがってどんどん使いやすくアップデートされていっています。
NiFI Statelessの特徴
NiFi Statlessには以下の様な特徴があります。
- ディスク上のリポジトリを必要とせず、データは基本的にメモリ上に乗っている
- ディスク上に永続化されていないため、KafkaのExactly Onceのようなデータを永続化されたくない仕組みにも使用することが可能
- 通常のNiFiエンジンとは別のエンジンのため、NiFiエンジン上で動作する別のフローの動作によるリソース競合の影響を受けにくい
- ディスク上に永続化されていない為、Statelessで実行されているフロー上での処理中にNiFiに障害が発生し落ちてしまった場合、復旧ができない
NiFI Statelessのメリットデメリット
| デフォルト | Stateless | |
|---|---|---|
| メリット | ディスクに永続化されているため データの損失が発生しづらい |
ディスクへの書き込みがボトルネックにならず 動作が高速 |
| デメリット | ディスクへの書き込みが発生するため ボトルネックになり性能が出ない場合がある |
データの損失が発生する可能性がある |
NiFi Statelessの使い方
今回使用した環境は、Windows上で以下のバージョンのNiFiを実行して確認しています。
- NiFi 1.24.0
- NiFi 2.0.0-M2
NiFi 1.xとNiFi 2.xでStatelessでの実行方法が違うため、それぞれの手順を紹介します。
NiFi 1.x
- まず、ProcessGroupを配置して、その中にStatelessエンジンで動かしたいフローを構築します。

ProcessGroup 
サンプルフロー - ProcessGroupを右クリックして、「Download flow definition」内の項目をクリックしてDataflowファイルをダウンロードします。

Dataflowファイルダウンロード - 「ExecuteStateless」プロセッサを配置します。

ExecuteStatelessプロセッサ - ダウンロードしたファイルのパスをセットし、「Content Storage Strategy」でContent(Flowfileのデータ)をメモリに乗せるかディスクに乗せるかを設定します。

ExecuteStateless設定画面 - 「ExecuteStateless」プロセッサをStartします。

ExecuteStatelessプロセッサ Start状態
NiFi 2.x
NiFi 2.xでは、ProcessGroupから実行エンジンを選択するだけで、Statelessで実行することができます。
- Statelessで実行したいProcessGroupを右クリックして、Configureをクリックします。

ProcessGroup NiFi 2.x 
ProcessGroup NiFi 2.x メニュー - 「Execution Engine」の項目をStatelessに設定します。
デフォルトでは親ProcessGroupの実行エンジンの設定を継承する設定となっています。
ProcessGroup設定画面 エンジン選択 
ProcessGroup設定画面 エンジン選択後 - ProcessGroupを右クリックしてStartします。

ProcessGroup NiFi 2.x Start
まとめ
以上の手順で、NiFi statelessを使用することができます。
これまでのNiFiエンジンと比べてメリットデメリットありますが、うまく使えばパフォーマンス改善にも使用できそうな機能です。
是非触ってみてください。