176
|
1 title: 分散フレームワークChristieの設計
|
|
2 author: 照屋のぞみ
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
3
|
177
|
4 # 研究目的(1/2)
|
|
5 * スケーラブルで信頼性の高い分散プログラムを書くのは容易ではない
|
|
6 * 並列で動く分散した資源を意識するのは難しい
|
|
7 * 分散したノードの洗濯方法が明確ではない
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
8 * 当研究室が開発している並列分散フレームワークAliceではスケーラブルな分散プログラムを信頼性高く記述できる環境を実現する。
|
177
|
9 * ここで言う信頼性とは定められた環境下で安定して仕様に従った動作を行うことを指す。
|
|
10 * 仕様の記述のしやすさ、可読性、拡張時に仕様変更を抑えられるかも含む
|
|
11 * スケーラビリティとはサービス利用者が増加したとき単純にノードを追加するだけで線形に性能を向上させる能力
|
176
|
12
|
177
|
13 # 研究目的(2/2)
|
|
14 * 本研究では、Aliceの通信の信頼性を高めるためにNAT越えの機能設計を提案する
|
|
15 * そしてその実現にはAliceの再設計が必要であることを示す
|
|
16 * Aliceの問題点を整理し、得られた知見をもとに分散フレームワークChristieの設計を行う
|
176
|
17
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
18
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
19 # 目次
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
20 * Aliceの概要
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
21 * Code Segment / Data Segment
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
22 * Data Segment Manager
|
176
|
23 * API
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
24 * Computation / Meta Computation
|
176
|
25 * Topology Manager
|
|
26 * 圧縮
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
27 * Topology Managerの拡張設計
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
28 * 別トポロジー間の接続のための設計
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
29 * 別ネットワーク間の接続のための設計
|
176
|
30 * Aliceの問題点
|
|
31 * LocalDSMの複数立ち上げができない
|
|
32 * 記述の煩雑さ
|
|
33 * Christieの設計
|
|
34 * 基本設計
|
|
35 * 記述性の改善
|
|
36 * 他フレームワークとの比較
|
|
37 * Akka, Hazelcast
|
|
38 * 設計思想の違い
|
|
39 * 記述性の違い
|
|
40 * 提供する機能
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
41 * まとめ
|
176
|
42 * 今後の課題
|
|
43
|
|
44
|
|
45
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
46
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
47 # Data Segment と Code Segment
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
48 * Aliceではデータを **Data Segment(DS)** 、タスクを **Code Segment(CS)** という単位に分割して依存関係を記述することでプログラミングを行う。
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
49 * CSはInput DS(入力されるDS)とOutput DS(出力されるDS)を持つ。
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
50 * CSはkeyで指定されたDSが揃うと実行されるという性質を持つ。
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
51 {:width="50%"}
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
52
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
53 # CodeSegmentの依存関係
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
54 * データの依存関係にないCSは並列実行される
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
55 * データの依存関係がある場合は Input DS が揃うと順に実行される
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
56 * DSはCSに専有されるためロックの記述を必要としない
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
57 {:width="60%"}
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
58
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
59 # Data Segment と CodeSegment
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
60 * AliceはJavaで実装されており、DSはJava-Object、CSはRunnableに相当する
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
61 * ユーザーが記述する際には CodeSegment.class を継承することでDSを操作するためのAPIを利用して依存関係を記述することができる。
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
62
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
63 # Data Segment Manager
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
64 * DS の集合体であるデータベースを Alice では **DS Manager(DSM)** と呼ぶ。
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
65 * DSM 内の DS には対応する一意の String型のkey が存在し、 DSM 名と key を指定しすることで DS の保存、取得を行う。
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
66 {:width="50%"}
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
67
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
68 # Data Segment Manager
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
69 * Local DSM … 各ノード固有のデータベース
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
70 * Remote DSM … 他のノードのLocal DSMのproxy。接続しているノードの数だけ存在する。
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
71 * Remote DSMに書き込むと対応するノードのLocalDSMに書き込まれる
|
176
|
72 * Remote DSMにはString型のDSM keyを指定してアクセスする
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
73 {:width="50%"}
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
74
|
176
|
75 # Data Segment API
|
|
76 * DSの取得
|
|
77 * `void take(String managerKey, String key)`
|
|
78 * `void peek(String managerKey, String key)`
|
|
79 * DSの追加
|
|
80 * `void put(String managerKey, String key, Object val)`
|
|
81 * `void update(String managerKey, String key, Object val)`
|
|
82 * `void flip(String managerKey, String key, Receiver val)`
|
|
83
|
|
84 # Code Segmentの記述例
|
|
85 * take/peekをするにはcreate/setKeyメソッドを使わなければならない
|
|
86 * *create* でインプットDGのRecieverを作り、*setKey* でReceiverにインプットとなるkeyを指定
|
|
87 * データをReceiverから取り出す際は *asClass()* で型を指定
|
|
88 * 処理をループさせたい場合はCSをnewする
|
|
89 ```java
|
|
90 public class TestCodeSegment extends CodeSegment {
|
|
91 private Receiver input = ids.create(CommandType.TAKE);
|
|
92
|
|
93 public TestCodeSegment() {
|
|
94 input.setKey("count");
|
|
95 }
|
|
96
|
|
97 @Override
|
|
98 public void run() {
|
|
99 int count = input.asClass(Integer.class);
|
|
100 System.out.println("data = " + count);
|
|
101
|
|
102 new TestCodeSegment();
|
|
103
|
|
104 ods.put("count", count);
|
|
105 }
|
|
106 }
|
|
107 ```
|
|
108
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
109 # Computation と Meta Computation
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
110 * Aliceでは、計算の本質的な処理をComputatin、Computationとは別のレベルでそれを支える処理をMeta Computationとして分けて考える。
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
111 * Alice のComputationは、keyによりDSを待ち合わせ、DSが揃ったCSを並列に実行する処理
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
112 * Meta Computationはそれを実現している処理
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
113 * DSの待ち合わせ
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
114 * 分散トポロジーの構成
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
115 * 通信の切断・再接続時の処理
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
116 * データの表現形式の選択
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
117
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
118 # Computation と Meta Computation
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
119 * 分散環境構築などの複雑な処理をAliceがMeta Computationとして提供する
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
120 * プログラマは目的の処理だけ記述し通信部分などはMeta Computationを指定する
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
121 * シンプルで見通しの良いコードを保つ
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
122
|
176
|
123 # AliceのMeta Computation - Topology Manager/Topology Node
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
124 * Topology Manager
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
125 * ノード間の接続管理やトポロジーの構成管理行うMeta Computation
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
126 * Static Topology ManagerとDynamic Topology Managerがある
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
127 * Topology Node
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
128 * 各ノード側でTopology Managerとの通信を行うMeta Computation
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
129 * ノードアプリケーションを記述する際にTopology Nodeをnewしておけば以降のTopology Managerとの通信やノード間の接続を行う
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
130 * Topology Manager/NodeもCS/DSを用いて実装されている。
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
131
|
176
|
132 # AliceのMeta Computation - Static Topology Manager
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
133 * プログラマがdot形式のトポロジーファイルを用意し、Topology Managerに読み込ませる
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
134 * トポロジーファイルにはノードの接続関係と接続する際に指定するRemote DSM名を記す
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
135 * Graphvizを用いればトポロジーを描くだけでトポロジーファイルが自動出力されるため構成が容易
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
136
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
137 ```dot
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
138 digraph test{
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
139 node0 −> node1[label=”right”]
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
140 node0 −> node2[label=”left”]
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
141 node1 −> node2[label=”right”]
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
142 node1 −> node0[label=”left”]
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
143 node2 −> node0[label=”right”]
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
144 node2 −> node1[label=”left”]
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
145 }
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
146 ```
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
147
|
176
|
148 # AliceのMeta Computation - Static Topology Manager
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
149 * ファイルを読み込んだTopology Managerを立ち上げる
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
150 * 各Topology NodeはTopology Managerに参加表明をし接続すべきノードの情報を要求する
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
151 {:width="60%"}
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
152
|
176
|
153 # AliceのMeta Computation - Static Topology Manager
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
154 * 参加表明があった順に各ノードにnodeNameを割り当て、接続するべきノードのIPアドレス/ポート番号を送る
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
155 {:width="60%"}
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
156
|
176
|
157 # AliceのMeta Computation - Static Topology Manager
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
158 * Topology Nodeが受け取った情報をもとにRemote DSMを立ちあげ接続し合うことでオーバーレイネットワークが作られる
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
159 * Topology Managerは接続情報を管理し、実際の接続はTopology Nodeが行う
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
160 {:width="60%"}
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
161
|
176
|
162 # AliceのMeta Computation - Dynamic Topology Manager
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
163 * 参加するノード数があらかじめ決まっているとは限らない
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
164 * Dynamic Topology Managerがノードを参加表明順にトポロジーに組み込む
|
176
|
165 * 現在はTree Topologyに対応
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
166
|
176
|
167 # AliceのMeta Computation - 圧縮
|
|
168 * DSは内部に圧縮・非圧縮の複数の形式を複数もつことができる
|
|
169 * 圧縮したデータの伸長と圧縮したままの転送が同時に可能
|
|
170 {:width="80%"}
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
171
|
176
|
172 # AliceのMeta Computation - 圧縮
|
|
173 * 圧縮の指定には宛先DGM keyに"compressed"とつけるだけでよい
|
|
174 `put("compressedRemoteDGM", "key", data)`
|
|
175 * 伸長も *asClass()* した際に自動でされる
|
|
176 * コードの変更が抑えて圧縮・非圧縮が切り替えられる
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
177
|
176
|
178
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
179
|
176
|
180 # Aliceに求められるMeta Computation - アプリケーションの接続
|
|
181 * 別のトポロジーをもった既存のアプリケーション同士をコードの変更を抑えつつ接続させたい
|
|
182 * AliceVNC
|
|
183 * Alice上に実装したツリートポロジーの画面配信システム
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
184 * AliceChat
|
176
|
185 * Alice上に実装したスタートポロジーのチャット
|
|
186 * 連携することで実現したい機能
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
187 * VNC画面のスナップショットをチャットに載せる
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
188 * チャットの内容をVNC画面にコメントとして流す
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
189
|
176
|
190 # Aliceに求められるMeta Computation - アプリケーションの接続
|
|
191 * それぞれのアプリケーションのトポロジーを構成するTopologyManagerを連携させることで可能
|
|
192 {:width="70%"}
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
193
|
176
|
194 # Aliceに求められるMeta Computation - NATを越えた接続
|
|
195 * NATを越えたノード間通信は分散処理の課題である
|
|
196 * Aliceではトポロジー管理がアプリケーションから分離しているため、コードを大きく変更しなくともTopology Managerを増やすことでトポロジーの拡張が可能
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
197
|
176
|
198 # Aliceに求められるMeta Computation - NATを越えた接続
|
|
199 * 各プライベートネットワーク内を管理するPrivate Topology Manager
|
|
200 * グローバルIPアドレスを持ったGlobal Topology Managerを1つ立てる
|
|
201 * TopologyNodeが複数対応できるためPrivate/Global Topology Managerに接続
|
|
202 {:width="70%"}
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
203
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
204
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
205 # 複数のTopology Managerへの対応
|
176
|
206 * 別トポロジーのアプリケーションの連携やNAT越えはノードが複数のTopologyManagerに接続することで可能になる
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
207 * この機能を実現するにはTopology Nodeが各Topology Managerに対応する複数のnodeNameを持つようにする必要がある
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
208 * Topology Nodeは割り当てられたnodeNameをDSとして保持してTopology Managerと通信を行うため、nodeNameの衝突を避けなければならない
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
209
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
210 {:width="50%"}
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
211
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
212 # Local DSMの切り替えによる対応
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
213 * 通常のLocal DSMとは別にTopology ManagerごとのLocal DSMを作成しnodeNameを管理
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
214 * Tpology Manager/Nodeの働きはそのままに、指定するLocal DSMを変えるだけでTopology Managerの複数対応が可能
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
215 {:width="50%"}
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
216
|
176
|
217
|
|
218 # Aliceの問題点 - LocalDSMを複数立ち上げられない
|
|
219 * AliceではDSMを管理するクラスがstaticで書かれていたためLocal DSMを複数立ち上げることができない
|
|
220 * このstaticを抜くにはAliceのコード全体を大きく変更しなければならない
|
|
221 * アプリケーション接続やNAT越えのMeta Computationの追加が困難
|
|
222 * 複数インスタンスを立ち上げての分散プログラムのテストが書けない
|
|
223
|
|
224 # Aliceの問題点 - APIシンタックスの分離
|
|
225 * setKeyは記述場所が決まっておらず、CSの外からも呼べる
|
|
226 * CSの再利用を可能にするが、どのkeyを待っているのか不明なCSが生まれてしまう
|
|
227 * setKeyではkeyを動的に指定することができる
|
|
228 * どんな処理を行っているかわかりづらい
|
|
229 * 対応するput箇所も修正しなければならない
|
|
230 * モデル検査しづらくなる
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
231
|
176
|
232 # Aliceの問題点 - APIシンタックスの分離
|
|
233 * setKeyは全てのcreateが終わった最後に呼ばなければならない
|
|
234 * Input DGの待ち合わせを行うカウンタはcreateの総数を持っている
|
|
235 * カウントが0になると入力が揃ったと判断しrunに入る
|
|
236 * countとsetKeyを交互に書くと入力が揃わないまま実行されNullPointExceptionになる
|
|
237 ```java
|
|
238 class ShowData extends CodeSegment{
|
|
239 private Receiver[] info;
|
|
240
|
|
241 public ShowData(int cnt) {
|
|
242 info = new Receiver[cnt];
|
|
243 for (int i= 0;i < cnt; i++) {
|
|
244 info[i] = ids.create(CommandType.TAKE);
|
|
245 info[i].setKey(SetInfo.array[i]);
|
|
246 }
|
|
247 }
|
|
248
|
|
249 @Override
|
|
250 public void run() {
|
|
251 int size = 0;
|
|
252 for (Receiver anInfo : info) {
|
|
253 DataList dlist = anInfo.asClass(DataList.class);
|
|
254 dlist.showData();
|
|
255 }
|
|
256 }
|
|
257 }
|
|
258 ```
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
259
|
176
|
260 # Aliceの問題点 - 型が推測できない
|
|
261 * Input DSをReceiver型でcreateするため、どの型のデータを待っているのかわからない
|
|
262 * しかしReceiverからデータを取り出すにはasClass()で型を指定する必要がある
|
|
263 * 型をDSをputした箇所までコードをたどる必要がある
|
|
264 * flipでの転送もあるため、それを発見するのは容易ではない
|
|
265
|
|
266 # Aliceの問題点 - まとめ
|
|
267 * 以下の問題がAliceの信頼性・拡張性を下げている
|
|
268 * Local DSMを複数立ち上げられないため、Topology Managerの拡張やテストが困難
|
|
269 * インプットAPIが分離しているためCSでどんな処理が行われているかわかりづらい
|
|
270 * setKyeの記述順序や型を気にしてプログラミングをしなくてはならない
|
|
271
|
|
272 # 分散フレームワークChristieへの必要要件
|
|
273 * Aliceの問題点を踏まえ、フレームワークをChristieを設計する
|
|
274 * staticなLocalDSMをなくし複数インスタンスを立ち上げられるようにすることでスケーラビリティを高める
|
|
275 * 煩雑なAPIをシンプルにし、記述性を高める
|
|
276 * 型の整合性をとれるようにし、信頼性を向上させる
|
|
277
|
|
278 # Christie - 基本設計
|
|
279 * Javaで実装される
|
|
280 * 将来的に当研究室で開発しているGearsOSに統合したい
|
|
281 * GearsOSに倣い、Code Gear(CG)/ Data Gear(DG) という名称を用いる
|
|
282 * CG/DGの依存関係や、DG Manager(DGM)の構造、Remote DGMへの接続方法はAliceと同様である
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
283
|
176
|
284 # Christie - 基本設計
|
|
285 * DGMはLocalもRemoteも全てCode Gear Manager(CGM)が管理する
|
|
286 * 1つのCGMは1つのLocalDGMを持つ
|
|
287 * CGM同士はThreadPoolとCGMのリストを共有している
|
|
288 * メタ計算で全てのCGMにアクセス可能
|
|
289 {:width="60%"}
|
|
290
|
|
291 # Christie - 基本設計
|
|
292 * CG を記述する際は Alice同様CodeGear.classを継承
|
|
293 * CGは *void run(CodeGearManager cgm)* を持ち、run メソッド内に処理を記述
|
|
294 * このようにCGMを持ち運ぶ書き方はGearsOSに合わせてた書き方
|
|
295 * CGを作るためのAPIにはCGM経由で呼び出す
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
296
|
176
|
297 # Christie - DGMの複数立ち上げ
|
|
298 * ChristieではCGMを2つ生成すればLocalDGMも2つ作られる
|
|
299 * 複数のLocalDGM同士のやりとりは、Remoteへの接続と同じようにRemoteDGMを介してアクセスする
|
|
300 * 分散プログラムのローカルでのテストが可能になる
|
|
301 {:width="50%"}
|
|
302
|
|
303 # Christie - CGの生成方法
|
|
304 1. StartCodeGear.classを継承しCGMを生成する
|
|
305 2. CGをnewしたあと*setup*を用いる
|
|
306 * newが終わらないとアノテーションから待ち合わせを行う処理ができないため
|
|
307 * このときCGMがCGに渡されるため、プログラマが引数にCGMを渡す必要はない
|
|
308
|
|
309 ```java
|
|
310 public class StartTest extends StartCodeGear{//StartCG
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
311
|
176
|
312 public StartTest(CodeGearManager cgm) {
|
|
313 super(cgm);
|
|
314 }
|
|
315
|
|
316 public static void main(String args[]){
|
|
317 StartTest start = new StartTest(createCGM(10000));//CGMを生成
|
|
318 }
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
319
|
176
|
320 @Override
|
|
321 protected void run(CodeGearManager cgm) {
|
|
322 cgm.setup(new TestCodeGear());//CGの待ち合わせを開始
|
|
323 getLocalDGM().put("count", 1);
|
|
324 }
|
|
325 }
|
|
326 ```
|
|
327
|
|
328 # Christie - アノテーションを用いたインプット記述
|
|
329 * keyの指定にはJavaのアノテーションを用いる
|
|
330 * 先頭を@で始める注釈
|
|
331 * 独自アノテーションを定義できる
|
|
332 * アノテーションから待ち合わせを行う処理にはJavaのreflectionAPIを使用
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
333
|
176
|
334 # Christie - アノテーションを用いたインプット記述
|
|
335 * InputのためのDGを宣言し、その上にアノテーションでkeyを指定
|
|
336 * Takeの例
|
|
337 ```java
|
|
338 @Take(”count”)
|
|
339 public DataGear<Integer> count = new DataGear<>();
|
|
340 ```
|
|
341 * RemoteTakeの例
|
|
342 ```java
|
|
343 @RemoteTake(dgmName="remote", key=”count”)
|
|
344 public DataGear<Integer> count = new DataGear<>();
|
|
345 ```
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
346
|
176
|
347 # Christie - アノテーションを用いたインプット記述
|
|
348 * アノテーションは必ずフィールドに付けなければならない
|
|
349 * InputDGの生成とkeyの指定を一箇所に書ける
|
|
350 * アノテーションの内容はコンパイル時に決定される
|
|
351 * 動的なkey指定を防ぐ
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
352
|
176
|
353 # Christie - 型を指定しないデータ取り出し
|
|
354 * InputDGを宣言する際には必ず型の指定が必要となるため、CG内で型を把握できる
|
|
355 * DataGearはJavaの総称型を用いて<>内に指定した型を受け取る
|
|
356 ```java
|
|
357 @Take(”count”)
|
|
358 public DataGear<Integer> count = new DataGear<>();
|
|
359 ```
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
360
|
176
|
361 # Christie - 型を指定しないデータ取り出し
|
|
362 * 宣言された型は内部で保存され、ノード間通信でも保たれる
|
|
363 * AliceのasClass()と違い、getData()で型を指定せずにデータを取り出すことができる
|
|
364 ```java
|
|
365 public class GetData extends CodeGear{ @Take(”name”)
|
|
366 public DataGear<String> name = new DataGear<>();
|
|
367
|
|
368 @Override
|
|
369 protected void run(CodeGearManager cgm) {
|
|
370 System.out.println(”this name is : ” + name.getData());
|
|
371 }
|
|
372 }
|
|
373 ```
|
|
374 * 取得したDGが待ち合わせに指定した型と違う場合はエラーになる
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
375
|
176
|
376 # Christie - 設計の効果
|
|
377 * CodeGearManagerというDGMの管理機構を作ったことでLocalDGM複数立ち上げが可能になった
|
|
378 * テストや機能拡張がしやすくなった
|
|
379 * アノテーションを用いたことでDG生成とkey指定の分離問題を解決し、処理の見通しを良くした
|
|
380 * 型の整合性を保証することで信頼性が向上した
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
381
|
176
|
382 # Christieと他フレームワークの比較
|
|
383 * Christieの特徴を述べるために他の分散フレームワークとしてAkka、Hazelcastと比較を行う
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
384
|
176
|
385 # Christieと他フレームワークの比較 - Akka
|
|
386 * アクターモデル
|
|
387 * アクターと呼ばれるオブジェクト同士が並列で非同期メッセージを送受信するモデル
|
|
388 * アクターは固有のアドレス持つ
|
|
389 * ローカルアクターにもリモートアクターにもアドレス指定でメッセージを送受信
|
|
390 * アクターはメールボックスというキューを持つ
|
|
391 * 受け取ったメッセージをパターンマッチで順次処理
|
|
392 * パターンマッチにはScalaのcase classを用いられる。
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
393
|
176
|
394 # Christieと他フレームワークの比較 - Hazelcast
|
|
395 * キーと値の1対1でデータを管理するインメモリ・データグリッド
|
|
396 * 複数のノードに分散させたデータを、仮想的な1つのメモリ空間に見せるモデル
|
|
397 * プログラマがサーバを意識せずに共有のタプルスペースに対してデータをget/put
|
|
398 * 共有のタプルスペースに書き込むとマルチキャストで全サーバにデータが贈られる
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
399
|
176
|
400 # Christieと他フレームワークの比較 - 設計思想
|
|
401 * AkkaやHazelcastはロケーション透過性が高く、分散プログラムの煩雑な処理を抽象度を高めることで隠している
|
|
402 * 分散性を明示的に意識しながら細かな処理を記述できる
|
|
403 * 通常計算とメタ計算に分けているため複雑さをセパレートしている
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
404
|
176
|
405 # Christieと他フレームワークの比較 - 記述性
|
|
406 * AkkaはFIFO的にメッセージを処理する複数インプットのときの待ち合わせ処理をプログラマが書かなければならない
|
|
407 * アノテーションを使ったインプットの指定はAkkaやHazelcastにはなく、複数インプットが書きやすいため
|
|
408
|
|
409 # Christieと他フレームワークの比較 - 提供する機能
|
|
410 * NAT
|
|
411 * 圧縮
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
412
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
413 # まとめ
|
176
|
414 * AliceのプロトコルやMeta Computationを説明し、TopologyManagerを用いたNAT越えの手法を示した
|
|
415 * Aliceの問題点を整理し、再設計の必要性を述べた
|
|
416 * LocalDGMの複数立ち上げを可能にし、テストや機能拡張がしやすい環境を整えた
|
|
417 * Christieではアノテーションを用いたAPIで信頼性の高い記述を実現した
|
|
418 * Christieを他のフレームワークと比較し、分散性を意識して記述できる特徴があることを述べた
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
419
|
176
|
420 # 今後の課題
|
|
421 * DataGearのメタレイヤーへの移行
|
|
422 * TopologyManagerの実装
|
|
423 * 実用性の検証
|
|
424 * Jungleとの統合
|
|
425 * GearsOSへの移行
|
175
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
426
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
427 <style type="text/css">
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
428 <!--
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
429 *{
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
430 font:nomal 100% 'PT Sans';
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
431 }
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
432
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
433 ul > li{
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
434 list-style-type:disc;
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
435 }
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
436
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
437 .slide h1{
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
438 text-align:left;
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
439 color:#777777;
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
440 font:bold 40px/1.13 'PT Sans', sans-serif;
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
441 margin-bottom: 50px;
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
442 }
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
443
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
444 div#slide1 h1{
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
445 text-align:left;
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
446 color:#777777;
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
447 font:bold 60px 'PT Sans', sans-serif;
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
448 margin-bottom: 50px;
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
449 }
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
450
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
451 pre > code{
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
452 font-family:'Droid Sans Mono', 'Courier New', monospace;
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
453 }
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
454
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
455 img[alt="opt"]{
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
456 display: block;
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
457 margin-left: auto;
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
458 margin-right: auto;
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
459 }
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
460
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
461 img[alt="right"]{
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
462 margin-right: 0;
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
463 }
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
464
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
465 table {
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
466 margin-left: auto;
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
467 margin-right: auto;
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
468 }
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
469
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
470 th {
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
471 font-size: 120%;
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
472 }
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
473 -->
|
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
474 </style>
|