Apache NiFi のインストールはできたけど、何をしたら良いの?どうも、ボクです。
情弱なあたいは、今日も迷走するのであった...というわけで、今回は、実際にApache NiFi を使っていきたいと思います。
そして、まったく、関係ないけど、
マイクロソフトは8月29日、人間のトッププレイヤーに匹敵する強さの麻雀AI「Suphx」(Super Phoenix、スーパーフェニックス)を開発したと発表した。国内最大級のオンライン麻雀サイト「天鳳」で、AIとして初めて十段に到達した。
⇧ マイクロソフトが、麻雀AI を開発したそうな。スーパーフェニックスって...キン肉マンかいな!
麻雀AI か~、喋ったりするのかな?
「不合理こそ博打…それが博打の本質、博打の快感…不合理に身を委ねてこそギャンブル」
みたいなセリフも言ってくれたら面白いんですけどね。実際の麻雀でも喋ってる人いないですけどね、麻雀漫画のような名セリフを言って欲しいものです。
というわけで、Apache NiFi にレッツトライ~。
Dockerでホストとゲストのディレクトリを共有してコンテナ起動
DockerコンテナでApache NiFi を利用していくのですが、
⇧ この記事で、Apache NiFiのDocker image のインストールが済んでる状態という前提で話を進めて参ります。
Docker とかもインストール済ということで。
そんじゃ、まずは、仮想マシンの起動まで。
Apache NiFi のDocker image があることを確認し、
そしたらば、ホストOS側に適当な作業用のディレクトリを作成で。
※ Docker ToolBoxを使っている場合は、Windowsでは、「C:\Users\」以下のディレクトリしかマウントできないらしいので要注意です。
そんでは、ホストOSとゲストOSのディレクトリをマウント(共有)して、コンテナを起動で。Windowsの場合、ホストディレクトリのパスの指定に要注意。私はハマりました(涙)。
docker run --name [任意のコンテナ名] -p [ホストのポート]:[ゲストのポート] -d -v [ホストディレクトリの絶対パス]:[コンテナの絶対パス] [REPOSITORY:TAG]
そしたら、ゲストOS側のコンテナ内にアクセスし、ディレクトリが作成されてるか確認。
docker exec -it [コンテナ名] bash
そしたらば、「/home/nifi/work/」に、「input」「output」ディレクトリを作成で。
ホストOSとゲストOSのマウントが上手くいっている場合は、ホストOSのディレクトリ から、ゲストOSのディレクトリの内容が見えます。
できました~。
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:
⇧ 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.
なんでも、「Process Group」の定義 とは、
『入力ポートを介してデータを受信し、出力ポートを介してデータを送信できる、特定のプロセスとその接続のセットです。』
と言っているので、「Processor」は、個々の「Process」を作るものってことでしょうかね。
何でプロセッサーが必要かというと、
NiFiでデータフローを実現するための大きな流れとして,
- 目的に応じたProcessorを探し/実装し,キャンバス上に追加する
- Processor同士を結ぶ(各エッジについて,Relationshipを選択する)
- Processorを設定する(多くのProcessorにはPropertyの設定が必要)
- Processorを起動する
をする必要がある.
⇧ 上記サイト様によりますと、「Processor」ありき、と言っても過言ではないと。
というわけで、ゲストOSに作成したディレクトリを監視するプロセッサーを作成で。
ホスト側のブラウザにアクセスし、「Processor」のアイコン をドラッグ&ドロップします。
そしたら、プロセッサーの作成ができますが、「Filter」って検索のところで、
「listfile」って検索し、「ADD」で。
追加されたプロセッサーを、ダブルクリックで。
プロセッサーを編集できるようなるので、「PROPERTIES」タブを選択。
「Property」が「Input Directory」ってなってる項目の「Value」ってところをクリックで。
そしたら、入力ボックスが表示されるので、ゲストOS側に作成したディレクトリのパス「/home/nifi/work/input」を入力。「OK」で。
そしたら、「APPLY」で。
次に、もう1つプロセッサーを作成で。「FetchFile」を「ADD」で。
そしたらば、「FetchFile」のプロセッサーをダブルクリックで。
そしたらば、「ListFile」のプロセッサーにカーソルを持っていくと表示されるアイコンをドラッグし、
「FetcFile」のプロセッサーにくっ付けます
そうすると、設定とかできるけど、今回はデフォルトの状態のまま、「ADD」で。
そんでは、続きまして、ファイルを出力するプロセッサーの作成。
「PutFile」プロセッサーが作成されるので、ダブルクリックで。
「PROPERTIES」タブを選択し、「Property」の「Directory」という項目の「Value」のところをクリック。
出力先に、作成しておいたディレクトリ「/home/nifi/work/output」のパスを指定し、「OK」で。
「APPLY」で。
そしたらば、「FetchFile」プロセッサーと「PutFile」プロセッサーを繋げましょう。
「SUCCESS」にだけチェック。「ADD」で。
そしたらば、「FetchFile」プロセッサーは、処理中に失敗した時の処理をどうするかを設定していなかったので、設定していきます。
「FetchFile」プロセッサーをダブルクリックし、
「SETTINGS」タブを選択し、「Automatically Terminate Relationships」の「failure」「not.found」「permission.denied」にチェックし、「APPLY」で。
そしたらば、「PutFile」プロセッサーをダブルクリックで。
「PutFile」プロセッサーは、ファイルの出力を担うのと、後続のプロセッサーがないので、成功しても、失敗しても、単純に停止する設定します。
「Automatically Terminate Relationships」の「failure」「success」にチェックし、「APPLY」で。
ゲストOSのコンテナ内に作成したディレクトリ「/home/nifi/work/input」に、適当なファイルを作成しておきます。
ちなみに、大きいサイズのファイル作成については、
⇧ 上記サイト様が詳しいです。
⇧ Linux で空ファイルを作成は、上記サイト様が詳しいです。
今回は、vi エディターで作成しようと思ったけど、vi コマンドが入ってないらしい。なので、echo コマンドで。
ファイルも作成できたので、ホスト側のブラウザに戻り、Shift押しながらクリックで、すべてのプロセッサーとプロセッサーのリレーションを全選択しましたら、
「Operate」の開始ボタンをクリックで。
ゲストOSのコンテナ内のディレクトリ「/home/nifi/work/output」に、「/home/nifi/work/input/Dockerfile」がコピーされました。
ホストOS側からも確認ができました~。
というわけで、なんとか、Apache NiFi でプロセッサーを使ってみることができました。勉強することがまた増えてしまった(涙)
今回はこのへんで。
NG集
そしたらば、ホストOS側に適当な作業用のディレクトリを作成で。
そんでは、ホストOSとゲストOSのディレクトリをマウント(共有)して、コンテナを起動で。
docker run --name [任意のコンテナ名] -p [ホストのポート]:[ゲストのポート] -d -v [ホストディレクトリの絶対パス]:[コンテナの絶対パス] [REPOSITORY:TAG]
そしたら、ゲストOS側のコンテナ内にアクセスし、ディレクトリが作成されてるか確認。
docker exec -it [コンテナ名] bash
そしたらば、「/home/nifi/work」内に、「input」「output」というディレクトリを作成しようとしたら、ディレクトリを作成できる権限がないって怒られた...
rootユーザーになろうにも、Dockerコンテナ(Apache NiFi)のRootユーザーのユーザーとパスワードが分からんのだが...
⇧ 上記サイト様によりますと、
docker exec -u 0 -it [コンテナ名] bash
でいけるらしい。一旦、exit でコンテナから抜けて、再度、コンテナへログイン。
root ユーザーでログインできました~。
改めて、ディレクトリを作成で。
ですが、そもそも、「docker exec -u 0 -it [コンテナ名] bash」を使用しないといけない状態が間違っているようです。
どうやら、ホストOSと、ゲストOSのマウントが上手くいってないらしい?
“docker tool box”の場合,//c/Users/
以下ディレクトリでないとマウントできない.
“/c/docker”のようなcドライブ直下のフォルダを-v
で参照してもダメということ.
ただ以上の方法でもボリュームは存在していてなんとなく出来てる感があるので余計混乱する.
“docker for windows”と”docker toolbox”の明確な差異を知ってからは理解が早かった.
⇧ 上記サイト様によりますと、「//c/Users/」以下のディレクトリじゃないと駄目らしい...まじか...最初からやり直しか。
っていうか、「c」ドライブは、小文字にしないと駄目らしい、むっちゃハマった...
というわけで、Docker ToolBox を使っている皆様、ディレクトリのマウントの際はお気をつけあれ。
時間の都合上、一旦、仮想マシンを停止し、翌日へ持ち越しした時の内容。
翌日。仮想マシンを起動し、
停止してしまったコンテナを再起動しようとしてハマる。
どうやら、新しいコマンドでないと動かないらしい?
@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
⇧ ただ、MacOS(OS X)だと、それでも、動かないって言ってますね...Docker はブラックボックスな部分が多いですね...
Windows だと、新しいコマンドで、コンテナの再起動ができました。
docker container start [コンテナ名、または、コンテナID]
ホスト側でブラウザからコンテナにアクセス。
⇧ 仮想マシンを再起動したことにより、「/home/nifi/work/input」「/home/nifi/work/output」ディレクトリが消失してしまったので、「ListFile」プロセッサーにアイコンが表示されてしまっています。
コンテナ内にログインして、ディレクトリを再作成で。
ブラウザのほうにも反映されました。