Node-REDより凄いところも!  Streams Flow超入門

# はじめに
Watson Studioをお使いの皆様、「プロジェクトに追加」で出てくる下記のメニューで「**Streamsフロー**」とは何だろうと思ったことはないでしょうか？

![スクリーンショット 2020-11-06 19.58.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/61878ae2-7904-b321-a743-59f45d38d0a3.png)


これは、Watson Studioの1機能である、**Streams Flow**のメニューです。
IoT系のリアルタイムデータ処理をUIの画面から作るサービスになっています。実は、利用形態によっては有名な**Node-REDより便利な点もある**、かなりすごいサービスなのですが(※)、今までドキュメントが少なかったこともありあまり知られていない存在でした。
かくいう私もその一人で、この機能、どうやって使うのだろうと思っていたのですが、最近チュートリアルが日本語化されました。

https://dataplatform.cloud.ibm.com/docs/content/wsj/streaming-pipelines/Tutorial_container_topic.html

このチュートリアルを参考に簡単なガイドを作ってみましたので、皆さんも是非お試し下さい。
**Streams Analytics**というサービスが追加で必要ですが、例によってライトプランがあるので、クレジットカードなしの**ライトアカウントでもお試し可能**です。
また、これも例によって、この機能もOpenShiftベースの製品である**Cloud Pak for Dataでも利用可能**です。

下記は、本記事の最後にできる、Streams Flowの画面です。この実習を動かしてみたい方は、ちょっと長いのですが、是非この記事に最後までお付き合いいただければと思います。

![work01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/676dbc68-5346-dbc3-9bbe-635b7c73b51e.gif)

ちなみに、このStreams Flowも他のWatson Studioの機能と同様に、OpenShift上で稼働する製品CP4Dでも提供されています。

(※) 細かいところまで機能比較したわけでなく、あくまで第一印象です。
Node-REDは多目的に利用可能な汎用的RADツールです。
これに対してStreams Flowはリアルタイムデータ処理に特化したサービスです。構造化データのリアルタイム処理を目的としているので、例えば、SPSS Modeler Flowで作った予測モデルと連携したアプリを作りたい場合、専用のノードが利用可能という点がメリットです。また、リアルタイムで流れているデータのトランザクション量の確認やデータブラウズまでできてしまうのも便利な点です。
逆に、実際に実習をやっていただくとわかりますが、お手軽にフローを作れるという点ではNode-REDの方がかなり先を行っている認識です(Streams Flowでは、現段階ではフロー作成後ビルド・実行まで5分以上かかります)。

# 環境準備

## 前提 (Watson Studioのプロジェクト作成まで)
前提として、Watson Studioのプロジェクトまでは作成済みであることとします。
この前提を満たしていない方は、次の記事を参照して下さい。

[無料でなんでも試せる! Watson Studioセットアップガイド](https://qiita.com/makaishi2/items/b666f847a98c2e42dfbb)

## Streaming Analytics インスタンス作成
前提を満たしている場合の、最初のステップは、Streaming Analyticsのインスタンス作成です。
まず、

https://cloud.ibm.com/

のリンクからログインして、下記のIBM Cloud ダッシュボードの画面を表示させます。そして、画面右上の「**リソースの作成**」ボタンをクリックします。

![スクリーンショット 2020-11-06 19.48.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/f1b71a00-ac2a-f238-19d3-0968ea1843d7.png)

下の検索画面に**Streaming**と入力し、Enterを押して下さい。

![スクリーンショット 2020-11-06 20.17.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/ec34063f-17fa-d5ac-560d-f886ea0f0c79.png)

下のように、**Streaming Analytics**のタイルが表示されるので、そこをクリックします。

![スクリーンショット 2020-11-06 19.49.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/0ee07362-7aa0-70f0-5b72-34e3012c8a8c.png)

下の画面になります。すべてデフォルトのままで、画面右下の「**作成**」ボタンをクリックします。

![スクリーンショット 2020-11-06 19.49.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/898bc8a1-f4d4-9902-e2b0-9364673d2fd2.png)

すると、下のようにリソース・リストにStreaming Analyticsの行が増えているはずです。

![スクリーンショット 2020-11-06 19.50.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/208ab46d-5140-65f6-5928-deb924355b75.png)

しばらく待って、下のようにActiveになれば、準備完了なので、次のステップに移ります。
![スクリーンショット 2020-11-06 19.50.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/90ed2f7f-559e-2f10-0a9d-867768dba512.png)

## Cloud Object Storageのバケット作成
次にCloud Object Storageに新しいバケットを作成します。
これから作るストリームは、データをCloud Object Storage上に保存します。そのための保存場所をこれから作ることになります。
(備考　以下の手順はチュートリアルに抜けている箇所です。このチュートリアル、それ以外にも何カ所かトラップがあり、改善の余地ありという感じです。)

まず、下のようなIBM Cloudのリソース・リストの画面から、「**Storage**」の欄をクリックして、その内容を表示させます。**cloud-object-storage-xx**という項目があるはずなので、そのリンクをクリックして下さい。これでCloud Object Storageの管理画面に遷移します。

![スクリーンショット 2020-11-06 20.43.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/9e5a2d35-8d89-498e-2e51-db0a70e90845.png)

下の画面になったら、画面右上の「バケットの作成」をクリックします。

![スクリーンショット 2020-11-07 8.59.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/f18a4ed1-9033-c469-6556-d987a097098c.png)


下の画面になったら、カスタム・バケットのタイルの矢印の部分をクリックします。
(タイル全体でなく、矢印の領域しか反応しないので要注意です)

![スクリーンショット 2020-11-06 20.50.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/88129d79-99de-3824-5491-d153c4464793.png)

下記の画面になるので、下の3つの項目を入力、設定します。、

①**バケット名**　クラウド全体でユニークな名称にする必要があるので注意して下さい。例ではiot-makaishi2-data-01としています。
②**回復力**　デフォルトでは``Regional``になっているはずですが、左の``Corss Region``に変更します。
③**ロケーション** ``us-geo``に変更します。

![スクリーンショット 2020-11-07 9.01.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/91312ec8-c52f-7df0-d8de-5374cbcec62e.png)


三つの入力が終わったら、画面を一番下までスクロールして下さい。「バケットの作成」というボタンがあるので、ここをクリックします。

![スクリーンショット 2020-11-07 9.01.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/2ca333da-26e1-1503-6238-ef01ca61a36a.png)

下のような画面になれば、バケット作成に成功しています。

![スクリーンショット 2020-11-07 9.02.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/69004ed3-8163-3790-9b9f-f65d021ed882.png)


## Watson StudioのプロジェクトとStreaming Analyticsサービスの関連付け
次に、先ほど作ったサービスと、Watson Studioのプロジェクトの関連付けをします。

次のリンクからWatson Studioの初期画面を表示させます。

https://dataplatform.cloud.ibm.com

下の画面になったら、自分のプロジェクトを選択し、プロジェクト管理画面を表示させます。

![スクリーンショット 2020-11-06 20.25.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/6919c651-4f07-59e7-8bf1-6fc90049590e.png)

下のプロジェクト管理の画面になったら、画面上部一番左の「**設定**」タブをクリックします。

![スクリーンショット 2020-11-06 20.28.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/0dfe9b37-f7a7-a529-f656-06827ffb7d3a.png)

設定タブで画面を下にスクロールさせて、下の画面の「**サービスの追加**」をクリックします。

![スクリーンショット 2020-11-06 20.28.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/80d6f298-6d41-60ad-64ce-4aaf482d214e.png)

ドロップダウンメニューから「**Streaming Analytics**」を選択します。

![スクリーンショット 2020-11-06 20.28.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/df8b5cca-cf20-3db6-abda-78273feac6dd.png)

「**Associate service**」の画面になったら、チェックボックスにチェックを入れ、画面右の「**Associate service**」のリンクをクリックします。

![スクリーンショット 2020-11-06 20.29.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/95e7b249-17a8-1f1d-f9a1-1b3212b6269c.png)

下のように**Status**が**Associated**になっていれば関連付けに成功しています。画面右上の閉じるアイコンで設定画面を閉じます。

![スクリーンショット 2020-11-06 20.29.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/b4b5fe6a-6775-20cc-05f1-b20504b3f6fe.png)

元の画面に戻りますが、Steaming Analyticsがサービスとして増えているはずです。

![スクリーンショット 2020-11-06 20.29.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/255dc778-eb70-79a0-610f-738c100f1ad0.png)

お疲れ様でした。これで、実習に必要な環境の準備はすべて終わりました。
いよいよ、当初の目的であるStreaming Flowの作成に入ります。

# Streaming Flowの作成

## 初期画面の表示まで
プロジェクト管理画面で「**資産**」タブを表示した状態で、画面上部の「プロジェクトに追加」をクリックします。

![スクリーンショット 2020-11-06 21.02.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/0292625c-9d0e-868f-a487-a55bc3feeab1.png)

下のメニューで「**Streams フロー**」を選択します。

![スクリーンショット 2020-11-06 19.58.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/61878ae2-7904-b321-a743-59f45d38d0a3.png)

下のような「**新規Streams フロー**」の画面になります。ここで

①「My First Stream」など適当な名前を入力します。
②その下のStreaming サービスには、先ほど新規作成・プロジェクトとの関連付けをしたStremingサービスが設定されていることを確認します。
③フロー作成方法を「手動」に変えます
④画面右下の「作成」ボタンをクリックします。

![スクリーンショット 2020-11-06 21.04.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/d230d0a7-5773-87dc-fe49-1bd91fd28ef8.png)

これで、下のようなStreams Flow編集画面が表示されるはずです。

![スクリーンショット 2020-11-06 21.04.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/96f5e562-cf4c-b6ac-10bd-6d4a7a15f7f0.png)

## ノードの生成と接続
この画面の使い方は、基本的にSPSS Modeler Flowと同じです。画面左のパレットから必要な部品をDrag and Dropして、部品間を結線し、必要に応じて部品のプロパティを設定します。
今回は、最初のフローなので、**ソース**一つ、**ターゲット**一つという最も簡単なフローを作成します。

## ソースノードの生成
画面左のパレットから一番上の「**ソース**」をクリックします。すると、下のようにソースデータのアイコン一覧が表示されます。この中で「**サンプル・データ**」を編集画面にドラックアンドドロップします。
このメニューはIoT処理する対象の入力データソースを表しています。
普通は、基盤側の準備が必要なのですが、開発テスト用に、準備なしで利用できるダミーデータソースが、今選んだ「サンプル・データ」になります。

![スクリーンショット 2020-11-06 21.21.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/fbb28d70-cda6-f86e-b86b-27d9fa58ccb3.png)

## ターゲットノードの生成
今度は、パレット上上から2番目の「ターゲット」をクリックします。
中のメニューから「Cloud Object Storage」のアイコンをdrag and dropします。

![スクリーンショット 2020-11-06 21.35.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/f697b017-c1b1-8432-8dba-0394c633bc61.png)

## ノード間の結線
次に2つのノード間を下の図のように結線します。ここが妙にやりにくくて要注意です。コツとしてノード内の小さな円の領域ぴったりにマウスポインタを合わせた上で、drag and dropするのがいいみたいです。

![スクリーンショット 2020-11-07 9.09.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/3da39d65-c387-59c2-71c4-ff018267de43.png)


結線が終わった段階では、両方のノードに赤い点が表示されていて、これはプロパティが未設定でこのままでは実行できないことを意味しています。これから、両ノードのプロパティ設定を行っていきます。

##  ソースノードのプロパティ設定
まず、サンプル・データノードをクリックします。下のように、右側にノードの設定情報が表示されます。

![スクリーンショット 2020-11-07 9.57.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/b996ae62-2ba3-b6eb-7a7f-8755ac4d8a31.png)

ここで、トピックのドロップダウンをクリックし、「データ・ヒストリアン」を選択します。選択が終わったら、編集領域の空白の箇所をクリックし、画面を元の状態に戻します。
下の図のようになるはずです。

![スクリーンショット 2020-11-07 9.58.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/f92da823-8845-fdf6-3959-637a6298c431.png)

この段階で、ソースノード側は赤い点が消えたのがわかります。これは設定が正常にできたことを意味しています。

![スクリーンショット 2020-11-07 9.53.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/c506bdfc-ed32-8640-de82-a27c5cc3b5d8.png)

次に、ターゲットノードの設定を行います。

## ターゲットノードのプロパティ設定
次に同様にCloud Object Storeのノードをクリックします。下の画面になるので、「接続の追加」を選択します。
(備考　以下の操作は最初の一回のみです。1度接続の登録ができると、2度目以降はメニューから選択するだけでOKです。)

![スクリーンショット 2020-11-07 9.12.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/f2c8c1f9-afaf-4cde-9275-72920bca2111.png)

下の画面になるので、一番上部の「Your service instances in IBM Cloud」の直下のアイコンを選択して下さい。
(備考　一般的なCloud Object Storageに接続する場合は、認証情報をすべてセットする必要がありますが、同一イアカウント内であれば、簡単に接続できます。以下の手順はこのことを利用します)

![スクリーンショット 2020-11-07 9.12.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/d832284e-af04-ac27-491b-6ab73ea6fbd1.png)

次に画面を一番下までスクロールします。下のような画面になるので、
① Discover data assets のチェックを付ける
②　Createボタンをクリック
します。これで、Object Storageとの接続情報が設定されたはずです。

![スクリーンショット 2020-11-07 9.13.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/22ef4320-c688-8570-a188-68bda538cb18.png)


設定がうまくいくと、下のように、「接続」の欄が cloud-object-storage-xxに設定されています。
次にその直下の「ファイルパス」右下の枠で囲んだアイコンをクリックします。

![スクリーンショット 2020-11-07 9.13.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/7623ec81-e0c2-d2c4-ce2b-ca84b5da6dbf.png)

下の画面になるので、先ほど事前準備で用意したバケットを選択します。
(参考までにもう一つのバケットはStudioのプロジェクトデータ保存用に自動的に作られたものです)
画面が切れてしまっていますが、その後で右下の「選択」ボタンをクリックします。

![スクリーンショット 2020-11-07 9.14.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/f85bf5d2-c8ef-3dc4-6110-36f7092036cf.png)

下のように、ファイルパスに``/<バケット名>``が入っているのがわかると思います。
(ここは、タイプミスしないのであれば手で入れてもOKです)
次に、このバケット名の直後に次の文字列を入力して下さい。
``/DH_%TIME.csv``


![スクリーンショット 2020-11-07 9.14.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/6f73ab1b-801c-9118-32fc-180fa20cf114.png)

最終的に、次のような形になります。

![スクリーンショット 2020-11-07 10.10.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/965405ec-d80a-00ec-6b32-6c0299b91208.png)

ちなみに、以上の設定は、Object Storage上にIOTデータをどういうファイル名で保存するかを指定するためのものです。``%TIME``というキーワードを含めることで、タイムスタンプをファイル名に追加して、2度目以降も上書きされないようになります。
ここまでできたら、あと一歩です。その下の「ファイルの作成」をクリックします。

下の画面になったら、
wrirePolicy; 「イベント数」
イベント数: 100
を入力して下さい。入力が終わったら、ファイルの作成の欄を非表示にして、元の画面に戻します。

![スクリーンショット 2020-11-07 10.11.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/f4832333-5a84-6f88-2223-bbd0b4c16689.png)

さらに、編集エリアを再度クリックして、設定画面も非表示にして下さい。
すべての設定がうまくいくと、下の図のように、2つのノードの赤い点が両方消えているはずです。

![スクリーンショット 2020-11-07 9.18.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/6c07babc-9275-5e0a-f882-48d978a34d31.png)

念のため、画面右上のアラートアイコンをクリックして、アラートの状況を確認します。一番上部に下の図のような緑のアイコンが出ていれば、すべて設定がうまくいったことを意味しています。

![スクリーンショット 2020-11-07 9.17.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/81a58aca-c68e-e6e4-5f03-2cb710f324d5.png)

確認できたら、アラートアイコンを再度クリックして、非表示に戻します。

お疲れ様でした。これでStreamsの最初のデモを動かすための準備はすべて完了しました。
次の章でいよいよ今作ったStream Flowを実際に動かしてみます。

# ストリームの実行

## ストリームの保存とメトリックス・ページの表示
まず、今まで作ったストリームを①「保存」アイコンをクリックして保存します。
次に②「メトリックス・ページ」アイコンをクリックして下さい。

![スクリーンショット 2020-11-07 9.17.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/35211c25-6c7a-2cf0-9048-4715d8118f80.png)

## ストリームの実行
下のような画面になるかと思います。ここで画面上部のPlayアイコンをクリックすると、ストリームが実行されます。早速このボタンをクリックしてみましょう。

![スクリーンショット 2020-11-07 9.19.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/7c2c9143-bdec-245e-ed98-efe514c6b089.png)

1分ほど待っていると、下の画面が表示されるので、「はい」で答えます。

![スクリーンショット 2020-11-07 9.19.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/95a46244-b54c-3829-5525-02590372d842.png)

すると、ストリームのデプロイが始まります。ここはものすごく時間がかかります。
(自分の環境ではかったときは約6分。)
一休みして、辛抱強く待っていて下さい。

うまくいくと、下のような画面に変わります。
データの流れていく様子がアニメージョン表示されていて、初めてみたときは結構感動しました。

![スクリーンショット 2020-11-07 9.27.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/f3a25a2b-5a4d-f914-3e1c-19cf078ee642.png)

ノード間をクリックすると、下の図のようにデータの詳細情報が表示されます。

![スクリーンショット 2020-11-07 9.27.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/8c4d330d-f3f0-1c84-2464-18a6d46002bf.png)

もう一回クリックすると、個々のトランザクションデータの詳細まで表示されます。これは結構すごいと思いました。

![スクリーンショット 2020-11-07 9.27.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/472e9e95-25a6-dd64-68e5-a8ae0f39ddb1.png)

#出力の確認
最後に、このデモで作ったCSVファイルを確認してみましょう。
Cloud Object Storageの管理画面から、該当バケットをクリックすると、その確認ができます。

![スクリーンショット 2020-11-07 11.28.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/95c648db-9d70-a097-119b-76ac35a9dda0.png)

![スクリーンショット 2020-11-07 11.28.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/74373227-b163-5fed-2483-6f2e173d6962.png)


# おわりに
このチュートリアルは、単にStreams Flowエディタの使い方を理解するだけのもので、まだ、本当のIoT処理ができたわけではありません。しかし、ノードの一覧をみればどんなことができそうか想像が付くので、最後にノード一覧を紹介します。

## ソースノード一覧
IoTデータでデファクトのKaftaとMQTTはもちろんサポートされています。WatsonIoTというIBMのクラウド用サービスのアイコンもあるので、このサービスを使っている場合は、簡単にそこからデータを取ってこれそうです。

![スクリーンショット 2020-11-07 9.30.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/2360edd1-4fb4-c175-0b39-402be20d7045.png)

## ターゲットノード一覧
今の実習では、Cloud Object Storageに保存しましたが、Db2 / Event Streams / Redis などがあり、普通にIOTの処理結果をデータ保存することもできそうです。

![スクリーンショット 2020-11-07 9.31.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/aee1bfe9-c990-8ee2-9c6a-b9415fadeec4.png)

## 処理及び分析ノード一覧
最後は「処理及び分析」ノードです。
「SPSSモデル」というのは、SPSS Modeler Flowで作った予測モデルをこのストリームに取り込む機能です。これを使ったチュートリアルもあるので、機会があれば別途紹介したいと思います。
また、「Cloud Function」なんてものもあるので、活用すると、外部APIを呼び出す面白いアプリケーションも作れそうです。


![スクリーンショット 2020-11-07 9.31.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/c32015b0-a2d5-2da6-56a0-91632ec1a499.png)