# HG changeset patch # User akahori # Date 1550131676 -32400 # Node ID fc5b4b9489dba247f0632db26edc010a42e5c186 # Parent 008ac0554ff5c4448b5ff6e108fb50c57e285854 update diff -r 008ac0554ff5 -r fc5b4b9489db final_main/bibliography.tex --- a/final_main/bibliography.tex Tue Feb 05 18:00:41 2019 +0900 +++ b/final_main/bibliography.tex Thu Feb 14 17:07:56 2019 +0900 @@ -9,13 +9,13 @@ %URLを載せる人は参考にした年月日を最後に記入すること。 \bibitem{1} - + % \bibitem{gears} % {伊波立樹, 東恩納琢偉, 河野真治}: Code Gear、Data Gear に基づく OS のプロトタイプ % , 情報処理学会システムソフトウェアとオペレーティング・システム研究会(OS) (2016). -% \bibitem{llvm} -% The LLVM Compiler Infrastructure. \\\verb|http://llvm.org| +\bibitem{torque} +TORQUE Introduction. \\\verb|http://docs.adaptivecomputing.com/torque/4-2-8/help.htm#topics/0-intro/introduction.htm%3FTocPath%3DWelcome%7C_____1| % \bibitem{llvm_ir} % LLVM Language Reference Manual. \\\verb|http://llvm.org/docs/LangRef.html| diff -r 008ac0554ff5 -r fc5b4b9489db final_main/chapter1/chapter1.tex --- a/final_main/chapter1/chapter1.tex Tue Feb 05 18:00:41 2019 +0900 +++ b/final_main/chapter1/chapter1.tex Thu Feb 14 17:07:56 2019 +0900 @@ -1,19 +1,29 @@ +\input{/Users/e155753/.tex/setup} + +%%文書開始**************************** +\begin{document} +%%************************************** \chapter{はじめに} \label{chap:introduction} \pagenumbering{arabic} % 序論の目安としては1枚半ぐらい. -\section{研究背景} + +コンピュータにおいてデータの破損や不整合は深刻な異常を引き起こす原因となる. そのため, 破損, 不整合を検知するためにブロックチェーン技術を用いたい. ブロックチェーンは分散ネットワーク技術であり, データの破損や不整合をハッシュ値によって比較できる. そして, 誤操作や改ざんがあった場合でも, ブロックチェーンを用いることで簡単にデータの追跡が行える. + +当研究室では分散フレームワークとしてChristieを開発しており, これはGearsOSにファイルシステムとして組み込む予定がある. そのため, Christieにブロックチェーンを実装し, GearsOSに組み込むことにより, GearsOSのファイルシステムにおいてデータの破損, 不整合を検知できる. また, GearsOS同士による分散ファイルシステムを構成することができ, 非中央的にデータの分散ができるようになる. もし分散システムを構成しない場合でもデータの整合性保持は行え, 上記の目的は達成できる. + +本研究では, Christieにブロックチェーンを実装し, 実際に学科のPCクラスタ上の分散環境で動かす. -\section{研究目的} -コンピュータにおいてデータの破損や不整合は深刻な異常を引き起こす原因となる. そのため, 破損, 不整合を検知するためにブロックチェーン技術を用いる. ブロックチェーンは分散ネットワーク技術であり, データの破損や不整合をハッシュ値によって比較できる. そして, 誤操作や改ざんがあった場合でも, ブロックチェーンを用いることで簡単にデータの追跡が行える. - -当研究室では分散フレームワークとしてChristieを開発しており, これはGearsOSにファイルシステムとして組み込む予定がある. そのため, Christieにブロックチェーンを実装し, GearsOSに組み込むことにより, GearsOSのファイルシステムにおいてデータの破損, 不整合を検知できる. また, GearsOS同士による分散ファイルシステムを構成することができ, 非中央的にデータの検証ができるようになる. もし分散システムを構成しない場合でもデータの整合性保持は行え, 上記の目的は達成できる. - -本研究では, Christieにブロックチェーンを実装し, 分散環境で動かすことで, データの整合性保持, 追跡が行えるか確かめる. %\section{論文の構成} %\section{Introduction} + + +%%文書終了**************************** +\end{document} + + diff -r 008ac0554ff5 -r fc5b4b9489db final_main/chapter2/chapter2.tex --- a/final_main/chapter2/chapter2.tex Tue Feb 05 18:00:41 2019 +0900 +++ b/final_main/chapter2/chapter2.tex Thu Feb 14 17:07:56 2019 +0900 @@ -5,7 +5,40 @@ %%************************************** \chapter{ブロックチェーンについて} -ブロックチェーンとは分散型台帳技術とも呼ばれ, 複数のトランザクションをまとめたブロック, そのブロックをハッシュによってつなげ, 前後関係を表した台帳というものを, システムに参加しているすべてのノードが保持する技術である. +ブロックチェーンとは分散型台帳技術とも呼ばれ, 複数のトランザクションをまとめたブロック, そのブロックをハッシュによって繋げ, 前後関係を表した台帳というものを, システムに参加しているすべてのノードが保持する技術である. ブロックチェーンにはパブリック型とコンソーシアム型の2種類がある. パブリック型は不特定多数のノードを対象にしており, コンソーシアム型は管理者が許可したノードが参加している. + +\section{ブロックとその構造} +ブロックチェーンにおけるブロックは, 複数のトランザクションをまとめたものである. ブロックの構造は使用するコンセンサスアルゴリズムによって変わるが, 基本的な構造としては次のとおりである. + +\begin{itemize} +\item BlockHeader +\begin{itemize} +\item previous block hash +\item merkle root hash +\item time +\end{itemize} +\item TransactionList +\end{itemize} + +BlockHeaderには, 前のブロックをハッシュ化したもの, トランザクションをまとめたmerkle treeのrootのhash, このブロックを生成したtimeとなっている. + + +\section{トランザクションとその構造} +トランザクションとはデータのやり取りを行った記録の最小単位である. トランザクションの構造は次のとおりである. +\begin{itemize} +\item data +\item input transactions +\item output transactions +\item signature +\end{itemize} + +input transactionsはdataの +output transaction + + + + + %%文書終了**************************** \end{document} \ No newline at end of file diff -r 008ac0554ff5 -r fc5b4b9489db final_main/chapter4/chapter4.tex --- a/final_main/chapter4/chapter4.tex Tue Feb 05 18:00:41 2019 +0900 +++ b/final_main/chapter4/chapter4.tex Thu Feb 14 17:07:56 2019 +0900 @@ -30,12 +30,63 @@ 以上が, Christieの概要である. \section{プログラミングの例} +ここでは, Christieで実際にプログラムを記述する例を述べる. +CGMを作り, setup(new CodeGear)を動かすことにより, DGを待ち合わせ, DGが揃った場合にCodeGearが実行される. CGMを作る方法はStartCodeGear(以下SCG)を継承したものからcreateCGM(port) methodを実行することにより, CGMが作られる. SCGのコードの例をソースコード\ref{code:StartHelloWorld}に示す. -CGMを作り, setup(new CodeGear)を動かすことにより, DGを待ち合わせ, DGが揃った場合にCodeGearが実行される. CGMを作る方法はStartCodeGear(以下SCG)を継承したものからcreateCGM(port) methodを実行することにより, CGMが作られる. 以下がコードの例である. +\lstinputlisting[caption=StartHelloWorld,label=code:StartHelloWorld]{../src/HelloWorld/StartHelloWorld.java} + + +\section{TopologyManagerの実装} +Christieは当研究室で開発されたAliceを改良した分散フレームワークである. しかしAliceの機能を全て移行したわけではない. TopologyManagerは最たる例であり, 分散プログラムを簡潔に書くために必要である. そのため, ChristieにTopologyManagerを実装した. + +ここでは, TopologyManagerとはどのようなものかを述べる. そして, TopologyManagerを実装する際に, Christie自身のコードを変更する必要があったため, TopologyManagerでどのような問題が起こり, Christieの基本機能をどのような変更したかも述べる. + +TopologyManagerとは, Topologyを形成するため, 参加を表明したノード, TopologyNodeに名前を与え, 必要があればノード同士の配線も行うノードである. TopologyManagerのTopology形成方法として, 静的Topologyと動的Topologyがある. 静的Topologyはソースコード\ref{code:dot-example}のようなdotファイルを与えることで, ノードの関係を図\ref{fig:dot-example}のようにさせる. 静的Topologyはdotファイルのノード数と同等のTopologyNodeがあって初めて, CodeGearが実行される. + +\lstinputlisting[caption=ring.dot,label=code:dot-example]{../src/ring.dot} + +\begin{figure}[H] +\centering + \fbox{ + \includegraphics[scale=1]{../images/ring.pdf} + } +\caption{ソースコード\ref{code:dot-example}, ring.dotを図にしたもの} +\label{fig:dot-example} +\end{figure} + + + +動的Topologyは参加を表明したノードに対し, 動的にノード同士の関係を作る. 例えばTreeを構成する場合, 参加を表明したノードから順に, rootに近い位置の役割を与える. また, CodeGearはノードが参加し, parentに接続したあとに実行される. -\lstinputlisting[caption=StartHelloWorld,label=StartHelloWorld]{../src/HelloWorld/StartHelloWorld.java} +TopologyManagerを実装するに当たって, 以下の2つの問題点が出た. + +\begin{itemize} +\item Take, Peek操作でSuperClassの型を持ったデータを取り出す際にNullPointerExceptionが表示される. +\item ノード間で繋がる前にput操作を行うとデータが送られない. +\end{itemize} + +Take, Peek操作でSuperClassの型を持ったデータを取り出す際にNullPointerExceptionが表示される問題に対しては, DataGearでdataを代入する際にSuperClass, interfacesまで比較するように書き換えた. また, 型の不一致が起こった際は例外を投げるようにした. TopologyNodeにおいて, 実行するCodeGearをputしておき, 参加するノードがすべて揃ったら, そのCodeGearを実行する. しかし, 実際には実行するCodeGearはCodeGearを継承したものである. Christieは, putされたdataのクラスとTakeされるデータのクラスが一致したならば, dataを代入するという処理を行っている. つまり, SuperClass, interfacesの型までは比較をしない. そのため, 型の不一致が起こり, dataの代入をしないため, NullPointerExceptionが表示されていた. + +ノード間で繋がる前にput操作を行うとデータが送られない問題に対しては, waitを付け加えた. この問題は, ノードが繋がる前にputを行うため, 相手のDataGearに書き込みが行われないために起きた. そのため, 相手とDataGearがつながるまでputメソッドをwaitしておき, つながってからput操作を行うように書き換えた. + +\section{Christieの良い点, 悪い点} +Christieの元となった分散フレームワークAliceと比較し, Christieの良い点, 悪い点をそれぞれ述べる. -\section{} +良い点としては次のようなことが挙げられる. + +\begin{itemize} +\item ソースコードの可読性が上がった. Aliceでは動的にDataGearのKeyを変更できるため, 実際に使われているクラスと別のところでKeyが変更されている場合も多かった. しかし, Christieでは変数の名前がKeyとなる. そのため, put操作した変数がどこで使われているかがわかりやすくなった. +\item データの取り出しが簡単. アノテーションを用いることで, データを簡単に取り出すことができる. また, Aliceでは型をコード内で再定義しなければならなかったが, その操作がなくなった. + +\item DGMの操作がわかりやすくなった. +\end{itemize} + + +悪い点としては次のようなことが挙げられる +\begin{itemize} +\item TakeFrom, PeekFromの使い方が難しい. TakeFrom, PeekFromは引数でDGM nameを指定する. しかし, DGMの名前を静的に与えるよりも, 動的に与えたい場合が多かった. +\item デバッグが難しい. cgm.setupでCodeGearが実行されるが, keyの待ち合わせで止まり, どこで止まっているかわからないことが多かった. 例えば, putするkeyのスペルミスなどでコードの待ち合わせが起こり, CodeGearが実行されず, エラーなども表示されずにwaitすることがあり, どこで止まっているかわからない事があった. +\end{itemize} diff -r 008ac0554ff5 -r fc5b4b9489db final_main/chapter5/chapter5.tex --- a/final_main/chapter5/chapter5.tex Tue Feb 05 18:00:41 2019 +0900 +++ b/final_main/chapter5/chapter5.tex Thu Feb 14 17:07:56 2019 +0900 @@ -1,2 +1,38 @@ % 今後の課題 +\input{/Users/e155753/.tex/setup} + +%%文書開始**************************** +\begin{document} +%%************************************** \chapter{評価} + +本研究では, 実際にコンセンサスアルゴリズムPaxosを分散環境上で実行した. 分散環境上で動かすため, JobSchedulerの一種であるTorque Resource Manager(Torque)を使った. ここではTorqueとはなにか, どのような目的で評価をしたかを述べる. + +\section{Torqueとは} + +PCクラスタ上でプログラムの実験を行う際には, 他のプログラムとリソースを取り合う懸念がある. それを防ぐためにTorqueを使用する. Torqueはジョブという単位でプログラムを管理し, リソースを確保できたら実行する. ジョブはqsubというコマンドを使って複数登録することができ, queueのように投入した順番に実行される. また, 実行中の様子もqstatというコマンドを打つことで監視ができる. + + +Torqueには主に3つのNodeの種類がある. + +\begin{description} +\item[Master Node] pbs\_serverを実行しているノード. 他のノードの役割とも併用できる. +\item[Submit/Interactive Nodes] クライアントがジョブを投入したり監視したりするノード. qsubやqstatのようなクライアントコマンドが実行できる. +\item[Computer Nodes] 投入されたジョブを実際に実行するノード. +\end{description} + +今回は学科のKVM上にMaster Node, Submit/Interactive Nodeの役割を持つVM1台と, Computer Nodesとして15台のVMを用意した. + + + + + + +ジョブはシェルスクリプトの形で与えることができる. ソースコード\ref{code:torque-example}を例としてあげる. + +\lstinputlisting[caption=,label=]{../src/torque-example.sh} + + + +%%文書終了**************************** +\end{document} \ No newline at end of file diff -r 008ac0554ff5 -r fc5b4b9489db final_main/images/ring.pdf Binary file final_main/images/ring.pdf has changed diff -r 008ac0554ff5 -r fc5b4b9489db final_main/main.pdf Binary file final_main/main.pdf has changed diff -r 008ac0554ff5 -r fc5b4b9489db final_main/src/HelloWorld/HelloWorldCodeGear.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/final_main/src/HelloWorld/HelloWorldCodeGear.java Thu Feb 14 17:07:56 2019 +0900 @@ -0,0 +1,17 @@ +package christie.example.HelloWorld; + +import christie.annotation.Take; +import christie.codegear.CodeGear; +import christie.codegear.CodeGearManager; + +public class HelloWorldCodeGear extends CodeGear { + + @Take + String helloWorld; + + @Override + protected void run(CodeGearManager cgm) { + System.out.print(helloWorld + " "); + cgm.setup(new HelloWorldCodeGear()); + } +} diff -r 008ac0554ff5 -r fc5b4b9489db final_main/src/HelloWorld/HelloWorldCodeGear.java.orig --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/final_main/src/HelloWorld/HelloWorldCodeGear.java.orig Thu Feb 14 17:07:56 2019 +0900 @@ -0,0 +1,18 @@ +package christie.example.HelloWorld; + +import christie.annotation.Take; +import christie.codegear.CodeGear; +import christie.codegear.CodeGearManager; + +public class HelloWorldCodeGear extends CodeGear { + + @Take + String helloWorld; + + @Override + protected void run(CodeGearManager cgm) { + System.out.print(helloWorld + " "); + if(helloWorld.equals("world")) return; + cgm.setup(new HelloWorldCodeGear()); + } +} diff -r 008ac0554ff5 -r fc5b4b9489db final_main/src/HelloWorld/StartHelloWorld.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/final_main/src/HelloWorld/StartHelloWorld.java Thu Feb 14 17:07:56 2019 +0900 @@ -0,0 +1,18 @@ +package christie.example.HelloWorld; + +import christie.codegear.CodeGearManager; +import christie.codegear.StartCodeGear; + +public class StartHelloWorld extends StartCodeGear { + + public StartHelloWorld(CodeGearManager cgm) { + super(cgm); + } + + public static void main(String[] args){ + CodeGearManager cgm = createCGM(10000); + cgm.setup(new HelloWorldCodeGear()); + cgm.getLocalDGM().put("helloWorld","hello"); + cgm.getLocalDGM().put("helloWorld","world"); + } +} diff -r 008ac0554ff5 -r fc5b4b9489db final_main/src/ring.dot --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/final_main/src/ring.dot Thu Feb 14 17:07:56 2019 +0900 @@ -0,0 +1,5 @@ +digraph test { + node0 -> node1 [label="right"] + node1 -> node2 [label="right"] + node2 -> node0 [label="right"] +} diff -r 008ac0554ff5 -r fc5b4b9489db final_main/src/torque-example.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/final_main/src/torque-example.sh Thu Feb 14 17:07:56 2019 +0900 @@ -0,0 +1,8 @@ +#!/bin/sh +#PBS -N ExampleJob +#PBS -l nodes=10,walltime=00:01:00 +for serv in `cat $PBS_NODEFILE` +do + ssh $serv hostname & +done +wait \ No newline at end of file