PSP Monitor Internal

Avatar
dstn

今回のお題は「PSP Monitor」です。

PSPMonitorって何? という方はこちらのdstnブログの記事「 PSP MonitorでPSPの実力を検証!」をご参照ください。2014年4月17日開催されたdstn技術者交流会『dstnHUB』のために開発された、DataSpiderのPSP(Parallel Stream Processing)機能のデータ処理をビジュアライズする機能が「PSP Monitor」となります。

機能詳細については「 PSP MonitorでPSPの実力を検証!」を参照いただくとして、今回は「PSP Monitor Internal 」と銘打ち、その開発の経緯と内部実装について紹介してみようと思います。

また、お手持ちのDataSpiderでもPSP Monitorがご利用できるように、パッチと設定ファイルも用意しています。ぜひお試しください。

PSP Monitor開発のきっかけ


前掲のブログ記事にも書きましたが、PSPというのは優れた機能でありますが、そのメリットを説明するのは骨が折れるところがあります。動作について理解できても、「で、結局どういう動きになるの?」ということがイメージし辛いところがあるんですよね・・・。かくいう私も実は、弊社アプレッソ入社当初のDataSpiderを触り始めた頃、その動きとメリットを呑み込めるのに時間がかかった記憶があります。マルチスレッドで動作すると確かに高速で処理できそうだけれど、どのようにマルチスレッドを実現していて、なぜメモリ抑制に効果があるのか・・・というところが理解するのに時間がかかりました。

ということで、今回のdstn技術者交流会『dstnHUB』にて発表するにあたり、下図のようなPSPフローの図解の資料は用意したものの、やはりそれだけだと物足りない。PSPのマルチスレッドの処理がどのように行われ、そのデータがどのように処理されていっているのか、というのをビジュアライズしたデモがあれば分かりやすいんじゃないかなー、と思い開発したのが今回のPSP Monitorというわけです。

PSPフロー

▲PSPフロー実行時のデータ処理イメージ図

PSP Monitorアダプタの開発


ではPSPでスクリプトが処理されている様子をどのように見せるか? と悩むところから開発が始まります。

既存のPSP対応のアダプタ(CSVアダプタやDBアダプタなど)を使ってやることも考えたのですが、ちょっと難しそう・・・と、こういうときに力を発揮するのが、DataSpiderのアダプタSDKです。自分でDataSpiderのアダプタをJavaで開発できるので、目的に沿ったアダプタを自分で作ってしまえばいい!ということで、PSP Monitorアダプタとして3つのオペレーションを開発しました。

・データを出力する [PSPモニター読み取り]処理
・入力データを受け取り、出力データに渡す [PSPモニター変換]処理
・入力データを受け取る [PSPモニター書き込み]処理

これらのアダプタは特に処理を行っているわけではなく、ダミーのテーブルモデル型のデータを受け渡しています。

PSPMonitor

 

▲PSP Monitorアダプタの[PSPモニター読み取り]処理、[PSPモニター変換]処理、[PSPモニター書き込み]処理を配置したスクリプト

アイコンの大きさが通常のアダプタの処理よりも大きいことにお気づきの方もいると思います。これは私の得意技「Big Icon」です(今名前をつけました)。この詳細については以前の記事 「DKS ver.2 & ガラポンアダプタ」を参照ください。

さて話はPSP Monitorアダプタに戻って、さまざまな状況下でのPSP実行の様子を確認するために、各処理で1行あたりの実行ミリ秒数を変更できるようにプロパティを作成しました。実装的には実行ミリ秒数は単に設定したミリ秒数分Threadのsleep()を行っています。

また、[PSPモニター読み取り]処理では読み取りデータ行数を設定できるようにして処理行数を変更できるようにしています。

READPropety

▲[PSPモニター読み取り]処理のプロパティ設定画面。読み取りデータの行数と1行あたりの実行ミリ秒数を設定できる。実行ミリ秒数の設定は各処理でも同じように設定可能

HTTPトリガーで処理ステータス取得


さてさて、これで基盤部分のPSPフローの処理はできあがりました。いよいよ本丸、このPSPフローの処理をどう見せるか? というビジュアル部分の実装です。

いろいろとやり方は考えられるので悩んだんですが、できるだけ手軽に実行できるようにしたいこともあり、シンプルにHTML + JavaScript(jQuery)を作ってブラウザ上で確認できるように実装することにしました。で、そこからJavaScriptでDataSpiderにアクセスし、PSP Monitorアダプタの処理状況を取得して表示する、というように作ってみようというわけです。

ということで「DataSpiderにアクセスしてPSP Monitorアダプタの処理状況を取得する」という部分をどう作るのか、という話になります。JavaScriptでアクセスするのだったら、HTTPトリガーで作るのが簡単です。HTTPトリガーは結果データとしてXMLを返すことができます。これを利用して、HTTPトリガーでスクリプトを実行し、処理結果として現在の処理のステータスをXML形式を受け取り、JavaScriptでそれを画面に反映する、という処理を短い単位で繰り返し行うことで、画面に処理状況が反映されていくような動きを作ることにしました。

全体像をまとめたのがこちらの図です。

PSP Monitor処理イメージ図

 

▲PSP Monitor処理イメージ図。HTTPトリガーでステータス取得スクリプトを実行し、処理ステータスをXMLで取得する

まずは前項で紹介したPSP Monitorアダプタ新たに [PSPモニターステータス取得]処理を追加しました。
これは読み・変換・書きの各データで処理された件数を取得して、現在の処理ステータスをXML型で出力することを行う処理で、設定項目はありません。

PSPモニターステータス取得処理

▲[PSPモニターステータス取得]処理のプロパティ画面

この処理は以下のようなXML型のデータを出力します。処理対象の行数・各処理(GET・CONVERT・PUT)の現在の処理件数、そして実行時間(ミリ秒)がこのXMLから取得できる、というわけです。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root>
  <status rownum="5000" get="3000" convert="2320" put="1234" time="2322"/>
</root>


 ▲[PSPモニターステータス取得]処理の出力データ

さてここまでできたら、後はスクリプトを作ってサービス登録を行い、HTTPトリガーから実行できるようにします。スクリプトは以下のようなごく単純なもので、この[PSPモニターステータス取得]処理を実行して、結果データをXML型のスクリプト出力変数「status」に渡しています。

ステータス取得スクリプト

 

▲HTTPトリガーから実行するステータス取得スクリプト。 取得したステータスはスクリプト出力変数「status」に渡している

このスクリプトをサービスに登録したら、HTTPトリガーを設定します。HTTPトリガーの設定画面では、レスポンス設定の[Content-Type]に[text/xml]を指定し、トリガーにアクセスするとXMLを返すトリガーとして設定します。

HTTPトリガー1

▲HTTPトリガー設定画面。[Content-Type]に[text/xml]を設定

そして実行内容の設定画面では先ほどのステータス取得用のスクリプトを指定し、[スクリプト出力]のstatus変数の値として、トリガー変数で${trigger.outputData}を指定しています。これによって、スクリプトの出力変数statusのXMLをHTTPアクセスのレスポンスとして返す設定ができました。

HTTPトリガー2

▲HTTPトリガーの実行内容の設定画面。実行されるスクリプトの出力変数statusの値をHTTPレスポンスとして返すように設定している。

処理状況をPSP Monitor画面に表示!


長々と説明してまいりましたがようやくゴールです! PSP Monitorの画面を表示するPSPMonitor.htmlでは、jQueryの機能であるプログレスバーを使って各データの処理状況を表示しています。プログレスバーはCSSでカスタマイズして色を変えたりしています。

PSPMonitor画面

▲PSP Monitor画面。データ処理状況のjQueryのプログレスバーを使用して実装されている

PSPMonitor.html中から以下のコードのように短いインターバルでHTTPトリガーにアクセスして処理ステータスを取得し、画面上の各プログレスバーやラベルにその値を反映させています。

setInterval(function() {
$.ajax({  type: 'GET',  url: './trigger/PSPMonitorStatus',  dataType: 'xml',  success: function(xml){   var status = $(xml).find('status');   var rownum = Number(status.attr('rownum'));   var get = Number(status.attr('get'));   var convert = Number(status.attr('convert'));   var put = Number(status.attr('put'));   var time = status.attr('time');
 $('#getProgress').progressbar({   value: Number(get),   max: rownum  });
 $('#getLoading').text(get + "/" + rownum);
<中略>
}, 100 );


▲PSPMonitor.html上のJavaScriptの一部。HTTPトリガーにアクセスしてXMLを取得し、画面の各部に反映する処理をインターバルで実行している

というわけで、結果として以下の動画のように処理状況がリアルタイムに画面に反映されるデモが完成! 2_くも子_わーい_small



▲PSP MonitorでPSPフローのデータ処理を表示するデモ

終わりに


以上、「PSP Monitor Internal」ということでPSP Monitorの内部仕様を説明しました。HTTPトリガーをJavaScirptから呼び出してXMLでデータを取得、ということをやったのは実は個人的に初めてだったんですが、すごく簡単にデータを取得できて便利でした。今回の経験を今後に活かして、また新たなDataSpiderを活用する取り組みにチャレンジしたいと思います!

さて、今回作成したPSP Monitorアダプタのパッチ、PSPMonitor.html、そしてトリガーやプロジェクトなどの設定は、本サイト「スキルアップセンター」の「 サンプルスクリプト:PSP Monitor」よりダウンロードできるようにしました。適用方法の詳細はリンク先を参照してください。ぜひお手持ちのDataSpiderでお試しいただき、いろいろと実験してください!

 

コメント

ログインしてコメントを残してください。

Powered by Zendesk