Kekeの日記

エンジニア、読書なんでも

Apache Nifiをmacで10分データフローを構築

image.png

本記事について

勉強不足の甲斐もあって、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 にアクセスしてみましょう。 以下のような画面をみるかと思います。

スクリーンショット 2018-08-22 14.12.39.png

注意点としては、**すでにPort番号80xxを使っていた場合でもerrorは出ないので、Portが空いているかチェックしてから起動するようにしましょう。

UIの各コンポーネントの名前は、参考文献から拝借してきました。

image.png

特に重要なのは、Components ToolbarOperate Palletteです。

ここからは実際に概念が重要となるために少し解説します。

Apache Nifiの専門用語

用語  説明
Processor Nifi内でFlowFileで作成、送信、受信、変換、ルーティング、分割などするコンポーネント
FlowFile Nifiで管理するシステム間で移動するオブジェクトを表現する。ユーザーの一つ一つのデータである。二つの構成要素があって、実際のデータであるContentとメタデータであるkey:valueである。
FlowFileProcessor データのルーティング、変換、停止など実際の処理を行うものである。 
Connection プロセッサー間で接続を提供する。キューで動作する。 
Flow Controller スレッドをどのように接続して、管理するかをメンテナンスする。 ブローカーとして動作する。
Process Group プロセスの抽象的の集合ある。 

Apache Nifiのアーキテクチャとコンセプト

Nifiのアーキテクチャは以下のようになっています。

image.png

簡単に解説すると

  • Web Server: HTTPで操作可能なAPIを提供する
  • Flow Controller: 操作の脳である。
  • Flowfile Repository: Nifiがフローの中で与えられたFlowfileを状態を管理する場所
  • Content Repository: Flowfileの実際のバイトが保存される場所である。
  • Provenance Repository: 来歴がすべて保存されている場所である。

大体のところは解説しおえたので、実際にデータフローを作成してみます。

Processorの作成

Processorボタンをカンバスにドラッグして作成を始めます。

スクリーンショット 2018-08-22 14.38.34.png

すると以下のような画面がでるので、Filterの中でGetFileと打ってください。

スクリーンショット 2018-08-22 14.40.19.png

すると以下のように作成することができます。

スクリーンショット 2018-08-22 14.43.08.png

GetFileとは、ローカルからファイルを取得して、削除します。 なので、これからは特に間違って設定しないように注意しましょう。

実際にProcessorは定義できたのですが、何も設定はしていません。 Configure Processorで定義しましょう。設定は

  • カンバス内のProcessorをダブルクリック
  • カンバス内のProcessorをクリックした後、Operator Palleteで歯車のアイコンを押す

の二通りがあります。

スクリーンショット 2018-08-22 14.50.08.png

以下のように画面がでればおっけいです。

スクリーンショット 2018-08-22 14.51.50.png

詳細は公式ページのUser Guideをご覧ください。

特に使うまでの設定というと、Propertiesタグしか必要ありません。 以下の画面で設定していきます。

スクリーンショット 2018-08-22 14.54.49.png

太文字の部分は、必須プロパティであり、それ以外はオプショナルです。

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 $_

そして、プロパティを設定しました。

スクリーンショット 2018-08-22 16.01.04.png

もうひとつProcessorを作成する

データを特定のディレクトリから取得するGetFile Processorを定義したあと、「そのデータをどのように使うのか」を考えます。

ここでは、LogAttributeというFileFlowを出力するProcessorを作成します。

作成のステップは先ほどと同様です。

スクリーンショット 2018-08-22 16.08.13.png

Connectionを作る

Processorができたら、Connectionを作っていきます。 先ほど作成したProcessorはホバーすると緑色の矢印のアイコンが出るかと思います。

それを二つのProcessorの間でドラッグして接続します。

すると以下のようなConnectionの設定ファイルがでるでしょう。

スクリーンショット 2018-08-22 16.11.49.png

特にSETTIGSが重要です。 BackPressureでは、Schedularがジョブを管理する中で、どのくらいキューがいっぱいになったら割り振らないかを設定できます。

右にはAvailable Prioritizersでキューがどの順番で動作するかを設定することができます。

Addを押すと、以下のようにできているのがわかります。

スクリーンショット 2018-08-22 16.18.29.png

見てもらうとわかるのですが、Status Barに赤で四角のアイコンが出たと思います。 しかし、LogAttributeはデータが出る先としては何も接続されていないです。

なので、設定をAuto Terminateに設定してあげて、Flowfileの終点であることを示さなければなりません。

スクリーンショット 2018-08-22 17.00.49.png

すると今までLogAttributeは黄色の三角でしたが、赤い四角に変わっています。

スクリーンショット 2018-08-22 17.01.56.png

データフローを開始させる

Startを押すことで開始させることができます。

スクリーンショット 2018-08-22 17.03.41.png

開始させると以下のようになります。

スクリーンショット 2018-08-22 17.05.46.png

しかし、まだGetFileが対象としているディレクトリに何もファイルが存在しないので、何もなりません。

試しに二つのファイルを作成しました。

echo "a b c" > input_a.txt 
echo "d e f" > input_b.txt

空ファイルで2回ほど試したのでOutが4となっていますが、ただしく動作しています。

スクリーンショット 2018-08-22 17.12.36.png

データの来歴

データの来歴は右上のハンバーガーメニュー > Data Provenance で見ることができます。

スクリーンショット 2018-08-22 17.15.28.png

まとめ

今回は以上となります。

まとめとして、

  • 10分あればワークフローを完全に定義できよ
  • ほぼ完全にGUIなのでわかりやすい
  • 宣言に書けないか調査中

参考文献