Polly - python dolly

Dolly+ というプログラムがある.スイスのETHという研究所で開発されたDollyというプログラムを,高エネ研の真鍋さんという方が改良されたもので,大きいデータをたくさんのノードに同時に配信するためのツールだ.

Dollyという名前は,例のクローン羊から来ているのだと思う.

Dolly+の動作

データをたくさんのノードに並列に配信することを考えてみよう.一番簡単な方法は,送信元のノードからスター状に接続を張り,マルチスレッドで配信する方法だろう.この方法は対象ノード数が2,3ノード程度ならうまくいくが,ノード数が増えてくるとすぐに破綻する.送信元ノードから出て行くネットワークがボトルネックになるからだ.

これに対して,Dolly+は配送をリング状に行う.つまり対象ノードをリング状のネットワーク接続でつなぎ,そこにデータを流し込む.各ノードは,上流から来たデータをファイルに書き出すと同時に下流へ流す.バケツリレーをイメージすると分かりやすいだろう.この方法だと,最下流のノードには,すべてのノードを経由してデータが届くわけだ.このため効率が悪いような感じがするかもしれないが,ネットワーク的にみると,どこにも集中が生じていない.つまりボトルネックがないので,ネットワークの速度を十分に引き出して配布を行うことができる.

Polly - python dolly

Dolly+ は完成度の高いソフトウェアだが,サーバを事前にインストール,実行しておかなければならなかったり,設定ファイルをかかなければならなかったりと,お手軽に使うには,ちょっと面倒.なので,Pythonで簡単なものを書いてみた.Pollyという名前にしておこう.

Pollyは,スクリプト言語の特徴を生かして,0インストレーションで実行できるように設計されている.sshを利用して隣接ノードにpython インタプリタを起動し,自分をコピーして起動する.これを繰り返すことで,リング(終端が閉じてないので実際にはただの線だが)を構築する.

ただし,隣接ノードに対して,パスフレーズなしでsshができるように設定してあることが前提である.クラスタ内ではそのような設定は比較的一般的であることを想定している.

実装

Pythonインタプリタsshごしに使う方法は,ssht でも試しているが,今回はちょっとアプローチをかえてみた.
sshtでは,インタプリタのトップレベルにプログラムを直接書き込んだ.これだと一つの関数のなかに改行があるとだめ,とかいろいろ面倒くさい制約がある.
今回は,プログラム全体を文字列として定義してから,それをexecするという方針にしてみた.リモート側のインタプリタにはこんな入力がいくことになる.

__self__ = """#!/usr/bin/env python
import os
#.. プログラム本体
...
"""
exec(__self__)

もちろんプログラムの中に"""がでてくると発狂するので,事前にエスケープしておく必要がある.

この方法だと,プログラム中の改行に気を使う必要がないので,ちょっと楽かもしれない.

使い方

Pollyは複数のファイルを転送することができる.ただし,現状では,複数ファイルをパイプライン的に転送するようには設計さられていない.一つのファイルの転送が完全に終了し,終端ノードからackが帰ってくるのを待って,次のファイルを転送する.

$ polly.py HOST1 HOST2 HOST3 ... -files FILE1 FILE2 FILE3

また,ファイルは各ホストの/tmpにおかれる.

評価

というほどのことでもないが,ちょっと実験してみた.評価対象として,マルチスレッドでスター状にscpを行うプログラム(star)を書き,比較した.実験環境は,Intrigger というクラスタの本郷のノード群.

小さいデータの場合

まず5k程度のファイルを転送してみた.X軸がノード数でY軸が時間だ.双方とも,データ転送時間だけでなく,接続を構築する時間を含んでいる.

小さいデータの場合は,残念ながらPolly のほうが遥かに遅い.これは,ssh接続を逐次に実行しているためである.starのほうは独立したプロセスで並列実行している.いずれにしろ,ノード数に対してリニアに実行時間は増大しているのだが,係数が全然違う.

したがって,データが少ない場合には,polly を使う意味はない.

大きいデータの場合

つぎに,大きいデータで試してみよう.データにはたまたま手元にあった,ubuntu 8.04 ja のisoイメージを使った.サイズは700M程度.

一見小さいデータの場合と同じように見えるが,よく見ていただきたい.こんどは,Polly のほうが下の線だ.

1ノードのときにはほぼ同じ.ちょっと値が低いような気がするが,これは送信元のデータをNFS上においてしまったためで,ここが律速になっているのだと思われる.

starのほうは,ノード数に対して,ほぼリニアに時間がかかっているのが分かる.これは,送信元ノードのネットワークがボトルネッックになっているからである.これに対して,pollyはあまり遅くなっていない.


まとめ

Pollyには,Dolly+でサポートされている障害からの回復などの気の利いた仕掛けはない.あくまで,お手軽なツールという位置づけ.作っては見たものの,あまり使い道が思いつかない...

でも,せっかく作ったのでもったいないから,Google Codeにおいておこう.