Apache NiFiで基本のデータフローを作成するには？

[前回](http://qiita.com/kimutansk/items/a083fc963fbe31068cf8)にApache NiFiの起動を行うことが出来たので、今回は実際にNiFiを使用して小さなデータフローを作成してみます。

## 基本の画面構成
まず、改めてNiFiの画面を見てみます。
実際にデータフローを配置するキャンバス部の上部に、実際に画面を配置するコンポーネント（赤枠）、コンポーネントを操作するボタン（青枠）、画面上の動作状況を表示するバー（緑枠）が表示されている構成になっています。
<img alt="NiFi画面概要" src="https://qiita-image-store.s3.amazonaws.com/0/9616/201fe25d-5e8b-774e-1c71-09fcc0906c54.jpeg">

## 基本の操作方法
では、実際に上記の画面を使ってデータフローを配置していきます。
ただ、マニュアルをQiita上で書くわけにもいかないため、やる操作の基本的な内容を流していく形になります。
### Processorの配置
NiFiではデータを外部から取得したり、整形したり、外部に出力を行うコンポーネントのことを「Processor」と呼びます。
Processorは赤枠の左端の矢印が回転しているアイコンが該当します。
実際にProcessorをキャンバス上に配置する場合にはProcessorアイコンをドラッグしてキャンバス上に持ってきます。
すると、下記のようにどんなProcessorを配置するか確認するウィンドウが表示されます。
![NiFi20.JPG](https://qiita-image-store.s3.amazonaws.com/0/9616/4c03f4e9-095d-3c0d-6bd4-60fe7abf471f.jpeg)

とりあえず、簡易に出来そうなTwitterを取得するProcessor（GetTwitter）を検索で絞り込み、配置します。
<img alt="Processor配置確認(Twitter)" src="https://qiita-image-store.s3.amazonaws.com/0/9616/7b6e82ec-043d-2868-0057-55bd4602c54b.jpeg">

TwitterのProcessorは下記のようにメニューが存在しますが、とりあえずはそのままで進めます。
![NiFi03.JPG](https://qiita-image-store.s3.amazonaws.com/0/9616/0e81ce19-08f6-fd3c-9569-0540bfe10b7d.jpeg)

次に、簡単なデータ出力先として、ファイル出力のProcessor(PutFile)を配置します。
![NiFi04.JPG](https://qiita-image-store.s3.amazonaws.com/0/9616/040c8b0b-285a-d309-26a6-b99d0af4ba54.jpeg)

### Processor同士の接続
Processorを配置したので、Processor間をドラッグしてみると、下記のようにConnectionの作成ウィンドウが表示されるため、Addボタンを押下して追加します。
![NiFi06.JPG](https://qiita-image-store.s3.amazonaws.com/0/9616/75564d29-2786-a72f-85cf-8091e63d9106.jpeg)

追加時に下記のような設定も可能ですが、詳細はわからないため今はスキップします。
![NiFi07.JPG](https://qiita-image-store.s3.amazonaws.com/0/9616/753285b9-753c-40df-b985-f2bd1030a16f.jpeg)

### Processorの動作開始（失敗）
Processorを配置して、Connectionでつないだため、Processorを選択して開始ボタン（青枠の右矢印ボタン）を押下すると、下記のように正常なProcessorが存在しない旨のエラーが。
ですので、実際にProcessorの設定を確認してみることにします。
![NiFi08.JPG](https://qiita-image-store.s3.amazonaws.com/0/9616/bc099702-114a-60c4-1274-c448a564f8d7.jpeg)

### Processorの設定項目エラー表示
実際にProcessorに黄色い三角のエラー表示があるため、エラー内容を確認してみます。
エラー内容自体はProcessorにマウスオーバーすると下記のように表示されるため、とりあえずこれを解消すればいい模様。
![NiFi09.JPG](https://qiita-image-store.s3.amazonaws.com/0/9616/7e3c4e68-61ee-654d-89d7-11b8ad7e6427.jpeg)
![NiFi10.JPG](https://qiita-image-store.s3.amazonaws.com/0/9616/7f26d02f-31e2-e93e-bb36-a571cd851512.jpeg)

Twitter側はDeveloper登録をして下記画面のようにKeyとTokenを設定します。
![NiFi11.JPG](https://qiita-image-store.s3.amazonaws.com/0/9616/cd4ff072-8954-b385-2c13-9e9036ebb74a.jpeg)
あとはSchedulingも下記のようにしておきます。（設定することの意味は現状不明）
![NiFi03.JPG](https://qiita-image-store.s3.amazonaws.com/0/9616/1e91a349-aea9-daff-02f3-d9aa8b350b52.jpeg)

同様に、PutFile側も「Relationship Success」「Relationship Failure」にチェックを入れ、「Properties＞Directory」に「/temp/NiFi」ディレクトリを設定しておきます。

そうすると、下記のようにエラーが解消され、「停止状態」にあることが表示されるようになります。
![NiFi12.JPG](https://qiita-image-store.s3.amazonaws.com/0/9616/3843ac3d-b850-07ba-a6f3-4a2d3efafda2.jpeg)

### Processor動作開始
エラーが解消できたので、次は実際に動作開始です。
GetTwitterのProcessorとPutFileのProcessorを選択し、画面上部の開始ボタンを押下します。
すると、下記のように実際に動作が開始され、In/Out値等が更新されていきます。
![NiFi14.JPG](https://qiita-image-store.s3.amazonaws.com/0/9616/a8a7678e-3693-a6dc-b1eb-eb50db98a85f.jpeg)

実際に、PutFileに設定した「/temp/NiFi」ディレクトリ配下を見てみると、下記のように1つぶやきごとにファイルが生成されています。
![NiFi15.JPG](https://qiita-image-store.s3.amazonaws.com/0/9616/9e9c244d-2358-9fa5-9497-6682e02782d2.jpeg)
中身はJSON形式のTwitterつぶやき情報となっていました。（これは当たり前か）

### 一部のProcessorのみの実行
とりあえず確認できたので全体を停止してみると、下記のようにConnection部にデータがキューイングされていることがわかります。
![NiFi16.JPG](https://qiita-image-store.s3.amazonaws.com/0/9616/9e6732e7-2dba-3ca8-687b-b25c48fccb2b.jpeg)
ですので、PutFileのみを開始してみると、下記のようにキューイングされたデータがファイルに出力されることが確認できました。
![NiFi17.JPG](https://qiita-image-store.s3.amazonaws.com/0/9616/494b1c89-dbe0-c88c-586c-d139d08774e1.jpeg)
キューの最大サイズ等も定義されているため、これでBackPressureを実現している・・のでしょうか。
そのあたりはまたおいおい。

という流れで、Twitterからつぶやき情報を取得してファイルに出力するという非常に基本的なデータフローではありますが、画面から定義できることを確認できました。

## まとめ
- 基本的なフローをNiFiのUIから定義できることを確認しました
    - NiFiはProcessorを処理単位とし、Connectionでつなぐことでデータフローを実現する
    - Processorのエラー内容は画面から確認できる
- NiFiはConnectionにデータをキューイングすることが可能
    - 下流のProcessorを再開することで、キューイングされたデータを処理するといったことも可能

とりあえず、基本の一本は通ったので、次はNiFiのOverviewのページを見てみるか、それとももっと操作を試してみるか・・・
とまぁ、それは次回にでも。