Apache Sparkで分析するサンプルデータの作成
ここからは、BluemixのApache Sparkを使ってデータ分析を行う方法を紹介します。分析の目標は「室内に設置した8つの温度センサーのうち、故障が疑われるのものを見つける」ことにしました。温度や湿度のセンサーデータを出力してくれるWebアプリケーション「IoTセンサーシミュレーター」を8つ動かして温度データを作成し、それをApache Sparkで分析して、8つのうち故障が疑われるものを特定します。
なお、ここで使用するIoTセンサーシミュレーターやCloudant、「Node-RED」といったツールの使い方、およびそれらを提供しているBluemixの利用開始方法は、本連載の第2回、第3回で詳しく説明しています。そのため、本稿では説明を最小限にとどめていますので、初めて触れる方はそれらの記事を参照してください。
IoTでデータを生成し保管するアプリの作成
Bluemixにログインし、ダッシュボードからアプリケーションを作成します。右上のメニューから[カタログ]を選択し、ボイラープレートから「Internet of Things Platform Starter」を選択します。
「Internet of Things Platform Starter」ボイラープレートが表示されたら、アプリの「名前」と「ホスト名」を入力して[作成]ボタンをクリックします。
ステージング(アプリケーションの作成)には3~5分ほどかかります。ステージングが完了すると、「https://<ホスト名>.mybluemix.net」をWebブラウザで開くことで、Node-REDアプリケーションにログインできるようになります。
ログインしたら、画面右側にある「Go to your Node-RED flow editor」ボタンをクリックして、Node-REDの「フローエディタ」を開きます。デフォルトの状態では次のようなフローがセットされています。
一番左側がセンサーの入力です。ダブルクリックすると詳細画面が開きます。初期状態では「Device Id」が空欄になっています。
「Device Id」欄には、IoTセンサーシミュレーターのMACアドレスを入力します。IoTセンサーシミュレーター(http://quickstart.internetofthings.ibmcloud.com/iotsensor)をWebブラウザで開くと、画面右上にIoTセンサーシミュレーターのMACアドレスが表示されています。
これをフローエディタの「センサーの入力」の詳細画面にある「Device Id」欄と「Name」欄に転記して[Deploy]ボタンを押します。すると、画面右の「Debug」ペインに次のようなメッセージが出力されるので、それを確認します。
同様に、IoTセンサーシミュレーターをWebブラウザで7つ開き、左側のペインから「ibmiot」インプットノードを7つセットして、それぞれの詳細画面で7つIoTセンサーシミュレーターのMACアドレスを1つずつDevice Id欄へ入力します。
また、「device data」Debugノードを「temp」Functionノードへつなぎ替え(既存のノードを削除し新規に追加し)ておきましょう。詳細画面で「Output」欄を「message property」にし、すぐ下をmsg.payloadにします。これで8つのIoTセンサーシミュレーターからの出力が「Debug」ペインに表示されます。
続いて、IoTセンサーシミュレーターから出力されたデータに記録したタイムスタンプを追加するなど、少し加工を施します。「temp」Functionノードをダブルクリックして詳細画面を開き、「Function」欄を次のコードに書き換えます。
msg.payload = { "d": { "name": msg.payload.d.name, "temp": msg.payload.d.temp, "humidity": msg.payload.d.humidity, "objectTemp": msg.payload.d.objectTemp, "date": Math.floor((new Date()).getTime()/1000) } }; return msg;
最後に、8つのIoTセンサーシミュレーターが出力したデータをCloudantデータベースへ格納させるノードを追加します。左側のノード一覧からStorageカテゴリーにある「Cloudant」ノードをフローの中にセットし、「temp」Functionノードへつなぎます。「Cloudant」ノードをダブルクリックして詳細設定を開いて、「Database」に任意のデータベース名を入力し、Operationの「Only store msg.payload object?」にチェックを入れます。
ここまでの作業で、次のようなフローが作成できました。センサー8個が定期的に生成するデータが、Cloudantデータベースに格納されていきます。
IoTセンサーシミュレーターに異常値を出力させる
IoTセンサーシミュレーターは、定常的に温度16℃~18℃、湿度75%~79%を示します。これは「湿度の高い室内」といえるでしょう。データ分析ではこのように、センサーが示す値からデータをめぐる状況を推測することが重要です。また、データの生成元はシミュレーターですので、全てのデータがほぼ同じ値を示します。当然ではあるのですが、あえてこのデータが示す状況を想像すると、8つのIoTセンサーは全て同一環境下のほぼ近しい場所にあると考えることができます。
もし、そのうちの1つのセンサーだけ異常な温度を示しているのであれば、それは環境の変化による要因であるとは考えにくく、例えば「センサーの故障」であると想定できます。したがって、「センサー群のうち他のセンサーと明らかに異なる値を示すセンサーは故障している」という仮説を立てることができます。
今回はApache Sparkを使って、分析の目標である「室内に設置した8つの温度センサーのうち、故障が疑われるのものを見つける」ため、IoTセンサーシミュレーターの1つを操作して定常値からはずれるデータを出力させ、意図的に故障しているセンサーを作り出すことにしました。
分析用データとして十分な量を用意するために、筆者はこのアプリケーションを10時間稼働させてCloudantデータベースにデータを蓄えました。集まったデータ量は約14万件(44MB)です。ただし、Device Idが「ce559de71a41」のIoTセンサーシミュレーターは、10時間のデータ蓄積時間のうち1時間だけ、設定を定常値から10℃高くした「Temparature: 26℃、Object Temparature: 36℃」にしてデータを出力させました、つまり、故障が疑われるセンサーはDevice Idが「ce559de71a41」のものになります。
Cloudantデータベースに蓄積されたデータは、Cloudantの管理インターフェイスで見ることができます。Cloudantの管理インターフェイスは、Bluemixダッシュボードの左ペインにある「サービス」の「Cloudant NoSQL DB」をクリックし、開いたCloudant NoSQL DB画面の左上にある「Launch」ボタンをクリックすると現れます。
1つのIoTセンサーシミュレーターが出力したデータ1件につき、JSONレコードが1つ生成されています。実際の値は“d”以下のものになります(次図赤枠部分)。つまり、この値を見て正常か異常かを判断できれば、「センサー群のうち他のセンサーと明らかに異なる値を示すセンサーは故障している」という仮説を検証できることになります。
IoT成功のカギを握る:データ管理・分析クラウドサービスのご紹介
現象をデータ化するセンサーやデバイスに注目が集まりがちなIoTですが、価値を生むのはデータ化したその後の処理です。
「多数のセンサー、デバイスからインターネット経由で送信されてくるJSONデータを効率よく保管する」
「保管した大量のデータから未知のパターンを割り出し、ビジネスを成長させる知見を提供する」
こうしたIoTが価値を生むためのサービス・製品がIBMにあります。ぜひ、下記の資料をご覧ください。(編集部)