view paper/chapter2.tex @ 15:af43166c9c70

add put api
author kazz <kazz@cr.ie.u-ryukyu.ac.jp>
date Tue, 07 Feb 2012 13:53:30 +0900
parents 6801d23d7a85
children 39e81f4f1326
line wrap: on
line source

\chapter{分散フレームワーク Alice の設計}
前章までは、先行研究である Federated Linda の設計と実装について示した。しかし、その設計が古いものであり、時代にそぐわなくなってきていたため、新しく分散向けのフレームワークを開発することにした。

また、本研究室で開発している並列フレームワークの開発から得られた知見も参考にし、それらを本章で示す新設計へと活かすことにした。

本章では、新設計である、分散ネットワークアプリケーションフレームワーク Alice (以下、 Alice) の設計を示す。

\section{分散プログラミングにおいて重要なこと}

まず、 Federated Linda の設計と実装を通して得られた、分散プログラミングにおいて重要な三点を元に基本設計を行った。(図\ref{fig:distributedProgram})
その三点とは以下の通りである。

\begin{itemize}
\item Database
\item Protocol Engine
\item Link Configuration
\end{itemize}

\begin{figure}[htbp]
  \begin{center}
    \includegraphics[width=80mm]{./images/distributed_program.pdf}
  \end{center}
  \caption{分散プログラミングにおいて重要な三点}
  \label{fig:distributedProgram}
\end{figure}

分散プログラミングを行うにあたり、どのようなデータベースでデータを表現、管理するかということが重要になる。 Federated Linda では、 Linda のタプルスペースを用いた。データベースの設計は、ユーザーが意図したとおりにデータを扱えるために、重要なものとなる。

次に、どのようにマシンを接続するか、そのデータベースをどのように操作するかといった処理を記述できる Protocol Engine が挙げられる。この部分はユーザーが直接コードを記述できる。ユーザーが望んだマシンへの接続や必要なデータへ簡単にアクセスでき、簡潔に処理を記述できることが求められる。

そして、どのようにマシンを接続するか、すなわち接続トポロジーをどうするかが重要である。多様なアプリケーション間の通信を分散させるために自由度の高いトポロジーを作成できる必要がある。

\section{Data Segment と Code Segment}

本研究室では、並列タスク管理フレームワーク Cerium (以下、 Cerium) の開発を行なっているが、その設計と実装を行うにあたり、並列プログラミングと分散プログラミングは本質的には同じことを行なっていることが分かった。特に、ヘテロジニアスマルチコアであり、ローカルストアをそれぞれのコアが持っているという Cell の特異な環境は、分散プログラミングの環境と酷似している。それらを踏まえて、 Cerium のタスク管理手法を分散に応用できないかと考えた。

Cerium においても、タスクとそれの入出力データの取り扱いは難しい課題である。データを操作する API を考えて、タスクを自然に記述し、効率よく実行する方法を考えてきた。

そこで考えられた手法が、データを Data Segment、タスクを Code Segment という単位に分割して記述するという手法である。

まず、 Code Segment (タスク) は入力データと出力データ(それぞれ、 Input Data Segment、 Output Data Segment とする)を持つ。 (図\ref{fig:dsAndCs}) Input Data Segment はそのタスクを実行するにあたり必要なデータ群であり、 Output Data Segment はそのタスクが計算を行った結果を格納したデータ群である。

\begin{figure}[htbp]
  \begin{center}
    \includegraphics[width=100mm]{./images/dsandcs.pdf}
  \end{center}
  \caption{Code Segment と入出力 Data Segment}
  \label{fig:dsAndCs}
\end{figure}

Code Segment と依存するデータ群を記述することにより、明示的にそれらが実行される順番が決定される。(図\ref{fig:dsAndCs2})

\begin{figure}[htbp]
  \begin{center}
    \includegraphics[width=120mm]{./images/dsandcs2.pdf}
  \end{center}
  \caption{Data Segment と Code Segment の依存関係で一意に決まる実行順序}
  \label{fig:dsAndCs2}
\end{figure}

\section{Data Segment (Database)}
Alice では、Data Segment をデータベースとして利用する。

\subsection{Data Segment API}
まず、分散プログラム向けに Data Segment を操作する Data Segment API を定義した。(表\ref{tb:dataSegmentApi}) この Data Segment API を用いてデータの送受信を行う。
\begin{table}[htbp]
\caption{Data Segment API}
\label{tb:dataSegmentApi}
\begin{center}
\begin{tabular} {|l|l|}
  \hline
  {\bf API}&{\bf 概要}\\
  \hline
  take(key,index)&key に対応するデータセグメントリストからデータを取り出す。\\&データセグメントリストにデータは残らない。\\
  \hline
  peek(key,index)&key に対応するデータセグメントリストからデータを読みだす。\\&データセグメントリストにデータセグメントは残る。\\
  \hline
  put(key,data)&key に対応するデータセグメントリストに data を追加する。\\
  \hline
  update(key,data)&key に対応するデータセグメントリストから一つデータを取り除く。\\& data を追加する。\\
  \hline
\end{tabular}
\end{center}
\end{table}

Data Segment はキーごとにリストを持っている。 Data Segment API を用いれば、これらのリストにデータを追加、削除を適宜行うことができる。

なお、 "take" と "peek" には index という引数が存在する。これは、一つの Data Segment に対し、データが出力される度にインクリメントされる値で、前回の "peek" や "take" で読み込んだ値からデータの更新があれば読み込むといったデータの入力待ちを行うことができる。なお、 index は省略できる。 index を指定しない場合は、 0 が指定されたものとして扱う。

\subsection{MessagePack を利用したデータ表現}
また、データの表現には MessagePack を利用する。
MessagePack とは、バイナリをベースにした効率重視のシリアライズライブラリーである。 MessagePack は、シリアライズされたデータにオブジェクトの型情報も埋め込むため、自己記述的なデータ形式となっている。そのため、 IDL (Interface Definition Language) によるデータ構造の定義は必要なくなる。データの表現方法は JSON と似ており ProtocolBuffers や Thrift 等の他のシリアライズライブラリーと比較しても高速で利便性がある。

MessagePack で取り扱える型は大きく次の通りである。

\begin{itemize}
\item Boolean
\item Integer
\item Long
\item Float
\item Double
\item Raw (String)
\item Array
\item Map
\end{itemize}

Array や Map を用いることで、基本的なデータ型を組み合わせて複雑なデータ構造を作ることが可能である。これにより、データの末尾に付加情報を付けたい場合などにも対応できる。

IDL のように、自作したクラスを構造体と見立てて、シリアライズ、デシリアライズすることも可能である。

最近では、多言語対応が進み、利用できるプログラミング言語の幅が広がっている。そのため、異なるアーキテクチャ、オペレーティングシステム、プログラミング言語の壁を超えて、ネットワーク上で繋がることが可能になった。

\section{Code Segment (Protocol Engine)}
Alice では、 Protocol Engine の代わりとして、 Code Segment と呼ばれる単位でタスクを作成する。

Code Segment は Input Data Segment と Output Code Segment それぞれのデータリストを持っている。これにより、データの依存関係が自明になり、他の Code Segment と依存関係の全くない Code Segment を並列実行することが可能となる。並列度を上げるためには、 Code Segment の処理内容は細かく分割して記述することが望ましい。Code Segment の並列実行を行えるように、コア数分だけスレッドプールを準備する。

\section{Topology Manager (Link Configuration)}
Alice では、 Topology Manager と呼ばれるマシンがマシン間の接続を管理する。

分散アプリケーションを開発する際に直面する問題として、接続とルーティングに関する記述が複雑になってしまうといったことが挙げられる。
Alice では、トポロジーを作成するロジックをユーザーがスクリプト言語などで気軽に組むことができる。
そのスクリプトが出力したトポロジー設定ファイルを Topology Manager が読み込む。
設定を読み込んだ Topology Manager は、 IP アドレスやポート番号、接続名などの接続情報を、トポロジーへの参加を表明したマシンに送信する。