NiFi

Apache NiFiについて調べてみた

More than 1 year has passed since last update.


この記事はなに?

Apache NiFiは,システム間のデータフローを管理するために作られたデータフローオーケストレーションツールです.

GUI(Web画面)によって,データフローの設定,制御,監視ができることが大きな特徴です.

Project page: https://nifi.apache.org/index.html

Github: https://github.com/apache/nifi

現在,NiFiを使うプロジェクトにアサインされ,調査をしており,調べたことを少しづつメモしておこうと思います.


環境


  • Mac OS X 10.11.6

  • Apache NiFi 1.4.0

  • Java version 1.8.0_92


NiFiのインストール

https://nifi.apache.org/docs/nifi-docs/html/getting-started.html#downloading-and-installing-nifi

上記instructionに従い,Homebrewを使ってインストールする.

$ brew install nifi

とりあえずステータスチェックをしてみる.

$ nifi status

NiFi home: /usr/local/Cellar/nifi/1.4.0/libexec

Bootstrap Config File: /usr/local/Cellar/nifi/1.4.0/libexec/conf/bootstrap.conf

2017-09-30 21:48:15,792 INFO [main] org.apache.nifi.bootstrap.Command Apache NiFi is not running

ここでJava homeの値がおかしい場合は,先に環境変数等で適切に記述する必要がある.

NiFi homeが,NiFiが用いるルートディレクトリ.

NiFiを起動してみる.

$ nifi start

Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_92.jdk/Contents/Home
NiFi home: /usr/local/Cellar/nifi/1.4.0/libexec

Bootstrap Config File: /usr/local/Cellar/nifi/1.4.0/libexec/conf/bootstrap.conf

$ nifi status

Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_92.jdk/Contents/Home
NiFi home: /usr/local/Cellar/nifi/1.4.0/libexec

Bootstrap Config File: /usr/local/Cellar/nifi/1.4.0/libexec/conf/bootstrap.conf

2017-09-30 21:59:25,018 INFO [main] org.apache.nifi.bootstrap.Command Apache NiFi is currently running, listening to Bootstrap on port 59714, PID=13895

デフォルトでは,localhostの8080番がNiFiのWeb UIに割り当てられるので,http://localhost:8080/nifiにブラウザからアクセスすることで,起動していることが確認できる.

Kobito.ESORtv.png


用語

最低限これぐらいは知っておくと良さそう.


  • FlowFile


    • NiFiが取り扱うデータの単位.AttributesContentからなる.

    • Attirbutes: 個々のFlowFileが持つ,key-valueベースのメタ情報.

    • Content: 扱うデータの本体.



  • Processor


    • 「FlowFileにどんな処理を施すか」を表す.

    • データフローを記述したグラフ(DAG)におけるノードに相当する.

    • NiFiに組み込まれているものに加え,自分で実装したものを新たに組み込むことも可能.



  • Relationship


    • 「Processorが行った処理に応じて,どのProcessorにどのFlowFileを届けるか」を表す.

    • データフローを記述したグラフにおけるエッジの属性に相当する.

    • 各Processorごとにあらかじめ定義されている.




触ってみる

とりあえず動かしてみたいだけなら,

Get Started: https://nifi.apache.org/docs/nifi-docs/html/getting-started.html

Hortonworks社による日本語チュートリアル: https://github.com/ijokarumawak/hdf-tutorials-ja/wiki/Ropes-of-Apache-NiFi%3A-Tutorial-1

あたりが参考になると思われる.

NiFiでデータフローを実現するための大きな流れとして,


  1. 目的に応じたProcessorを探し/実装し,キャンバス上に追加する

  2. Processor同士を結ぶ(各エッジについて,Relationshipを選択する)

  3. Processorを設定する(多くのProcessorにはPropertyの設定が必要)

  4. Processorを起動する

をする必要がある.

試しに,「各行がJSONになっているファイルを読み込んで,これを行単位で分割し,これをHTTPのPOSTパラメータとして送る」データフローを書いてみることとする.


Processorの配置

今回使うProcessorは,



  1. ListFile: ディレクトリを指定することで,そのディレクトリ中のファイルを検索する


  2. FetchFile: 指定したファイルの内容を取得する


  3. SplitText: ファイルを分割する


  4. InvokeHTTP: HTTPアクセスを行う

の4つ.

nifi1.png

上のボタンを押してキャンバス上にドラッグ&ドロップすると,

Kobito.x6pAlz.png

上のように,追加したいProcessorを選択する画面が現れる.

Kobito.gS6hdQ.png

ここで,ListFileを選んで,ADDを押すと,

Kobito.bIIoU9.png

Processorが配置される.

同様に,他のProcessorについても配置する.

Kobito.4ACm7G.png


Processorを結ぶ

Kobito.uY6sos.png

のような矢印が出ている状態でProcessor同士をドラッグ&ドロップすると,Processor同士を線で結ぶことができる.

Kobito.Uuypxp.png

For Relationshipの欄には,どのようなRelationshipでProcessorを結ぶかを指定する.

ここでは,successを指定する.

Kobito.L1ONFy.png

successのRelationshipで結べたことが確認できる.

同様に,他のProcessorも結ぶ.

Kobito.uiAgS2.png


Processorを設定する

このままでは,どのProcessorにも設定値がないので動作しない.

Processorを右クリックし,Configureをクリックすることで,Processorの設定を行うことができる.

Kobito.eGVUEF.png

ここでは,PROPERTIESタブを選択し,Input Directoryに,ファイルを検索したいディレクトリのパスを入力する.

Kobito.469RXD.png

Kobito.2dsZwj.png

先ほどは,ListFileのProcessorに黄色い「注意」のマークがついていたが,これが,赤い「停止」のマークに変わっていることがわかる.

これで,このProcessorについては,起動準備ができたことになる.

「注意」のマークにマウスカーソルを合わせると,何が起動条件として満たされていないのかが表示されるので,参考にするとよい.

Kobito.rGVoj8.png

基本的に,すべての入力必須なPropertyは入力されていなければならず,また,Relationshipについては,他のProcessorと結んであるか,または「どことも結ばない」ことを明示する必要が有ることに注意.

「どことも結ばない」ことを明示する場合は,SETTINGSタブのAutomatically Terminate Relationshipから選択する.

Kobito.lFO8Ai.png

同様に,他のProcessorについても設定を行う.

Kobito.GOXGWd.png

(今回,異常系については省略しているが,実際のデータフローでは,失敗時の処理も記述すべきである.)


Processorを起動する

Kobito.Bqzk1Y.png

上のように,起動したいProcessorを選択した上で,「再生」ボタンを押すことで,Processorを起動できる.

Kobito.T4fwaa.png

実際のデータの流れを追いたい時は,Data Provenanceを用いるとよい.

例えば,SplitTextの処理を追いたい場合は,

Kobito.P4tgWR.png

のように,SplitTextのメニューからData Provenanceを選択する.

Kobito.Un9hww.png

上の画面で,SplitTextを通過したデータの一覧を見ることができる.

実際のデータの内容を確認したい時は,一番左の「i」ボタンを押し,CONTENTタブから,VIEWボタンを押す.

Processorへの入力,出力両方のデータが見られる.

Kobito.IijGnU.png

ちなみに,InvokeHTTPの方の入力データを見てみると,ちゃんと行単位でデータがsplitされていることが確認できる.

Kobito.PPbL4x.png

Kobito.o9jNOk.png