annotate paper/chapter1.tex @ 28:46a09e9020a3

modify chapter1
author sugi
date Thu, 05 Feb 2015 04:23:37 +0900
parents a27c97e0bb15
children 9d3fadcc379d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
295b393a7134 first commit
sugi
parents:
diff changeset
1 \chapter{分散フレームワーク Alice の概要} \label{chapter:chapter1}
22
fd43827452ad modify chapter1
sugi
parents: 20
diff changeset
2 この章では、Aliceの計算モデルを説明した後、実際にどのように実装されているかを説明する。
20
6ee0c7a04e2f modify computation
sugi
parents: 19
diff changeset
3 \section{Data SegmentとCode Segment}\label{subsection:computation}
25
sugi
parents: 23
diff changeset
4 AliceはデータをData Segment、(以下DS)タスクをとCode Segment(以下CS)という単位に分割してプログラミングを行う。
sugi
parents: 23
diff changeset
5 DSはAliceが内部にもつデータベースによって管理されている。DSに対応する一意のkeyが設定されており、そのkeyを用いてデータベースを操作する。
18
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
6
25
sugi
parents: 23
diff changeset
7 CSは実行に必要なDSが揃うと実行されるという性質を持つ。そして入力されたDSに応じた結果が出力される。
27
a27c97e0bb15 add appendix
sugi
parents: 26
diff changeset
8 入力されるDSはInput DS、出力されるDSはOutput DSと呼ばれる(図 \ref{fig:dsandcs})。Input DSはそのCSを実行するために必要なデータであり、Output DSはCSが計算を行った後に出力されるデータである。
18
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
9
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
10
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
11 \begin{figure}[htbp]
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
12 \begin{center}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
13 \includegraphics[width=100mm]{images/dsandcs.pdf}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
14 \end{center}
25
sugi
parents: 23
diff changeset
15 \caption{CSはInput DS とOutput DSをもつ}
18
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
16 \label{fig:dsandcs}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
17 \end{figure}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
18
27
a27c97e0bb15 add appendix
sugi
parents: 26
diff changeset
19 CSに依存するデータであると出力されるデータを記述することにより、CSが実行される順番が決定される(図 \ref{fig:dsandcs2})。データの依存関係にないCSは並列実行が可能であるため、並列度を上げるためにはCSの処理内容を細かく分割して依存するデータを少なくするのが望ましい。
18
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
20
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
21
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
22 \begin{figure}[htbp]
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
23 \begin{center}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
24 \includegraphics[width=110mm]{images/dsandcs2.pdf}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
25 \end{center}
25
sugi
parents: 23
diff changeset
26 \caption{Input DS とOut put DSがCS間の依存関係を自動的に記述する}
18
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
27 \label{fig:dsandcs2}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
28 \end{figure}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
29
20
6ee0c7a04e2f modify computation
sugi
parents: 19
diff changeset
30 \section{ComputationとMeta Computation}
28
46a09e9020a3 modify chapter1
sugi
parents: 27
diff changeset
31 AliceのComputationは、keyで指し示されるDSを待ち合わせてCSを実行させると定義できる。
46a09e9020a3 modify chapter1
sugi
parents: 27
diff changeset
32 それに対して、AliceのMeta Computationは、AliceのComputationを支えているComputationのプログラミングと定義できる。
19
6b470aab9a41 modify chapter1
sugi
parents: 18
diff changeset
33
28
46a09e9020a3 modify chapter1
sugi
parents: 27
diff changeset
34 例えば、トポロジーを指定するAPIはMeta Computationである。Aliceが動作するためにはトポロジーを決める必要がある。つまりトポロジーの構成はAliceのComputationを支えているComputationとみなすことができる。トポロジーが決定するとそのトポロジーを構成する計算が行われる。トポロジーを指定するAPIはその構成の計算をプログラミングして変更するものである。
46a09e9020a3 modify chapter1
sugi
parents: 27
diff changeset
35 他にも再接続の動作を決めるAPIや切断時の動作を決めるAPIはMeta Computationである。
46a09e9020a3 modify chapter1
sugi
parents: 27
diff changeset
36
46a09e9020a3 modify chapter1
sugi
parents: 27
diff changeset
37 これらのMeta ComputationがAliceのComputationに影響することはない。プログラマーはCSを記述する際にトポロジーや切断、再接続という状況を予め想定した処理にする必要はない。プログラマーは目的の処理だけ記述する。そして、切断や再接続が起こった場合の処理を記述しMeta Computationで指定する。
46a09e9020a3 modify chapter1
sugi
parents: 27
diff changeset
38 このようにプログラムすることで、通常処理と例外処理を分離することができるため、シンプルなプログラムを記述できる。
18
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
39
25
sugi
parents: 23
diff changeset
40 \section{Data Segment}
sugi
parents: 23
diff changeset
41 複数のスレッドから1つのデータに変更を行うためには、データの不整合を防ぐためのlockが必要になる。
sugi
parents: 23
diff changeset
42 複数の関係のない要素を1つのデータオブジェクトで表現した場合、全ての操作でlockが必要になる。
sugi
parents: 23
diff changeset
43 このlockがスケラビリティーを低下させる。つまりデータのサイズも並列計算には重要である。
sugi
parents: 23
diff changeset
44
sugi
parents: 23
diff changeset
45 Aliceはデータを細かく分割して記述する。その細かく分割されたデータをDSと呼ぶ。
26
sugi
parents: 25
diff changeset
46 実際には特定のオブジェクトにマッピングされ、マッピングされたクラスを通してアクセスされる。
25
sugi
parents: 23
diff changeset
47
26
sugi
parents: 25
diff changeset
48 \section{Data Segment Manager}
sugi
parents: 25
diff changeset
49 DSは実際にはqueueに保存される。queueには対になるkeyが存在し、keyの数だけqueueが存在する。
sugi
parents: 25
diff changeset
50 このkeyを指定してDSの保存、取得を行う。
sugi
parents: 25
diff changeset
51 queueの集合体はデータベースとして捉えられる。
25
sugi
parents: 23
diff changeset
52 このデータベースをAliceではDS Manager(以下DSM)と呼ぶ。
26
sugi
parents: 25
diff changeset
53 DSMにはLocal DSMとRemote DSMが存在する。Local DSMは各ノード固有のデータベースである。
sugi
parents: 25
diff changeset
54 Remote DSMは他のノードのLocal DSMであり、接続しているノードの数だけ存在する。(図\ref{fig:RemoteDSM})
sugi
parents: 25
diff changeset
55 Remote DSMにも対になるkeyが存在し、そのkeyを指定して利用する。
sugi
parents: 25
diff changeset
56 Local DSMへのアクセスはノード内部で逐次化される。
18
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
57
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
58 \begin{figure}[htbp]
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
59 \begin{center}
26
sugi
parents: 25
diff changeset
60 \includegraphics[width=100mm]{images/remote_datasegment.pdf}
18
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
61 \end{center}
26
sugi
parents: 25
diff changeset
62 \caption{Remote DSMは他のノードのLocal DSMのproxy }
18
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
63 \label{fig:RemoteDSM}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
64 \end{figure}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
65
25
sugi
parents: 23
diff changeset
66
sugi
parents: 23
diff changeset
67 \section{Data Segment API}
sugi
parents: 23
diff changeset
68 以下のData Segment APIを用いてデータベースにアクセスする。
sugi
parents: 23
diff changeset
69 \begin{itemize}
sugi
parents: 23
diff changeset
70 \item \verb+void put(String key, Object val)+
sugi
parents: 23
diff changeset
71 \item \verb+void update(String key, Object val)+
sugi
parents: 23
diff changeset
72 \item \verb+void peek(String key)+
sugi
parents: 23
diff changeset
73 \item \verb+void take(String key)+
sugi
parents: 23
diff changeset
74 \end{itemize}
sugi
parents: 23
diff changeset
75 putとupdateはDSを追加する際に、peekとtakeはDSを取得する際に使用する。
sugi
parents: 23
diff changeset
76
sugi
parents: 23
diff changeset
77 \subsubsection{put}
26
sugi
parents: 25
diff changeset
78 DSをqueueに追加するためのAPIである。第一引数に対応するqueueに対してDSを追加している。
25
sugi
parents: 23
diff changeset
79 \subsubsection{update}
26
sugi
parents: 25
diff changeset
80 updateもqueueに追加するためのAPIである。putとの違いは、先頭のDSを削除してからDSを追加することである。そのためAPI実行前後でqueueの中にあるDSの個数は変わらない。
25
sugi
parents: 23
diff changeset
81
sugi
parents: 23
diff changeset
82 \subsubsection{take}
26
sugi
parents: 25
diff changeset
83 takeはDSを読み込むためのAPIである。読み込まれたDSは削除される。要求したDSが存在しなければ、CSの待ち合わせ (Blocking)が起こる。putやupdateによりDSに更新があった場合、takeが直ちに実行される。
25
sugi
parents: 23
diff changeset
84
sugi
parents: 23
diff changeset
85 \subsubsection{peek}
26
sugi
parents: 25
diff changeset
86 peekもDSを読み込むAPIである。takeとの違いは読み込まれたDSが削除されないことである。
25
sugi
parents: 23
diff changeset
87
sugi
parents: 23
diff changeset
88 DSの表現にはMessage Packを利用している。Message Packに関してJavaにおけるデータ表現は以下の3種類があり、制限を伴うが互いに変換可能である。
18
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
89 \begin{itemize}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
90 \item {\ttfamily 一般的なJavaのクラスオブジェクト}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
91 \item {\ttfamily MessagePack for JavaのValueオブジェクト}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
92 \item {\ttfamily byte[]で表現されたbinary}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
93 \end{itemize}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
94
25
sugi
parents: 23
diff changeset
95 DS APIの内部においてデータは、一般的なJavaのクラスオブジェクトまたはbyteArrayで表現されたbinaryで表現されている。
23
6a9525138c2e remove no use file
sugi
parents: 22
diff changeset
96 Localからデータがputされた場合は一般的なJavaのクラスオブジェクトの状態でenQueueされる。RemoteからデータがputされるとbyteArrayで表現されたbinaryの状態でenQueueされる。
18
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
97
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
98 ユーザーが一般的なクラスをIDL(Interface Definition Language)のように用いてデータを表現することができる。
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
99 この場合、クラス宣言時に@Messageというアノテーションをつける必要がある。もちろん、MessagePackで扱うことのできるデータのみをフィールドに入れなければならない。
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
100
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
101 Remoteに対してputできるデータは、@MessageをもつクラスオブジェクトかMessage Packで扱える型に限られる。
17
675939a7f983 change experiment picture
sugi
parents: 15
diff changeset
102
25
sugi
parents: 23
diff changeset
103 \section{Code Segment}
sugi
parents: 23
diff changeset
104 Alice上で実行されるタスクの単位がCSである。ユーザーはCSを組み合わせることでプログラミングを行う。CSをユーザーが記述する際に、内部で使用するDSの作成を記述する。
23
6a9525138c2e remove no use file
sugi
parents: 22
diff changeset
105
25
sugi
parents: 23
diff changeset
106 Input DS と Output DSはCSに用意されているAPIを用いて作成する。
sugi
parents: 23
diff changeset
107 Input DSは、LocalかRemoteか、またkeyを指定する必要がある。CSは、記述したInput DSが全て揃うとThread poolに送られ、実行される。
23
6a9525138c2e remove no use file
sugi
parents: 22
diff changeset
108
25
sugi
parents: 23
diff changeset
109 Output DSもLocalかRemoteか、またkeyを指定する必要がある。
18
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
110 Inputの場合はsetKeyを呼ぶ際、Outputの場合はput(またはupdate)の際にノードとkeyの指定を行っている。
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
111 しかし、どの時点でノードとkeyの指定を行えばよいか、どのようなAPIを用意するべきかは、議論の余地がある。
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
112
26
sugi
parents: 25
diff changeset
113 \section{Code Segmentの記述方法}
sugi
parents: 25
diff changeset
114 CSをユーザーが記述する際にはCSを継承して記述する(ソースコード \ref{src:StartCodeSegment} ,\ref{src:CodeSegment})。
sugi
parents: 25
diff changeset
115 継承することによりCode Segmentで使用するAPIを利用する事ができる。
18
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
116
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
117 \begin{table}[html]
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
118 \lstinputlisting[label=src:StartCodeSegment, caption=StartCodeSegmentの例]{source/StartCodeSegment.java}
26
sugi
parents: 25
diff changeset
119 \lstinputlisting[label=src:CodeSegment, caption=CodeSegmentの例]{source/TestCodeSegment.java}
18
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
120 \end{table}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
121
26
sugi
parents: 25
diff changeset
122 Alice には、Start CS (ソースコード \ref{src:StartCodeSegment})というC の main に相当するような最初に実行される CS がある。
25
sugi
parents: 23
diff changeset
123 Start CSはどのDSにも依存しない。つまりInput DSを持たない。
sugi
parents: 23
diff changeset
124 このCSをmainメソッド内でnewし、executeメソッドを呼ぶことで実行を開始させることができる。
18
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
125
26
sugi
parents: 25
diff changeset
126 ソースコード \ref{src:StartCodeSegment}は、5行目で次に実行させたいCS(ソースコード \ref{src:CodeSegment})を作成している。8行目でOutput DSMを通してLocal DSMに対してDSをputしている。
25
sugi
parents: 23
diff changeset
127 Output DSMはCSの{\tt ods}というフィールドを用いてアクセスする。
26
sugi
parents: 25
diff changeset
128 Output DSMは{\tt put}と{\tt update}を実行することができる。
18
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
129 \begin{itemize}
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
130 \item \verb+void put(String managerKey, String key, Object val)+
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
131 \item \verb+void update(String managerKey, String key, Object val)+
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
132 \end{itemize}
26
sugi
parents: 25
diff changeset
133 TestCodeSegmentはこの"cnt"というkeyに対して依存関係があり、8行目でupdateが行われるとTestCodeSegmentは実行される。
18
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
134
26
sugi
parents: 25
diff changeset
135 ソースコード\ref{src:CodeSegment}は、0から10までインクリメントする例題である。
sugi
parents: 25
diff changeset
136 2行目で取得されたDSが格納される受け皿を作る。Input DSMがもつcreateメソッド使うことで作成できる。
sugi
parents: 25
diff changeset
137 \begin{itemize}
sugi
parents: 25
diff changeset
138 \item {\ttfamily Receiver create(CommandType type)}
sugi
parents: 25
diff changeset
139 \end{itemize}
sugi
parents: 25
diff changeset
140
sugi
parents: 25
diff changeset
141 引数にはCommandTypeが取られ、指定できるCommandTypeは{\tt PEEK}または{\tt TAKE}である。
sugi
parents: 25
diff changeset
142 Input DSM はCSの{\tt ids}というフィールドを用いてアクセスする。
sugi
parents: 25
diff changeset
143
sugi
parents: 25
diff changeset
144 4行目から6行目はコンストラクタである。コンストラクタはオブジェクト指向のプログラミング言語で新たなオブジェクトを生成する際に呼び出されて内容の初期化を行う関数である。
sugi
parents: 25
diff changeset
145
sugi
parents: 25
diff changeset
146 TestCodeSegmentのコンストラクタが呼ばれた際には、
sugi
parents: 25
diff changeset
147 \begin{enumerate}
sugi
parents: 25
diff changeset
148 \item TestCodeSegmentが持つフィールド変数Receiver input1の定義が行われる。
sugi
parents: 25
diff changeset
149 \item 次にCSのコンストラクタが呼ばれ、CSが持つフィールド変数の定義と初期化が行われる。
sugi
parents: 25
diff changeset
150 \item {\tt ids.create(CommandType.TAKE)}が行われ、input1の初期化が行われる。
sugi
parents: 25
diff changeset
151 \item 最後にTestCodeSegmentのコンストラクタの5行目が実行される。
sugi
parents: 25
diff changeset
152 \end{enumerate}
sugi
parents: 25
diff changeset
153
sugi
parents: 25
diff changeset
154 5行目はInput DSMがもつsetKeyメソッドによりLocal DSMからDSを取得している。
sugi
parents: 25
diff changeset
155 \begin{itemize}
sugi
parents: 25
diff changeset
156 \item \verb+void setKey(String managerKey, String key)+
sugi
parents: 25
diff changeset
157 \end{itemize}
sugi
parents: 25
diff changeset
158 setKeyメソッドにより、どのDSMのあるkeyに対してpeekまたはtakeコマンドを実行させるかを指定できる。コマンドの結果がレスポンスとして届き次第CSは実行される。
sugi
parents: 25
diff changeset
159
sugi
parents: 25
diff changeset
160 runメソッドの内容としては10行目で取得されたDSをInteger型に変換してcountに代入している。
sugi
parents: 25
diff changeset
161 16行目で もう一度TestCodeSegmentのCSが作られる。
sugi
parents: 25
diff changeset
162 17行目でcountの値をインクリメントしてLocal DSMに値を追加する。
sugi
parents: 25
diff changeset
163 13行目が終了条件であり、countの値が10になれば終了する。
22
fd43827452ad modify chapter1
sugi
parents: 20
diff changeset
164
25
sugi
parents: 23
diff changeset
165 \section{Meta Data Segment}
sugi
parents: 23
diff changeset
166 DSは、アプリケーションに管理されているデータのことである。アプリケーションを構成するCSによってその値は変更される。
sugi
parents: 23
diff changeset
167 それに対してMeta DSは、分散フレームワークAliceが管理しているデータである。Aliceを構成するCSによってのみ、その値は変更される。一部のMeta DSはアプリケーションに利用することができる。
22
fd43827452ad modify chapter1
sugi
parents: 20
diff changeset
168
25
sugi
parents: 23
diff changeset
169 例えば、"start"というkeyでは、ノードがStart CSを実行可能かどうかの状態を表す。他にも"\_CLIST"というkeyでは、利用可能なRemote DSの一覧が管理されている。ユーザーはこの一覧にある名前を指定することで、動的にDSの伝搬などを行うことができる。
22
fd43827452ad modify chapter1
sugi
parents: 20
diff changeset
170
25
sugi
parents: 23
diff changeset
171 また、Input DSに付随しているものもある。Input DSはCS内部でReceiverという入れ物に格納される。ユーザーは、Receiverに対して操作することでDSを入手できる。
sugi
parents: 23
diff changeset
172 このReceiverには、fromというフィールドがあり、このDSを誰がputしたという情報が入っている。この情報をデータの伝搬する際に利用することで、DSをputしたノードに送り返すことを防ぐことができる。
18
d2eeb833c75e modify chapter2
sugi
parents: 17
diff changeset
173
25
sugi
parents: 23
diff changeset
174 Meta DSはDS同様にDS APIを用いて取得できる。
22
fd43827452ad modify chapter1
sugi
parents: 20
diff changeset
175
25
sugi
parents: 23
diff changeset
176 \section{Meta Code Segment}
sugi
parents: 23
diff changeset
177 CSはアプリケーションを動作させるために必要なタスクであり、ユーザーによって定義される。
sugi
parents: 23
diff changeset
178 それに対してMeta CSはAliceを構成するタスクである。つまりMeta CSの群はAliceのComputationと言い換えることができる。一部のみユーザーが定義をすることができ、Aliceの挙動を変更することができる。
sugi
parents: 23
diff changeset
179
sugi
parents: 23
diff changeset
180 \section{Topology Manager}
26
sugi
parents: 25
diff changeset
181 Aliceにおけるノードの管理は全てTopology Managerで管理される。Topology Managerの詳細は付録で示す。