こんにちは、システム開発課の田㞍です。
先日、社内勉強会にて、「Apache NiFi(アパッチ ナイファイ)」というデータフローツールについて発表しました。 今回の記事では、その発表内容を元に、Apache NiFiがどのようなツールで、どんな特徴を持っているのか、そして実際にデータ移行で使ってみた感想などをお伝えしたいと思います。
きっかけ
先日、業務でSQL ServerからPostgreSQLへデータを移行する機会がありました。その際、データコピーの仕組みとしてApache NiFiを活用したのが、このツールとの出会いです。
「NiFiって何?」という方もいらっしゃるかと思いますので、本記事がNiFiを知るきっかけになれば幸いです。
Apache NiFiとは?
Apache NiFiを一言で表すなら、 「GUIでデータの流れを簡単に作成・実行・監視できるツール」 です。
プログラミングのコードを書かなくても、マウス操作で「プロセッサ」と呼ばれる部品をキャンバスに配置し、それらを線(コネクション)でつなぐだけで、データの流れ(データフロー)を作ることができます。そして、作ったデータフローはボタン一つで実行開始できます。
NiFiの主な特徴
NiFiには多くの魅力的な特徴がありますが、特に注目すべき点をいくつかご紹介します。
- GUIベースの直感的な操作性
ドラッグ&ドロップでコンポーネントを配置し、視覚的にデータフローを構築できます。 - 豊富な標準プロセッサ
データの取得、変換、加工、ルーティング、送信など、多種多様な処理に対応する「プロセッサ」と呼ばれる部品が、標準で約300種類も用意されています。これにより、コーディングなしで多くの一般的なデータ処理タスクを実現できます。 - 多様なシステムとの接続性
ファイルシステム、データベース 、Web API、メッセージキュー など、様々なシステムと容易に接続するためのプロセッサが提供されています。 - データの来歴追跡(Data Provenance)
NiFiを通過するデータ(FlowFile)が「いつ」「どこから来て」「どのような処理を施され」「どこへ送られたか」といった詳細な履歴を自動的に記録し、追跡・確認することができます。これはデバッグや監査において非常に強力な機能です。 - 視覚的な監視と管理
データフローのどこでデータが滞留しているか、どこでエラーが発生しているかなどを、GUI上でリアルタイムに一目で把握できます。キューのサイズや処理状況なども視覚的に確認可能です。
NiFiの歴史
NiFiは、元々アメリカ国家安全保障局(NSA: National Security Agency)が、2006年頃から「NiagaraFiles (ナイアガラファイルズ)」という名前で内部的に開発していたシステムです。この「NiagaraFiles」がNiFiの語源となっています。
その後、2014年にApache Software Foundationに寄贈され、オープンソースソフトウェアとして公開されました。そして、2015年にはApacheのトップレベルプロジェクトへと昇格し、現在も活発に開発が続けられています。
NiFiのデータフローを構成する3要素
NiFiのデータフローは、主に以下の3つのコアコンポーネントで構成されます。
FlowFile (フローファイル)
NiFiのデータフロー内で処理・転送されるデータの基本単位です。FlowFileは、以下の2つの主要な部分から構成されます。- コンテンツ (Content)
処理対象となる実際のデータそのものです。(例: テキストファイルの内容、画像データ、JSONオブジェクトなど) - 属性 (Attributes)
コンテンツに関するメタデータです。(例: ファイル名、サイズ、作成日時、処理の過程で付与された情報など)
このFlowFileが、プロセッサからプロセッサへと受け渡されながら、様々な処理を受けてシステム内を流れていきます。
- コンテンツ (Content)
Processor (プロセッサ)
FlowFileに対して実際のデータ処理を実行する機能部品です。データの「取得」「変換・加工」「送信」「ルーティング(振り分け)」など、様々な役割を持つプロセッサが用意されています。(例:「ファイルシステムからファイルを取得するGetFile
プロセッサ」「JSONの構造を変換するJoltTransformJSON
プロセッサ」「データベースにレコードを書き込むPutSQL
プロセッサ」など)Connection (コネクション)
プロセッサ間をつなぐデータの経路であり、キュー(データを一時的に溜めるバッファ)の役割も果たします。GUI上でプロセッサ間を線で結ぶことで作成され、どの処理の次にどの処理を行うかを定義します。 FlowFileはこのコネクションを通って次のプロセッサへ流れていきます。また、後続のプロセッサが処理しきれない場合、コネクションはFlowFileを一時的に溜めておくキューとしても機能し、データの損失を防いだり、処理速度の差を吸収したりする役割を持ちます。
これら3つの要素をGUI上で組み合わせていくことで、複雑なデータフローも視覚的に構築していくことができます。
簡単なデータフローの紹介
発表では、実際にNiFiを操作したり、事前に用意した簡単なデータフローの実行も行いました。ここではその概要をご紹介します。
作成したフローの概要
「特定のディレクトリにあるテキストファイルを読み込み、ファイル内の特定の文字列を別の文字列に置換して、処理後のファイルを別のディレクトリに新しいファイル名で保存する」というものです。
データフローのイメージ: 具体図
「作成したフローの概要」を実現するための処理の流れを、NiFiでどのように組み立てるのか、下の図を使って具体的に見ていきましょう。この図は、今回の目的を達成するための主要な4つの処理ステップを赤枠で示しています。
NiFiでは、これらのステップを「プロセッサ」と呼ばれる機能部品を組み合わせて実現します。今回のデモでは、具体的に以下の4つのプロセッサを使用しました。
GetFile
プロセッサ: 指定したディレクトリからファイルを取得します。ReplaceText
プロセッサ: 取得したファイル(FlowFile)の内容に対して、指定した文字列の置換処理を行います。UpDateAttribute
プロセッサ:置換処理後のファイル(FlowFile)のファイル名を任意のファイル名に変更をします。PutFile
プロセッサ: 置換処理後のファイル(FlowFile)を指定したディレクトリに保存します。
これらのプロセッサをキャンバスに配置し、それぞれをコネクションでつなぎ、各プロセッサに必要な設定(監視対象ディレクトリ、置換する文字列、出力するファイル名、出力先ディレクトリなど)を行うだけで、データフローが完成します。
実行ボタンを押すと、GetFile
プロセッサがファイルを検知し、FlowFileとしてReplaceText
プロセッサに渡され、そこで文字列が置換され、次にUpDateAttribute
プロセッサによってファイル名を変更し、最後にPutFile`プロセッサによって新しいファイルとして保存されることの確認が取れました。
NiFiを使ってみた感想
実際にデータ移行案件でNiFiを使ってみて感じたメリット、そして注意点やデメリットだと感じた点は以下の通りです。
■ メリット
- 基本的なフローは驚くほど簡単に作成可能
プロセッサを配置して線で繋ぐ、という直感的な操作で、専門的なプログラミング知識がなくても基本的なデータ連携フローを短時間で構築できました。 - リアルタイムな視覚的モニタリングが強力
データがどこで滞留しているか、どこでエラーが発生しているか、各プロセッサの処理状況などがGUI上でリアルタイムに視覚的に把握できます。これにより、問題発生時の原因特定が非常に容易でした。
■ デメリット / 注意点
- NiFi独自の概念や用語への慣れが必要
FlowFile、Processor、Controller Serviceなど、NiFi特有の概念や用語がいくつかあります。これらに慣れるまで、最初は少し学習時間が必要だと感じました。 - プロセッサの種類が多く、最初は迷うことも
約300種類ものプロセッサがあるため、やりたい処理に対してどのプロセッサを使うのが最適なのか、最初は選択に迷うことがあるかもしれません。ドキュメントを読んだり、実際に試してみたりする時間が必要でした。 - 複雑すぎる処理は設定が難しくなる可能性も
非常に複雑な分岐や、高度なデータ変換ロジックをNiFiのプロセッサの組み合わせだけで実現しようとすると、フローが複雑化し、設定や管理が難しくなる可能性も感じました。そのような場合は、カスタムプロセッサを作成したり、一部をスクリプト処理(例:ExecuteScript
プロセッサ)に任せたりするなどの工夫が必要になるかもしれません。
まとめ
Apache NiFiは、GUIで直感的にデータフローを設計・実行・監視できる非常に強力なツールです。
NiFiの強み
- ノーコード/ローコード開発
プログラミング知識が少なくても、迅速にデータ連携・ETL処理を実現できます。 - 豊富な機能と柔軟性
約300種類の標準プロセッサ、詳細なデータ来歴追跡、視覚的なモニタリング機能など、データ処理に必要な機能が充実しており、様々な要件に柔軟に対応可能です。 - 多様な接続先
データベース、ファイルシステム、API、メッセージキューなど、既存の様々なシステムと容易に連携できます。
今回のデータ移行作業では、NiFiのおかげで迅速かつ確実にデータを移行することができました。
もし皆さんの業務などで、システム間のデータ連携、データの収集・加工・配信といった課題をお持ちでしたら、Apache NiFiを選択肢の一つとして検討してみてはいかがでしょうか。