# HG changeset patch # User Shinji KONO # Date 1517810144 -32400 # Node ID 34383a096d7530cc3fc3d6d2b99ebf3c2afe1d90 # Parent 707cd7f0689c76f7ec52febc368161b821b78d5a fix diff -r 707cd7f0689c -r 34383a096d75 paper/nozomi-master.tex --- a/paper/nozomi-master.tex Mon Feb 05 14:22:46 2018 +0900 +++ b/paper/nozomi-master.tex Mon Feb 05 14:55:44 2018 +0900 @@ -138,13 +138,13 @@ AkkaはScalaおよびJava向けのオープンソースの並列分散処理フレームワークであり、HazelcastはHazelcast社が開発したJava向けのオープンソースインメモリデータグリッドである。 -\section{プロトコルとデータベース} +\section{従来の分散フレームワーク} Akkaではアクターモデルという、アクターと呼ばれるオブジェクト同士が並列で非同期メッセージを送受信するモデルを採用している。 アクターは固有のアドレス持っており、ローカルのアクターにもリモートのアクターにも同じようにアドレスを指定することでメッセージを送りあえるというプロトコルになっている。 アクターはそれぞれメールボックスというキューを持っており、メールボックスに受け取ったメッセージをパターンマッチで順次処理していく。 このパターンマッチにはScalaのcase classを用いられる。 -case classとは、データ構造とデータを同時に持つことができ、その両方を一括してパターンマッチさせることができるクラスである。 -メッセージをcase classで記述することにより、スムーズなメッセージの処理を可能にしている。 +case classとは、データ構造とデータ型名を同時に持つことができ、その両方を一括してパターンマッチさせることができるクラスである。 +メッセージをcase classで記述することにより、異なるメッセージをメールボックス上で使用することがきる。 Hazelcastは、キーと値の1対1でデータを管理するインメモリ・データグリッドである。 インメモリ・データグリッドとは、複数のノードに分散させたデータを、アプリケーション側からは仮想的な1つのメモリ空間に置かれているように見せるモデルである。 @@ -159,17 +159,18 @@ \newpage 記述の面において、Akkaではメッセージが集中した場合にそれを処理するパターンマッチが増えてしまう問題や、複数のインプットを待ち合わせる際に記述が煩雑になる問題があった。 -しかしAliceはインプットを明確に記述でき、複数のインプットを持てるため、そのような煩雑さがない。 +しかしAliceはインプットを明確に記述でき、複数のインプットを持てる。 プロトコルの設計方針において、AkkaやHazelcastは分散通信の複雜さを抽象度を高めることで隠す方針であるため、ロケーション透過性が高く、プログラマからは処理の流れを把握しにくくなっていた。 -一方でAliceはそのような抽象度は持たせず、処理の流れを明確に見通せたほうが、処理途中で細かな計算が必要になった場合にチューニングがしやすいと考えている。 -そのため、ラベルを用いてリモートノードを意識的に選択する。 -Aliceでは明示的に分散性を意識する代わりに、Aliceは計算を通常計算とそれを支えるメタ計算として分離することで記述の複雑さを回避している。 -また、Akkaでは送り先をドメインで指定するためどのような処理をするアクターにメッセージを渡しているのか分かりづらかったが、Aliceでは他のノードにラベルでアクセスできるため処理の見通しを良いと言える。 +一方でAliceは分散計算のチューニングをメタ計算として行う。これによりメタ計算から分離された処理の流れを明確にすることができる。 + +Alice の分散ノード間の通信はラベルを用いてリモートノードを選択することによって指定する。 +Akkaでは送り先をドメインで指定しているのと同様である。Alice ではラベルはToplogy managerによって自動的に指定される。 -このように、Aliceのプロトコルの特徴は分散処理の見通しの良さといえる。 -しかし、現状のAliceのAPIシンタックスは直感的でなく、プログラマが処理の順番やデータの型を考慮して書く必要があった。 -これではバグを引き起こす可能性が高いため、信頼性を上げるにはよりユーザーフレンドリーなシンタックスで再設計すべきだと考えた。 +% このように、Aliceのプロトコルの特徴は分散処理の見通しの良さといえる。Alice は Java 上に実装されており、Javaのオブジェクト生成や +% 継承により記述されている +%しかし、現状のAliceのAPIシンタックスは直感的でなく、プログラマが処理の順番やデータの型を考慮して書く必要があった。 +%これではバグを引き起こす可能性が高いため、信頼性を上げるにはよりユーザーフレンドリーなシンタックスで再設計すべきだと考えた。 \section{トポロジーの構成} @@ -186,19 +187,19 @@ ここでは信頼性・拡張性の高い通信の指標として、障害耐性、圧縮・転送通信、NAT越えについてを比較する。 \subsection*{障害耐性} -分散プログラムでは、1つのノードがダウンしてもシステム全体は動き続けなければならないため、フォールト・トレラントであることが重要である。 +分散プログラムでは、1つのノードがダウンしてもシステム全体は動き続けなければならないため、フォールト・トレラントであることが重要である。 Akkaでは親子関係を構成でき、親アクターは子アクターを監視し障害が起こった際に再起動や終了といった処理を指定できる。 -また、Hazelcastは、1つのサーバで障害が起きても他のサーバがデータを共有しているため、データを失うことなく素早く復旧ができる。 +また、Hazelcastは、1つのサーバで障害が起きても他のサーバがデータを共有しているため、データを失うことなく素早く復旧ができる。 Aliceでは、TopologyManager内にKeepAliveという機能があり、常にノードが生きているかHeartbeatを送信して監視しており、どこかのノードに障害が起こればトポロジーを再構成するといった対応ができる。 \subsection*{圧縮・転送通信} -ノード間通信でより速い通信をするためには、送信するデータを圧縮する機能や、受け取ったデータをそのままほかノードへ転送する機能が求められる。 +ノード間通信でサービスに沿った柔軟な通信をするためには、送信するデータを圧縮する機能や、受け取ったデータをそのままほかノードへ転送する機能が求められることがある。 -データの圧縮を指定したい場合、Akka・Hazelcastはシリアライザが用意されているため、そのメソッドを呼び出すことでzip/unzipを行う。 +データの圧縮を指定したい場合、Akka、Hazelcastはシリアライザが用意されているため、そのメソッドを呼び出すことで圧縮伸長を行う。 また、転送を指定したい場合、Akkaにはforwardメソッドがあるためそれを呼び出すことで受け取ったデータの転送が可能だが、Hazelcastは一つのMapへのアクセスに見立てているため、転送にもputを用いる。 一方でAliceは圧縮の展開と転送を同時に行うことを想定した圧縮・転送機能を持っている。 @@ -222,12 +223,13 @@ \chapter{分散フレームワークAliceの概要} -\section{CodeSegmentとDataSegment} -AliceではCode Segment(以下CS)とData Segment(以下DS)の依存関係を記述することでプログラミングを行う。 +AliceではCode Segment(以下CS)とData Segment(以下DS)の依存関係を記述することでプログラミングを行う。 CSは実行に必要なDSが全て揃うと実行される。CSを実行するために必要な入力されるDSのことをInputDS、CSが計算を行った後に出力されるDSのことをOutput DSと呼ぶ。 -データの依存関係にないCSは並列実行が可能である(図 \ref{fig:CS} )。 +\section{CodeSegmentとDataSegment} + +データの依存関係にないCSは並列実行が可能である(図 \ref{fig:CS})。 CSの実行においてDSが他のCSから変更を受けることはない。そのためAliceではデータが他から変更され整合性がとれなくなることはない。 \begin{figure}[htbp]