Apache NiFi を実際に使ってみる。ディレクトリ監視にトライ~。

f:id:ts0818:20190830142639p:plain

Apache NiFi のインストールはできたけど、何をしたら良いの?どうも、ボクです。

情弱なあたいは、今日も迷走するのであった...というわけで、今回は、実際にApache NiFi を使っていきたいと思います。

 

そして、まったく、関係ないけど、

www.itmedia.co.jp

 マイクロソフトは8月29日、人間のトッププレイヤーに匹敵する強さの麻雀AI「Suphx」(Super Phoenix、スーパーフェニックス)を開発したと発表した。国内最大級のオンライン麻雀サイト「天鳳」で、AIとして初めて十段に到達した。

マイクロソフトが麻雀AIを開発 「天鳳十段の実力」 - ITmedia NEWS

⇧  マイクロソフトが、麻雀AI を開発したそうな。スーパーフェニックスって...キン肉マンかいな!

麻雀AI か~、喋ったりするのかな?

「不合理こそ博打…それが博打の本質、博打の快感…不合理に身を委ねてこそギャンブル」

アカギ 名言集・ 格言│~最大級~

みたいなセリフも言ってくれたら面白いんですけどね。実際の麻雀でも喋ってる人いないですけどね、麻雀漫画のような名セリフを言って欲しいものです。

 

というわけで、Apache NiFi  にレッツトライ~。

 

Dockerでホストとゲストのディレクトリを共有してコンテナ起動

DockerコンテナでApache NiFi を利用していくのですが、 

ts0818.hatenablog.com

⇧  この記事で、Apache NiFiのDocker image のインストールが済んでる状態という前提で話を進めて参ります。

Docker とかもインストール済ということで。

そんじゃ、まずは、仮想マシンの起動まで。

f:id:ts0818:20190830155855p:plain

Apache NiFi のDocker image があることを確認し、

f:id:ts0818:20190830160123p:plain

そしたらば、ホストOS側に適当な作業用のディレクトリを作成で。

※ Docker ToolBoxを使っている場合は、Windowsでは、「C:\Users\」以下のディレクトリしかマウントできないらしいので要注意です。

yuis-programming.com

f:id:ts0818:20190830160746p:plain

そんでは、ホストOSとゲストOSのディレクトリをマウント(共有)して、コンテナを起動で。Windowsの場合、ホストディレクトリのパスの指定に要注意。私はハマりました(涙)。 

docker run --name [任意のコンテナ名] -p [ホストのポート]:[ゲストのポート] -d -v [ホストディレクトリの絶対パス]:[コンテナの絶対パス] [REPOSITORY:TAG] 

f:id:ts0818:20190831134037p:plain

そしたら、ゲストOS側のコンテナ内にアクセスし、ディレクトリが作成されてるか確認。

docker exec -it [コンテナ名] bash

f:id:ts0818:20190831132731p:plain
そしたらば、「/home/nifi/work/」に、「input」「output」ディレクトリを作成で。

f:id:ts0818:20190831134143p:plain

ホストOSとゲストOSのマウントが上手くいっている場合は、ホストOSのディレクトリ から、ゲストOSのディレクトリの内容が見えます。

f:id:ts0818:20190831133210p:plain

できました~。

 

Apache NiFi で Processor の作成

そも、Apache Nifi における Processor って何ぞ?

The core concepts of NiFi

NiFi’s fundamental design concepts closely relate to the main ideas of Flow Based Programming [fbp]. Here are some of the main NiFi concepts and how they map to FBP: 

f:id:ts0818:20190830170751p:plain

Apache NiFi Documentation

⇧  Apache NiFi の主要なコンセプトの1つである、「Process Group」に説明が。

A Process Group is a specific set of processes and their connections, which can receive data via input ports and send data out via output ports. In this manner, process groups allow creation of entirely new components simply by composition of other components.

Apache NiFi Documentation

なんでも、「Process Group」の定義 とは、

『入力ポートを介してデータを受信し、出力ポートを介してデータを送信できる、特定のプロセスとその接続のセットです。』

と言っているので、「Processor」は、個々の「Process」を作るものってことでしょうかね。

 

何でプロセッサーが必要かというと、

qiita.com

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

  1. 目的に応じたProcessorを探し/実装し,キャンバス上に追加する
  2. Processor同士を結ぶ(各エッジについて,Relationshipを選択する)
  3. Processorを設定する(多くのProcessorにはPropertyの設定が必要)
  4. Processorを起動する

をする必要がある.

Apache NiFiについて調べてみた - Qiita

⇧  上記サイト様によりますと、「Processor」ありき、と言っても過言ではないと。 

というわけで、ゲストOSに作成したディレクトリを監視するプロセッサーを作成で。

ホスト側のブラウザにアクセスし、「Processor」のアイコン f:id:ts0818:20190830173118p:plain をドラッグ&ドロップします。

f:id:ts0818:20190830173027p:plain

f:id:ts0818:20190830173503p:plain

そしたら、プロセッサーの作成ができますが、「Filter」って検索のところで、

f:id:ts0818:20190830174205p:plain

「listfile」って検索し、「ADD」で。

f:id:ts0818:20190830174038p:plain

追加されたプロセッサーを、ダブルクリックで。

f:id:ts0818:20190830174539p:plain

プロセッサーを編集できるようなるので、「PROPERTIES」タブを選択。

f:id:ts0818:20190830174750p:plain

「Property」が「Input Directory」ってなってる項目の「Value」ってところをクリックで。

f:id:ts0818:20190830175214j:plain

そしたら、入力ボックスが表示されるので、ゲストOS側に作成したディレクトリのパス「/home/nifi/work/input」を入力。「OK」で。

f:id:ts0818:20190830175442p:plain
そしたら、「APPLY」で。

f:id:ts0818:20190830175730p:plain

次に、もう1つプロセッサーを作成で。「FetchFile」を「ADD」で。

f:id:ts0818:20190830175905p:plain

そしたらば、「FetchFile」のプロセッサーをダブルクリックで。

f:id:ts0818:20190830180008p:plain

そしたらば、「ListFile」のプロセッサーにカーソルを持っていくと表示されるアイコンf:id:ts0818:20190830181011p:plainをドラッグし、

f:id:ts0818:20190830180921p:plain

「FetcFile」のプロセッサーにくっ付けます

f:id:ts0818:20190830180832p:plain

f:id:ts0818:20190830181131p:plain

そうすると、設定とかできるけど、今回はデフォルトの状態のまま、「ADD」で。

f:id:ts0818:20190830181302p:plain

 

そんでは、続きまして、ファイルを出力するプロセッサーの作成。

f:id:ts0818:20190831102711p:plain

「PutFile」プロセッサーが作成されるので、ダブルクリックで。

f:id:ts0818:20190831102749p:plain

「PROPERTIES」タブを選択し、「Property」の「Directory」という項目の「Value」のところをクリック。

f:id:ts0818:20190831103225j:plain

出力先に、作成しておいたディレクトリ「/home/nifi/work/output」のパスを指定し、「OK」で。

f:id:ts0818:20190831103429p:plain

「APPLY」で。

f:id:ts0818:20190831103750p:plain

そしたらば、「FetchFile」プロセッサーと「PutFile」プロセッサーを繋げましょう。

f:id:ts0818:20190831104028p:plain

「SUCCESS」にだけチェック。「ADD」で。

f:id:ts0818:20190831104124p:plain

そしたらば、「FetchFile」プロセッサーは、処理中に失敗した時の処理をどうするかを設定していなかったので、設定していきます。

「FetchFile」プロセッサーをダブルクリックし、

f:id:ts0818:20190831104254p:plain

「SETTINGS」タブを選択し、「Automatically Terminate Relationships」の「failure」「not.found」「permission.denied」にチェックし、「APPLY」で。

f:id:ts0818:20190831104403p:plain

そしたらば、「PutFile」プロセッサーをダブルクリックで。

f:id:ts0818:20190831104636p:plain

「PutFile」プロセッサーは、ファイルの出力を担うのと、後続のプロセッサーがないので、成功しても、失敗しても、単純に停止する設定します。

「Automatically Terminate Relationships」の「failure」「success」にチェックし、「APPLY」で。

f:id:ts0818:20190831104848p:plain

Apache NiFiのプロセッサーの準備は整いました。

f:id:ts0818:20190831105308p:plain

ゲストOSのコンテナ内に作成したディレクトリ「/home/nifi/work/input」に、適当なファイルを作成しておきます。

ちなみに、大きいサイズのファイル作成については、

qiita.com

⇧  上記サイト様が詳しいです。

www.koikikukan.com

Linux で空ファイルを作成は、上記サイト様が詳しいです。

今回は、vi エディターで作成しようと思ったけど、vi コマンドが入ってないらしい。なので、echo コマンドで。

f:id:ts0818:20190831135229p:plain

ファイルも作成できたので、ホスト側のブラウザに戻り、Shift押しながらクリックで、すべてのプロセッサープロセッサーのリレーションを全選択しましたら、

f:id:ts0818:20190831111838p:plain

「Operate」の開始ボタンf:id:ts0818:20190831112418p:plainをクリックで。

f:id:ts0818:20190831112238p:plain

f:id:ts0818:20190831135624p:plain

ゲストOSのコンテナ内のディレクトリ「/home/nifi/work/output」に、「/home/nifi/work/input/Dockerfile」がコピーされました。

f:id:ts0818:20190831135527p:plain


 ホストOS側からも確認ができました~。

f:id:ts0818:20190831135446p:plain

 

というわけで、なんとか、Apache NiFi でプロセッサーを使ってみることができました。勉強することがまた増えてしまった(涙)

今回はこのへんで。

 

 

NG集

 

そしたらば、ホストOS側に適当な作業用のディレクトリを作成で。

f:id:ts0818:20190830160746p:plain

そんでは、ホストOSとゲストOSのディレクトリをマウント(共有)して、コンテナを起動で。 

docker run --name [任意のコンテナ名] -p [ホストのポート]:[ゲストのポート] -d -v [ホストディレクトリの絶対パス]:[コンテナの絶対パス] [REPOSITORY:TAG] 

f:id:ts0818:20190830161139p:plain

そしたら、ゲストOS側のコンテナ内にアクセスし、ディレクトリが作成されてるか確認。

docker exec -it [コンテナ名] bash

f:id:ts0818:20190831132731p:plain

 

そしたらば、「/home/nifi/work」内に、「input」「output」というディレクトリを作成しようとしたら、ディレクトリを作成できる権限がないって怒られた...

f:id:ts0818:20190830165300p:plain

rootユーザーになろうにも、Dockerコンテナ(Apache NiFi)のRootユーザーのユーザーとパスワードが分からんのだが...

stackoverflow.com

⇧ 上記サイト様によりますと、 

docker exec -u 0 -it [コンテナ名] bash

でいけるらしい。一旦、exit でコンテナから抜けて、再度、コンテナへログイン。

f:id:ts0818:20190830165414p:plain

root ユーザーでログインできました~。

改めて、ディレクトリを作成で。

f:id:ts0818:20190830165557p:plain

 

ですが、そもそも、「docker exec -u 0 -it [コンテナ名] bash」を使用しないといけない状態が間違っているようです。

どうやら、ホストOSと、ゲストOSのマウントが上手くいってないらしい?

yuis-programming.com

 “docker tool box”の場合,//c/Users/以下ディレクトリでないとマウントできない.

“/c/docker”のようなcドライブ直下のフォルダを-vで参照してもダメということ.
ただ以上の方法でもボリュームは存在していてなんとなく出来てる感があるので余計混乱する.
“docker for windows”と”docker toolbox”の明確な差異を知ってからは理解が早かった.

 

docker: windowsホストディレクトリがマウント出来ない件 | yuipro

 ⇧  上記サイト様によりますと、「//c/Users/」以下のディレクトリじゃないと駄目らしい...まじか...最初からやり直しか。

っていうか、「c」ドライブは、小文字にしないと駄目らしい、むっちゃハマった...

というわけで、Docker ToolBox を使っている皆様、ディレクトリのマウントの際はお気をつけあれ。

 

 

時間の都合上、一旦、仮想マシンを停止し、翌日へ持ち越しした時の内容。

翌日。仮想マシンを起動し、

f:id:ts0818:20190831100333p:plain

停止してしまったコンテナを再起動しようとしてハマる。

f:id:ts0818:20190831100545p:plain

どうやら、新しいコマンドでないと動かないらしい?

github.com

@akimd yes the container is still there, but it cannot be restarted using docker start , expected behaviour from the documentation, as outlined above.

Also happening for me (Version 18.02.0-ce-rc2-mac51 (22446) on macOS 10.13.3)

failed to start already exited containers. · Issue #2552 · docker/for-mac · GitHub

⇧  ただ、MacOSOS X)だと、それでも、動かないって言ってますね...Docker はブラックボックスな部分が多いですね...

Windows だと、新しいコマンドで、コンテナの再起動ができました。

docker container start [コンテナ名、または、コンテナID]    

f:id:ts0818:20190831101020p:plain

んで、仮想マシンIPアドレスを確認し、

f:id:ts0818:20190831101412p:plain

ホスト側でブラウザからコンテナにアクセス。

f:id:ts0818:20190830144720p:plain

f:id:ts0818:20190831101619p:plain

⇧  仮想マシンを再起動したことにより、「/home/nifi/work/input」「/home/nifi/work/output」ディレクトリが消失してしまったので、「ListFile」プロセッサーにアイコンf:id:ts0818:20190831102318p:plainが表示されてしまっています。

コンテナ内にログインして、ディレクトリを再作成で。

f:id:ts0818:20190831102110p:plain

ブラウザのほうにも反映されました。

f:id:ts0818:20190831102140p:plain