Apache Nifiをmacで10分データフローを構築
本記事について
勉強不足の甲斐もあって、Apache Kafka, Flink, Storm, Heron...など聞くだけでいうと、どれも同じではないのか?って疑問に持ちました。
これまで、少しづつ手元で動かしてみて、包括的経験として積み重ねています。
その中でも、少し他のと異なるようなApache Nifiについて調査しようかなと思っています。
Apache Nifiとは
システム間のデータフローを自動的に構築塗るものです。
また、以下のような特徴を持っています。
- WebベースなUI
- 高い設定性
- データ起源の管理性
- 高い拡張性
- セキュア
つまり、UIでデータフローを定義でき、いろんなことができる。というわけです。
コンセプト
どのサービスや言語を使いとしても、コンセプトを捉えることが非常に重要となります。
ここではFile Based Programmingと比較しながら、解説します。
MacにApache Nifiを入れてみる
まず、定番のbrew search
をして検索をかけます。
brew search nifi ==> Formulae nifi nifi-registry ==> Casks dictunifier unified-remote
すると存在していたので、インストールします。
brew install nifi
バージョンはそれぞれだとは思いますが、私の場合は/usr/local/Cellar/nifi/1.7.1
にインストールされました。
設定ファイルがあるディレクトリまで移動します。
cd /usr/local/Cellar/nifi/1.7.1/libexec
ファイル構成は以下の通りです。
. ├── bin ├── conf ├── docs └── lib
役割としては以下のようになっています。
ファイル名 | 役割 |
---|---|
bin |
実行ファイルなど |
conf |
設定ファイル |
docs |
ドキュメント |
lib |
ライブラリなど |
特に大事なのは設定ファイルであるconf
です。
ひとまず、あとから説明するので設定は置いときます。
conf ├── authorizers.xml ├── bootstrap-notification-services.xml ├── bootstrap.conf ├── logback.xml ├── login-identity-providers.xml ├── nifi.properties ├── state-management.xml └── zookeeper.properties
起動させる
以下のコマンドを叩いて起動させてください。
bin/nifi start
コマンドがわからなければ
bin/nifi help =>Usage nifi {start|stop|run|restart|status|dump|install}
とすると返っていきます。他のApache Stormなどと比べると淡々と返ってくる印象があります。
二つの起動方法があって
start
: バックグラウンドで実行される。run
: バックグランドではなく実行されます。
私はバックグラウンドで実行させました。
bin/nifi start Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home NiFi home: /usr/local/Cellar/nifi/1.7.1/libexec Bootstrap Config File: /usr/local/Cellar/nifi/1.7.1/libexec/conf/bootstrap.conf
停止させるには
start
で起動した場合:Control + c
run
で起動した場合:bin/nifi stop
と叩く。
です。
また、様子は以下のコマンドで確認できます。
bin/nifi status
Web UIで確認する
Web UIはデフォルトではポートは8080
になっています。
conf/nifi.properties
の中の以下の場所で変更することができます。
私の場合は、8080
はApache StormやVue.jsなどよく使うアプリケーションで使うので8086
に変更しました。
... # web properties # nifi.web.war.directory=./lib nifi.web.http.host= # nifi.web.http.port=8080 nifi.web.http.port=8086 nifi.web.http.network.interface.default= nifi.web.https.host= nifi.web.https.port= nifi.web.https.network.interface.default= nifi.web.jetty.working.directory=./work/jetty nifi.web.jetty.threads=200 nifi.web.max.header.size=16 KB nifi.web.proxy.context.path= nifi.web.proxy.host= ...
そして http://localhost:8086/nifi にアクセスしてみましょう。 以下のような画面をみるかと思います。
注意点としては、**すでにPort番号80xx
を使っていた場合でもerror
は出ないので、Portが空いているかチェックしてから起動するようにしましょう。
UIの各コンポーネントの名前は、参考文献から拝借してきました。
特に重要なのは、Components ToolbarやOperate Palletteです。
ここからは実際に概念が重要となるために少し解説します。
Apache Nifiの専門用語
用語 | 説明 |
---|---|
Processor | Nifi内でFlowFileで作成、送信、受信、変換、ルーティング、分割などするコンポーネント |
FlowFile | Nifiで管理するシステム間で移動するオブジェクトを表現する。ユーザーの一つ一つのデータである。二つの構成要素があって、実際のデータであるContentとメタデータであるkey:valueである。 |
FlowFileProcessor | データのルーティング、変換、停止など実際の処理を行うものである。 |
Connection | プロセッサー間で接続を提供する。キューで動作する。 |
Flow Controller | スレッドをどのように接続して、管理するかをメンテナンスする。 ブローカーとして動作する。 |
Process Group | プロセスの抽象的の集合ある。 |
Apache Nifiのアーキテクチャとコンセプト
Nifiのアーキテクチャは以下のようになっています。
簡単に解説すると
- Web Server: HTTPで操作可能なAPIを提供する
- Flow Controller: 操作の脳である。
- Flowfile Repository: Nifiがフローの中で与えられたFlowfileを状態を管理する場所
- Content Repository: Flowfileの実際のバイトが保存される場所である。
- Provenance Repository: 来歴がすべて保存されている場所である。
大体のところは解説しおえたので、実際にデータフローを作成してみます。
Processorの作成
Processorボタンをカンバスにドラッグして作成を始めます。
すると以下のような画面がでるので、Filter
の中でGetFile
と打ってください。
すると以下のように作成することができます。
GetFileとは、ローカルからファイルを取得して、削除します。 なので、これからは特に間違って設定しないように注意しましょう。
実際にProcessorは定義できたのですが、何も設定はしていません。
Configure Processor
で定義しましょう。設定は
- カンバス内のProcessorをダブルクリック
- カンバス内のProcessorをクリックした後、Operator Palleteで歯車のアイコンを押す
の二通りがあります。
以下のように画面がでればおっけいです。
詳細は公式ページのUser Guideをご覧ください。
特に使うまでの設定というと、Properties
タグしか必要ありません。
以下の画面で設定していきます。
太文字の部分は、必須プロパティであり、それ以外はオプショナルです。
Producerを設定する
必須項目を設定していきます 各設定項目には、?でヘルプが付いているので、適宜参照するといいでしょう。 デフォルトで設定されている項目はあまりいじるぢつようなないと思いますが、以下の項目だけ設定しておきましょう。
Input Directory
: 入力のディレクトリFile Filter
:Input Directory
の中でどのファイルをマッチさせるかを正規表現で描くことができる
ここで注意して欲しい点がInput Directory
です。
ここには絶対パスを書くか、最初に表示されたNifi Home
からの相対パスを描いてください、
私は私のNifi Homeである/usr/local/Cellar/nifi/1.7.1/libexec
以下にサンプルファイルを作成しました。
mkdir getfile-example cd $_
そして、プロパティを設定しました。
もうひとつProcessorを作成する
データを特定のディレクトリから取得するGetFile Processor
を定義したあと、「そのデータをどのように使うのか」を考えます。
ここでは、LogAttribute
というFileFlowを出力するProcessorを作成します。
作成のステップは先ほどと同様です。
Connectionを作る
Processorができたら、Connectionを作っていきます。 先ほど作成したProcessorはホバーすると緑色の矢印のアイコンが出るかと思います。
それを二つのProcessorの間でドラッグして接続します。
すると以下のようなConnectionの設定ファイルがでるでしょう。
特にSETTIGS
が重要です。
BackPressureでは、Schedularがジョブを管理する中で、どのくらいキューがいっぱいになったら割り振らないかを設定できます。
右にはAvailable Prioritizers
でキューがどの順番で動作するかを設定することができます。
Addを押すと、以下のようにできているのがわかります。
見てもらうとわかるのですが、Status Barに赤で四角のアイコンが出たと思います。
しかし、LogAttribute
はデータが出る先としては何も接続されていないです。
なので、設定をAuto Terminate
に設定してあげて、Flowfileの終点であることを示さなければなりません。
すると今までLogAttribute
は黄色の三角でしたが、赤い四角に変わっています。
データフローを開始させる
Start
を押すことで開始させることができます。
開始させると以下のようになります。
しかし、まだGetFile
が対象としているディレクトリに何もファイルが存在しないので、何もなりません。
試しに二つのファイルを作成しました。
echo "a b c" > input_a.txt echo "d e f" > input_b.txt
空ファイルで2回ほど試したのでOut
が4となっていますが、ただしく動作しています。
データの来歴
データの来歴は右上のハンバーガーメニュー > Data Provenance で見ることができます。
まとめ
今回は以上となります。
まとめとして、
- 10分あればワークフローを完全に定義できよ
- ほぼ完全にGUIなのでわかりやすい
- 宣言に書けないか調査中