9
|
1 \section{分散ネットフレームワークAlice}
|
|
2 Alice\cite{kono11g}は、本研究室で開発を行なっている分散管理フレームワークである。Cell用の並列フレームワークCerium\cite{kono09b} \cite{cerium-sourceforge}に似たタスク管理機構とLinda\cite{linda} を相互接続した分散フレームワークであるFederated Linda\cite{kono05b}\cite{kono10d}に似たData Semgnetの通信構造をもつ。
|
|
3
|
|
4 まず、Aliceを使用するに必要なData Segment、Code Segmentについて説明を行う。
|
|
5 \subsection{Data Segment API}
|
|
6 Data Segmentは数値や文字列などのデータを構造体的に保持する。AliceはData Segmentをデータベース的に扱う。しかし、Aliceは通常のデータベースとは異なりKey毎にキューがある。Data Segmentはキューにput した順番に取得することができる。これはLindaに準じた設計となっている。
|
|
7
|
|
8 Data Segmentを管理するのがData Segment Manager(以下DSM)である。ノード毎にキーを持ち他のノードにはRemote DSM経由でアクセスすることができる。つまり、Remote DSMは他のノードのLocal DSMのproxyである。(図 \ref{fig:proxy})他のノードに対するアクセスはキューによって、ノード内部で逐次化される。それ以外は、すべてJavaのThread poolにより並列実行される。
|
|
9 \begin{figure}[tb]
|
|
10 \begin{center}
|
|
11 \scalebox{1.0}{\includegraphics{images/remote_datasegment.pdf}}
|
|
12 \end{center}
|
|
13 \caption{Remote DSMは他のノードの Local DSMのproxy}
|
|
14 \label{fig:proxy}
|
|
15 \end{figure}
|
|
16 以下が用意されているData Segment APIである。これらを用いてData Segmentの送受信を行う。
|
|
17 \begin{itemize}
|
|
18 \item \verb+void put(String key, Value val)+
|
|
19 \item \verb+void update(String key, Value val)+
|
|
20 \item \verb+void peek(Receiver receiver, String key)+
|
|
21 \item \verb+void take(Receiver receiver, String key)+
|
|
22 \end{itemize}
|
|
23
|
|
24 \subsubsection{put}
|
|
25 \verb+put+ はデータを追加するための API である。Key Value Storeのキューに追加される。 (図 \ref{fig:put})
|
|
26
|
|
27 \begin{figure}[htbl]
|
|
28 \begin{center}
|
|
29 \scalebox{1.1}{\includegraphics{images/put.pdf}}
|
|
30 \end{center}
|
|
31 \caption{putはデータを追加する}
|
|
32 \label{fig:put}
|
|
33 \end{figure}
|
|
34
|
|
35
|
|
36 \subsubsection{update}
|
|
37 \verb+update+ はデータを更新するためのAPIである。キューの先頭を置き換える。
|
|
38 (図 \ref{fig:update})
|
|
39
|
|
40
|
|
41 \begin{figure}[htbl]
|
|
42 \begin{center}
|
|
43 \scalebox{1.1}{\includegraphics{images/update.pdf}}
|
|
44 \end{center}
|
|
45 \caption{updateはキューの先頭を書き換える}
|
|
46 \label{fig:update}
|
|
47 \end{figure}
|
|
48
|
|
49 \subsubsection{peek}
|
|
50 peek はデータを取得する。(図 \ref{fig:peek})
|
|
51 \begin{figure}[html]
|
|
52 \begin{center}
|
|
53 \scalebox{1.0}{\includegraphics{images/peek.pdf}}
|
|
54 \end{center}
|
|
55 \caption{peekはデータを取得する}
|
|
56 \label{fig:peek}
|
|
57 \end{figure}
|
|
58
|
|
59
|
|
60 Data Segmentが無ければCode Segmentの待ち合わせが起きる。(図 \ref{fig:no_peek})
|
|
61
|
|
62 \begin{figure}[htbl]
|
|
63 \begin{center}
|
|
64 \scalebox{1.1}{\includegraphics{images/peek1.pdf}}
|
|
65 \end{center}
|
|
66 \caption{希望のデータが無いときは保留する}
|
|
67 \label{fig:no_peek}
|
|
68 \end{figure}
|
|
69
|
|
70 put、updateによりData Segmentの更新があれば、peekが直ちに実行され、待ち合わせを行なっていたCode Segmentがactive queue に移される。
|
|
71
|
|
72 \subsubsection{take}
|
|
73 takeもデータを取得するためのAPIである。(図 \ref{fig:take})peekとの違いは取得されたData SegmentはKey Value Storeのキューから取り除かれる。
|
|
74 \begin{figure}[htbl]
|
|
75 \begin{center}
|
|
76 \scalebox{1.1}{\includegraphics{images/take.pdf}}
|
|
77 \end{center}
|
|
78 \caption{take はデータを読み込む}
|
|
79 \label{fig:take}
|
|
80 \end{figure}
|
|
81
|
|
82 \subsection{Code Segment}
|
|
83
|
|
84 Code Segmentはタスクのことである。Code Segmentをユーザーが記述するときにCode Segment内で使用するData Segmentの作成を記述する。Code SegmentにはInput Data SegmentとOutput Data Segmentを作るAPIが存在する。
|
|
85
|
|
86
|
|
87 Input Data SegmentはRemoteかLocalを指定する必要がある。さらに、どのData Segmentを取るかをキーで指定する。
|
|
88 実際にsetKeyのメソッドを呼んだ時に指定する。
|
|
89 Code Segmentがactiveになるためには、Input Data Segmentが全て揃う必要がある。
|
|
90
|
|
91
|
|
92 Output Data SegmentもRemoteかLocalを指定する。Input と同様にどのキーに対してData Segmentを追加するか指定する。
|
|
93 実際にはputまたはupdateメソッドを呼ぶタイミングでおこなう。
|
|
94
|
|
95 これらのInput/OutputがCode Segment間の依存関係を自動的に記述することになる。
|
|
96
|
|
97 \subsubsection{Code Segmentの実行方法}
|
|
98 Alice には、Start Code Segment (ソースコード \ref{fig:StartCodeSegment})というC の main に相当するような最初に実行される Code Segment がある。
|
|
99 \begin{table}[html]
|
|
100 \lstinputlisting[label=fig:StartCodeSegment, caption=StartCodeSegmentの例]{source/StartCodeSegment.java}
|
|
101 \end{table}
|
|
102
|
|
103 Start Code SegmentはどのData Segmentにも依存しない。つまりInput Data Segmentを持たない。
|
|
104 このCode Segmentをmainメソッド内でnewし、executeメソッドを呼ぶことで実行を開始させることができる。(ソースコード \ref{fig:TestLocalAlice})
|
|
105
|
|
106 \begin{table}[html]
|
|
107 \lstinputlisting[label=fig:TestLocalAlice, caption=Start Code Segmentを実行させる方法]{source/TestLocalAlice.java}
|
|
108 \end{table}
|
|
109
|
|
110 \subsubsection{Code Segmentの記述方法}
|
|
111 Code Segmentをユーザーが記述する際にはCode Segmentを継承して記述する。(ソースコード \ref{fig:CodeSegment})そのCodeSegmentはInputDataSegmentManagerとOutputDataSegmentManagerを利用することができる。
|
|
112
|
|
113 InputDataSegmentManagerはCode Segmentの{\tt ids}というフィールドを用いてアクセスする。
|
|
114
|
|
115
|
|
116
|
|
117 \begin{table}[html]
|
|
118 \lstinputlisting[label=fig:CodeSegment, caption=CodeSegmentの例]{source/TestCodeSegment.java}
|
|
119 \end{table}
|
|
120
|
|
121 \begin{itemize}
|
|
122 \item {\ttfamily Receiver create(CommandType type)}
|
|
123 \end{itemize}
|
|
124 createでコマンドが実行された際に取得されるData Segmentが格納される受け皿を作る。引数にはCommandTypeが取られ、指定できるCommandTypeは{\tt PEEK}または{\tt TAKE}である。
|
|
125 \begin{itemize}
|
|
126 \item {\ttfamily void setKey(String managerKey, String key)}
|
|
127 \end{itemize}
|
|
128 setKeyメソッドにより、どこのData Segmentのあるkeyに対してpeekまたはtakeコマンドを実行させるかを指定することができる。
|
|
129 コマンドの結果がレスポンスとして届き次第Code Segmentは実行される。
|
|
130
|
|
131 OutputDataSegmentManagerはCode Segmentの{\tt ods}というフィールドを用いてアクセスする。
|
|
132 OutPutDataSegmentManagerは{\tt put}または{\tt update}を実行することができる。
|
|
133 \begin{itemize}
|
|
134 \item {\ttfamily void put(String managerKey, String key, \\ Value val)}
|
|
135 \item {\ttfamily void update(String managerKey, String key, Value val)}
|
|
136 \end{itemize}
|
|
137
|
|
138
|
|
139
|
|
140 \section{Message Pack }
|
|
141 Data Segmentのデータの表現にはMessage Packを利用している。Message Packに関してJavaにおけるデータ表現は以下の3つある。
|
|
142 \begin{itemize}
|
|
143 \item {\ttfamily 一般的なJavaのクラスオブジェクト}
|
|
144 \item {\ttfamily MessagePack for JavaのValueオブジェクト}
|
|
145 \item {\ttfamily byte[]で表現されたバイナリ}
|
|
146 \end{itemize}
|
|
147
|
|
148 Data Segmentは、MessagePack for JavaのValueオブジェクトを用いてデータが表現されている。
|
|
149 MessagePackはJavaのように静的に型付けされたオブジェクトではなく、自己記述なデータ形式である。
|
|
150 MessagePack for JavaのValueオブジェクトはMessagePackのバイナリにシリアライズできる型のみで構成されたJavaのオブジェクトである。
|
|
151 そのため、Valueも自己記述式のデータ形式になっている。
|
|
152
|
|
153 Valueオブジェクトは通信に関わるときには、シリアライズ・デシリアライズを高速に行うことができる。
|
|
154 ユーザーはメソッドを用いてオブジェクト内部のデータを閲覧、編集することができる。
|
|
155
|
|
156 ユーザーが一般的なクラスをIDL(Interface Definition Language)のように用いてデータを表現することができる。
|
|
157 この場合、クラス宣言時に@Messageというアノテーションをつける必要がある。
|
|
158 ただし、MessagePackで扱うことのできるデータのみをフィールドに入れなければならない。 |