• 検索結果がありません。

システム構成

ドキュメント内 慶應義塾大学 環境情報学部 寺山淳基 (ページ 37-44)

行う分散多次元センサデータ管理シス テム

T- Ring の設計実装

5.1 システム構成

本節では,T-Ringシステムの設計について述べる.T-Ringを構成する保存ピアはネットワー クモジュール,センサ情報管理モジュール,データ保存モジュール,データ取得モジュール,保存 ピア発見モジュール,センサ管理モジュール,アプリケーションモジュールの7つのモジュールに よって構成される.図5.1がシステム構成図であり,各モジュール間でのデータの受け渡しが記述 されている.

センサ情報保存 モジュール センサ管理 モジュール データ保存 モジュール

データ取得 モジュール アプリケーション

モジュール

センサ情報

保存情報

分割されたクエリ

保 存 ピ ア 発 見 モ ジ ュ ー ル ネ ッ ト ワ ー ク モ ジ ュ ー ル

ハッシュ値

データの値のリスト

key, value

key, value

key value 保存ピア ID

ハッシュ値 保存ピア ID

ハッシュ値 保存ピア ID

5.1 システム構成図

5.1.1 ネットワークモジュール

ネットワークモジュールは保存ピア同士で協調し,1Dトーラス型のオーバーレイネットワーク を構築及びデータに関する通信を行うモジュールである.本モジュールでは,他の保存ピアのデー タ取得モジュールから,データ取得のクエリが送られた場合に,対象のデータをクエリ送信元の保 存ピアに送信する.

本モジュールの実装はオープンソースであるOpenChordの一部を参考にしている.保存ピアの

JoinRetrieveなどの保存ピアによるネットワークの構築の部分において利用している.

5.1.2 センサ情報管理モジュール

本モジュールは,センサの緯度や経度など,センサデータの値以外の多次元データとしてのセン サ情報を適切な場所に保存することで,データの取得を可能にするモジュールである.

センサデータの取得を考えた際に,一般的な手法は,センサノードのアドレスを指定して取得す

るが,T-Ringが想定している環境では,センサデータをアドレス以外の他の要素から取得する.

よって,取得を行う時には,取得されるセンサデータの情報が必要である.このために,T-Ring では,対象のセンサノードの緯度,経度,センサタイプ,マスターピア=0で一次元化,ハッシュ 化した値を担当する保存ピアに対して,このセンサ情報を登録する.登録はセンサデータの値の保 存と同様に行う.センサデータの保存については,次節で詳細に述べる.保存におけるキーとし て,緯度,経度,センサタイプ,マスターピア=04次元値を1次元化,ハッシュ化した値を,バ リューとして,そのセンサのchunkSPの時間のセットを保存する.データの取得については,

5.4で詳細に述べるが,データの取得の際には,緯度,経度,センサタイプ,chunkSPの時間を 必要とする.緯度,経度,センサタイプ,マスターピア=0の担当ピアに取得に必要なセンサ情報 を登録することによって,chunkSPの時間を知ることが可能になる.

本モジュールでは,最初に,センサに関する情報が登録されているSensorInfo.csvから,センサ IDをキーとして,センサデータの保存に必要である,緯度,経度,センサタイプ,chunkSP 時間を取得する.取得された情報から,緯度,経度,センサタイプ,マスターピア=04次元値

をZ-order関数によって処理し,返されたバイナリ値を保存ピア発見モジュールに渡す.保存ピア

発見モジュールは,担当の保存ピアの保存ピアIDを返してくるので,そのピアに対して必要な情 報を登録する.

5.1.3 データ保存モジュール

本モジュールはセンサデータを保存する保存するモジュールである.

T-Ringでは,センサデータの時間に従って保存先を決めるため,センサ管理モジュールから,セ

ンサID,対象データの緯度,経度,センサタイプ,chunkSPの時間,データの時間,センサの設 定時間を取得する.本モジュールでは,フィールドとして,センサIDをキーに,次に保存すべき 保存ピアのIDをバリューとするMapを所持している.送られてきたセンサIDMap内のセン サIDを比較し,登録されていない場合は,データの時間,センサの設定時間,chunkから,まず,

マスターピアの番号を決定する.次いで,そのマスターピアからSuccessorを辿る回数を計算す る.そして,緯度,経度,センサタイプ,マスターピアの番号の4次元からハッシュ化をし,その

値とSuccessorを辿る回数を保存ピア発見モジュールに送る.その結果として保存ピアIDを受け

取る.データが保存されるセンサのIDMap内のセンサIDが一致していた場合は,そのMap のセンサIDに対応する保存ピアのIDを取得する.次に,そのIDの保存ピアに対して,キーを緯

度,経度,センサタイプの1次元化とハッシュ値,バリューをデータの値として保存する.

また,保存が行われると,次に保存するべき保存ピアの計算が行われる.ここからはセンサの IDとデータの時間だけを監視する.この計算を行うために,センサIDをキーとして,最新のセン サデータが保存された保存ピアのID,マスターピアの番号それぞれをバリューとして保存する2 つのフィールドが存在する.次に送られてきたデータが前回のデータと比較してchunkが異なっ ていた場合,保存ピア発見モジュールに対して,最新の保存データが保存された保存ピアID

Successorを辿る回数が送られる.これに対して,対象の保存ピアのIDが返される.この保存ピ

アのIDを次に保存すべき保存ピアIDとして更新する.次に,chunkが同一であった場合,最新の 保存データが保存された保存ピアIDを次に保存すべき保存ピアIDをとして更新する.マスター ピアが異なっていた場合,センサIDが登録されていない時と同様の処理を行い,保存ピア発見モ ジュールから返された保存ピアIDを次に保存すべき保存ピアIDとして更新する.

これらの処理が繰り返えされることにより,データの保存が行われる.以上に述べた処理をフ ローチャートで示す.

5.1.4 データ取得モジュール

アプリケーションモジュールから送られるユーザからの取得のクエリは,範囲を持ったクエリで あるので,本モジュールにより,クエリの緯度,経度,半径から分割を行う.これについては図5.2 が例と図解である.そして,分割を行ったそれぞれの位置について,緯度,経度,センサタイプと クエリで指定された取得時間から,データ保存と同じ手順により,緯度,経度,センサタイプ,マ スターピアの番号の4次元によるハッシュ値,Successorを辿る回数を保存ピア発見モジュールに 送り,その結果として受け取った保存ピアIDに対して,緯度,経度,センサタイプで生成される キーからバリューを受け取る.この受け取ったバリューのセットを,指定された方式に変換しアプ リケーションモジュールに送り返す.指定された方式に関しては,アプリケーションモジュールの 解説の際に説明する.

5.1.5 保存ピア発見モジュール

本モジュールは,センサ情報管理モジュール,データ保存モジュール,データ取得モジュールか ら受け取ったハッシュ値やSuccessorを辿る回数から,対象の保存ピアを発見し,そのアドレスを 各モジュールに送り返す.

T-Ringでは2種類の保存ピアの発見の方法が存在する,1つ目は,Finger Tableを用いた発見

である.Finger Tableの計算回数はO(log 2N)である.この発見はデータ保存モジュール,デー

タ取得モジュールから送られた緯度,経度,センサタイプ,マスターピアの番号の4次元による ハッシュ値が前データと異なる場合に,マスターピアを探索するために行われる.また,Synapse における保存,取得では,センサデータ毎にこの計算がなされる.

2つ目の方法は,データ保存モジュール,データ取得モジュールから送られた緯度,経度,セン

1 6 5 4 3 2

0 7 9 8

1 2 3 4 5 6 7 8 9

(5,5)を中心とする半径2以内に  存在するセンサから取得 

(5,7)  (4,6)  (5,6)  (6,6)  (3,5)  (4,5)  (5,5)  (6,5)  (7,5)  (4,4)  (5,4)  (6,4)  (5,3) 

latitude

longitude

13個のクエリに分割 

5.2 クエリの分割

サタイプ,マスターピアの番号の4次元によるハッシュ値が前データと同様であった場合に行わ れる.この場合,前データで取得したアドレスのSuccessorのアドレスを取得する.Finger Table による計算は前データの際に行ったため,計算回数はO(1)である.

これらの方法により発見されたアドレスをデータ保存モジュール,データ取得モジュールに送り 返す.

Listing 5.1 データ保存時の保存ピア発見

p u b l i c c l a s s N e x t S t o r e P e e r { p r i v a t e T R i n g I m p l t r i n g ;

p r i v a t e HashMap < String , Node > n e x t N o d e ; p r i v a t e HashMap < String , Long > r e s t T i m e ; p r i v a t e HashMap < String , Long > p r e v S P ; p r i v a t e HashMap < String , Long > p r e v T i m e ; A r r a y L i s t < Long > p o s i t i o n s ;

p u b l i c N e x t S t o r e P e e r ( J o i n D a t a j o i n D a t a ) { t h i s . p o s i t i o n s = new A r r a y L i s t < Long >() ; t h i s . n e x t N o d e = new HashMap < String , Node >() ; t h i s . r e s t T i m e = new HashMap < String , Long >() ; t h i s . p r e v S P = new HashMap < String , Long >() ; t h i s . p r e v T i m e = new HashMap < String , Long >() ; t h i s . t r i n g = j o i n D a t a . t r i n g ;

}

p u b l i c s y n c h r o n i z e d N o d e g e t N e x t S t o r e P e e r ( N o d e node , D a t a F o r S t o r e data , Key key ) t h r o w s C o m m u n i c a t i o n E x c e p t i o n {

s e t N e x t S t o r e P e e r ( node , data , key ) ;

r e t u r n n e x t N o d e . get ( A r r a y s . t o S t r i n g ( key . g e t B y t e s () ) ) ; }

p r i v a t e s y n c h r o n i z e d v o i d s e t N e x t S t o r e P e e r ( N o d e c u r r e n t P e e r , D a t a F o r S t o r e data , Key key ) t h r o w s C o m m u n i c a t i o n E x c e p t i o n { l o n g SP = ( d a t a . t i m e - d a t a . c o n f i g T i m e ) / d a t a . s t a r t P o i n t ;

t h i s . n e x t N o d e

. put ( A r r a y s . t o S t r i n g ( key . g e t B y t e s () ) , c u r r e n t P e e r . f i n d S u c c e s s o r ( c u r r e n t P e e r . g e t N o d e A d d i n g O n e I D () ) ) ; t h i s . p r e v S P . put ( A r r a y s . t o S t r i n g ( key . g e t B y t e s () ) , SP ) ;

t h i s . r e s t T i m e . put ( A r r a y s . t o S t r i n g ( key . g e t B y t e s () ) , d a t a . s t a r t P o i n t - d a t a . c h u n k ) ;

} e l s e {

if ( t h i s . p r e v S P . get ( A r r a y s . t o S t r i n g ( key . g e t B y t e s () ) ) != SP ) { t h i s . p o s i t i o n s . add ( d a t a . l a t i t u d e ) ;

p o s i t i o n s . add ( d a t a . l o n g i t u d e ) ; p o s i t i o n s . add ( d a t a . t y p e ) ; t h i s . p o s i t i o n s . add ( SP ) ;

Z o r d e r I n t e r f a c e z o r d e r = new Z o r d e r ( p o s i t i o n s ) ; b y t e [] S P K e y = z o r d e r . g e t Z o r d e r () ;

Key m a s t e r P e e r K e y = new B y t e A r r a y K e y ( S P K e y ) ; n e x t N o d e . put ( A r r a y s . t o S t r i n g ( key . g e t B y t e s () ) ,

t r i n g . g e t R e s p o n s i b l e P e e r ( m a s t e r P e e r K e y ) ) ;

t h i s . p r e v S P . put ( A r r a y s . t o S t r i n g ( key . g e t B y t e s () ) , SP ) ; } e l s e if ( r e s t T i m e . get ( A r r a y s . t o S t r i n g ( key . g e t B y t e s () ) )

- d a t a . c h u n k > 0) {

t h i s . n e x t N o d e . put ( A r r a y s . t o S t r i n g ( key . g e t B y t e s () ) , c u r r e n t P e e r . f i n d S u c c e s s o r ( c u r r e n t P e e r . g e t N o d e A d d i n g O n e I D () ) ) ;

}

t h i s . r e s t T i m e . put ( A r r a y s . t o S t r i n g ( key . g e t B y t e s () ) , d a t a . s t a r t P o i n t - d a t a . c h u n k ) ;

} }

}

Listing 5.2 データ取得時の保存ピア発見

p u b l i c c l a s s N e x t R e t r i e v e P e e r { p r i v a t e T R i n g I m p l t r i n g ;

p r i v a t e HashMap < String , Node > n e x t N o d e ; p r i v a t e HashMap < String , Long > r e s t T i m e ; p r i v a t e HashMap < String , Long > p r e v S P ; A r r a y L i s t < Long > r e t r i e v e d D a t a ;

A r r a y L i s t < Long > p o s i t i o n s ;

p u b l i c N e x t R e t r i e v e P e e r ( T R i n g I m p l t r i n g ) { t h i s . p o s i t i o n s = new A r r a y L i s t < Long >() ; t h i s . n e x t N o d e = new HashMap < String , Node >() ; t h i s . r e s t T i m e = new HashMap < String , Long >() ; t h i s . p r e v S P = new HashMap < String , Long >() ; t h i s . r e t r i e v e d D a t a = new A r r a y L i s t < Long >() ; t h i s . t r i n g = t r i n g ;

}

p u b l i c s y n c h r o n i z e d A r r a y L i s t < Long > g e t N e x t R e t r i e v e P e e r ( D a t a F o r R e t r i e v e data , l o n g l a t i t u d e , l o n g l o n g i t u d e , HashMap < String , Long > s e n s o r I n f o , Key key )

s e t N e x t R e t r i e v e P e e r ( data , l a t i t u d e , l o n g i t u d e , s e n s o r I n f o , key ) ; r e t u r n t h i s . r e t r i e v e d D a t a ;

}

p r i v a t e s y n c h r o n i z e d v o i d s e t N e x t R e t r i e v e P e e r ( D a t a F o r R e t r i e v e data , l o n g l a t i t u d e , l o n g l o n g i t u d e , HashMap < String , Long > s e n s o r I n f o , Key key ) t h r o w s C o m m u n i c a t i o n E x c e p t i o n {

S t r i n g tag = A r r a y s . t o S t r i n g ( key . g e t B y t e s () ) ; l o n g c u r r e n t T i m e = d a t a . t i m e F r o m ;

l o n g S P T i m e = s e n s o r I n f o . get ( " SP " ) ; l o n g c h u n k = s e n s o r I n f o . get ( " c h u n k " ) ;

l o n g c o n f i g T i m e = s e n s o r I n f o . get ( " c o n f i g T i m e " ) ; l o n g SP = ( c u r r e n t T i m e - c o n f i g T i m e ) / S P T i m e ;

l o n g p a s t T i m e = c u r r e n t T i m e - c o n f i g T i m e - ( SP * S P T i m e ) ; l o n g l e f t C h a n g e T i m e = S P T i m e - p a s t T i m e ;

l o n g l e f t T i m e = d a t a . t i m e T o - c u r r e n t T i m e ;

A r r a y L i s t < Long > p o s i t i o n s = new A r r a y L i s t < Long >() ; p o s i t i o n s . add ( l a t i t u d e ) ;

p o s i t i o n s . add ( l o n g i t u d e ) ; p o s i t i o n s . add ( d a t a . t y p e ) ; p o s i t i o n s . add ( SP ) ;

Z o r d e r I n t e r f a c e z o r d e r = new Z o r d e r ( p o s i t i o n s ) ; b y t e [] S P K e y = z o r d e r . g e t Z o r d e r () ;

Key m a s t e r P e e r K e y = new B y t e A r r a y K e y ( S P K e y ) ;

n e x t N o d e . put ( tag , t r i n g . g e t R e s p o n s i b l e P e e r ( m a s t e r P e e r K e y ) ) ; N o d e c u r r e n t N o d e = n e x t N o d e . get ( tag ) ;

w h i l e ( l e f t T i m e > 0) { l e f t T i m e -= c h u n k ; l e f t C h a n g e T i m e -= c h u n k ; if ( l e f t C h a n g e T i m e > 0) {

t h i s . r e t r i e v e d D a t a . a d d A l l ( t r i n g . r e t r i e v e D a t a ( key , t h i s . n e x t N o d e . get ( tag ) ) ) ;

t h i s . n e x t N o d e . put ( tag ,

t h i s . n e x t N o d e . get ( tag ) . f i n d S u c c e s s o r ( t h i s . n e x t N o d e . get ( tag ) . g e t N o d e A d d i n g O n e I D () ) ) ; } e l s e {

l e f t C h a n g e T i m e += S P T i m e ;

p o s i t i o n s . set (3 , p o s i t i o n s . get (3) + 1) ; z o r d e r = new Z o r d e r ( p o s i t i o n s ) ;

S P K e y = z o r d e r . g e t Z o r d e r () ;

m a s t e r P e e r K e y = n e w B y t e A r r a y K e y ( S P K e y ) ;

t h i s . n e x t N o d e . put ( tag , t h i s . n e x t N o d e . get ( tag ) . f i n d S u c c e s s o r ( t h i s . n e x t N o d e . get ( tag ) . g e t N o d e A d d i n g O n e I D () ) ) ;

t h i s . r e t r i e v e d D a t a . a d d A l l ( t r i n g . r e t r i e v e D a t a ( key , t h i s . n e x t N o d e . get ( tag ) ) ) ; }

} }

}

5.1.6 センサ管理モジュール

本モジュールはセンサネットワーク内のセンサ毎の緯度,経度,センサタイプ,などを管理を行 うモジュールである.センサが環境に設置された際に,そのセンサの情報を所属する保存ピアへ登 録する.また,センサの移動により,緯度,経度の変更が発生した際に,その情報を更新する.

センサが環境に設置を行う際,以下のようなセンサ情報登録クラスのインスタンスを用い て SensorInfo.csvに登録を行う.SensorInfo.csv に登録されるエントリは,各センサごとに,

sensorIdlatitudelongitudesensorTypechunkTimestartPointTimeである.センサの設置 場所が変更された際は,sensorIdから対象のエントリを発見し,変更を行う.このSensorInfo.csv の情報は,センサ情報保存モジュール,データ保存モジュールで利用される.以下がセンサ情報の 登録,変更のメインクラスである.

5.1.7 アプリケーションモジュール

本モジュールはユーザアプリケーションに対してのデータ取得のインターフェースを提供し,

ユーザアプリケーションは5.1.1で述べたクエリを本モジュールに送信する.本モジュールとは TCPで通信を行い.7777番ポートを利用する.ユーザアプリケーションとのセッションが確立

ドキュメント内 慶應義塾大学 環境情報学部 寺山淳基 (ページ 37-44)

関連したドキュメント