この記事はなに?
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のインストール
上記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
にブラウザからアクセスすることで,起動していることが確認できる.
用語
最低限これぐらいは知っておくと良さそう.
- FlowFile
- NiFiが取り扱うデータの単位.
Attributes
とContent
からなる. - Attirbutes: 個々のFlowFileが持つ,key-valueベースのメタ情報.
- Content: 扱うデータの本体.
- NiFiが取り扱うデータの単位.
- 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でデータフローを実現するための大きな流れとして,
- 目的に応じたProcessorを探し/実装し,キャンバス上に追加する
- Processor同士を結ぶ(各エッジについて,Relationshipを選択する)
- Processorを設定する(多くのProcessorにはPropertyの設定が必要)
- Processorを起動する
をする必要がある.
試しに,「各行がJSONになっているファイルを読み込んで,これを行単位で分割し,これをHTTPのPOSTパラメータとして送る」データフローを書いてみることとする.
Processorの配置
今回使うProcessorは,
-
ListFile
: ディレクトリを指定することで,そのディレクトリ中のファイルを検索する -
FetchFile
: 指定したファイルの内容を取得する -
SplitText
: ファイルを分割する -
InvokeHTTP
: HTTPアクセスを行う
の4つ.
上のボタンを押してキャンバス上にドラッグ&ドロップすると,
上のように,追加したいProcessorを選択する画面が現れる.
ここで,ListFile
を選んで,ADD
を押すと,
Processorが配置される.
同様に,他のProcessorについても配置する.
Processorを結ぶ
のような矢印が出ている状態でProcessor同士をドラッグ&ドロップすると,Processor同士を線で結ぶことができる.
For Relationship
の欄には,どのようなRelationshipでProcessorを結ぶかを指定する.
ここでは,success
を指定する.
success
のRelationshipで結べたことが確認できる.
同様に,他のProcessorも結ぶ.
Processorを設定する
このままでは,どのProcessorにも設定値がないので動作しない.
Processorを右クリックし,Configure
をクリックすることで,Processorの設定を行うことができる.
ここでは,PROPERTIES
タブを選択し,Input Directory
に,ファイルを検索したいディレクトリのパスを入力する.
先ほどは,ListFile
のProcessorに黄色い「注意」のマークがついていたが,これが,赤い「停止」のマークに変わっていることがわかる.
これで,このProcessorについては,起動準備ができたことになる.
「注意」のマークにマウスカーソルを合わせると,何が起動条件として満たされていないのかが表示されるので,参考にするとよい.
基本的に,すべての入力必須なPropertyは入力されていなければならず,また,Relationshipについては,他のProcessorと結んであるか,または「どことも結ばない」ことを明示する必要が有ることに注意.
「どことも結ばない」ことを明示する場合は,SETTINGS
タブのAutomatically Terminate Relationship
から選択する.
同様に,他のProcessorについても設定を行う.
(今回,異常系については省略しているが,実際のデータフローでは,失敗時の処理も記述すべきである.)
Processorを起動する
上のように,起動したいProcessorを選択した上で,「再生」ボタンを押すことで,Processorを起動できる.
実際のデータの流れを追いたい時は,Data Provenanceを用いるとよい.
例えば,SplitText
の処理を追いたい場合は,
のように,SplitText
のメニューからData Provenance
を選択する.
上の画面で,SplitText
を通過したデータの一覧を見ることができる.
実際のデータの内容を確認したい時は,一番左の「i」ボタンを押し,CONTENT
タブから,VIEW
ボタンを押す.
Processorへの入力,出力両方のデータが見られる.
ちなみに,InvokeHTTP
の方の入力データを見てみると,ちゃんと行単位でデータがsplitされていることが確認できる.