分散版セットアップ
/etc/servicesへの追加
getassoc 12345/tcp
計算ノード(サーバ側でのディレクトリの準備)
例えば、計算ノードでのインデックス作成ディレクトリを /home/getassoc/g/pwam とします。 n番目の計算ノード(0から数えます)は、ここにある 0.n、1,n というディレクトリに 担当するインデックスを作成します。ちなみに、0.nは行連想用、1.nは列連想用です。 属性ファイルは全文一致インデックスは0.nにしかられません。
例えば、最初の計算ノードでは、
mkdir -p /home/getassoc/g/pwam/0.0 /home/getassoc/g/pwam/1.0
次の計算ノードでは、
mkdir -p /home/getassoc/g/pwam/0.1 /home/getassoc/g/pam/1.1
とします。余分なディレクトリはほとんど無害なので、すべての計算ノードで すべてのディレクトリを作っておいてもかまいません。例えば、8分散するならば、
for d in 0 1; do
for n in 0 1 2 3 4 5 6 7; do
mkdir -p /home/getassoc/g/pwam/$d.$n
done
done
計算サーバでのサービスの起動
xgetassoc に12を渡すとサーバになります。
-d | 制御端末を切り離す(デーモン) |
-p | 待ち受けポートを指定 |
-u | 待ち受け名前付きパイプを指定 |
-b | マルチホームホストの場合に、バインドするインタフェースを指定します |
-t | 作業用ディレクトリを指定。省略すると親ノードと同じものが用いられる |
-r | インデックス作成ディレクトリを指定。省略すると、親ノードのインデックス作成ディレクトリのnwamをpwamに置換したものが用いられる |
-pか-uのどちらかは指定しなければなりません。両方指定すると、どちらの方法でも接続できるようになります。
/home/getassoc/g/wbin/xgetassoc 12 -p getassoc -u /tmp/getassoc.sock
親ノードでの準備
/home/getassoc/g/etc/ndwam.confに計算ノードの一覧を作成します。 一行に1ノードずつ記述します。各行は
H\tP\tL
の形になります。ここで、\tはタブ文字を表します。 Hにはホスト名かIP-Addressを、Pにはポートを記述します。HとPは必ず組で指定してください。 Lには、名前付きパイプを指定します。名前付きパイプは一台の計算機で親ノードと計算サーバを兼業させている 場合にしか使えないことに注意してください。 HとP、またはLのどちらかは省略できますが、どの行もタブ文字をちょうど3つ含むように注意してください。
例:
localhost getassoc /tmp/getassoc.sock
127.0.0.1 12345 /tmp/getassoc.sock
::1 12345
計算ノードは、このファイルの先頭から順に0、1、2… 番の担当ノードになります。 ファイルを最後まで使い切ったら、先頭に戻って再使用されます。上の例なら、 先頭の計算ノードは0番なのですが、ファイルは4行ですから、5分割以上のインデックスを作成しようとすると、この計算ノードは4番、8番、12番… の担当ノードにもなりえます。
これで、準備は完了です。
分散セットアップの実行
stpの-o引数に、分散セットアップの指示を,(コンマ)で区切って追加します。
-D | 行分散数 |
-X | 列分散数 |
-C | 行分散計算ノードの設定ファイル |
-Y | 列分散計算ノードの設定ファイル |
例えば、行を2分割、列を3分割し、それぞれの設定ファイルがdnwam-r.conf、dnwam-c.confなら、
stp -o,-D,2,-C,/home/getassoc/g/etc/dnwam-r.conf,-X,3,-Y,/home/getassoc/g/etc/dnwam-c.conf -b /home/g sample title,link sample.itb
とします。 行と列の分割数が同じならば、-Dか-Xのどちらかを省略可能です。 行と列の分散計算ノードの設定フィアイルが同じならば、-Cか-Yのどちらかを省略可能です。例:
stp -o,-D,2,-C,/home/getassoc/g/etc/dnwam.conf -b /home/g sample title,link sample.itb
分散の設定はコーパスの属性ファイルに記憶されますので、セットアップが終われば、忘れても構いません。また、コーパスごとに異なる設定が使えます。
計算サーバでのサービスの起動 (その2)
計算ノードが増えると、いちいち手動で起動してたのでは大変です。私は、以下のようなスクリプトを使っています。 ファイルは2つで、yが各計算ノードにおいておくもの、distが親ノードにおいておくものです。 計算ノードはm1〜m8まで連番の名前がついています。サービスを停止させるときは、(無様ですが、) distの sleep 11 のところでdistの実行を止めればOKです。xgetassocを更新したくない場合や、 $grがNFSで共有されている場合には dist の真ん中のブロックを削る必要があります。
y:
#! /bin/sh
gr=/home/g
xgetassoc=/home/g/wbin/xgetassoc
init()
{
mkdir -p $gr/tmp
mkdir -p $gr/nwam
mkdir -p $gr/pwam
for d in 0 1
do
h=0
while [ $h -lt $1 ]
do
mkdir -p $gr/pwam/$d.$h
h=`expr $h + 1`
done
done
}
clean()
{
rm -rf $gr/tmp/*
rm -rf $gr/nwam/*
rm -rf $gr/pwam/*/*
}
main()
{
pkill xgetassoc
pkill tail
h=`hostname`
clear
$xgetassoc 12 -p getassoc > logs/$h 2>&1 &
p0=$!
echo $p0
tail -f /var/log/stmd &
p1=$!
echo $p1
tail -f logs/$h &
p2=$!
echo $p2
rm -f $HOME/y.quit
cnt=0
while [ ! -f $HOME/y.quit ]
do
if [ $cnt -ge 18 ]
then
echo "$h `date` `du -s $gr`"
cnt=0
fi
cnt=`expr $cnt + 1`
sleep 10
done
kill $p0 $p1 $p2
}
if [ $# -eq 2 -a x"$1" = x"-i" ]
then
init $2
clean
exit 0
elif [ $# -eq 1 -a x"$1" = x"-c" ]
then
clean
exit 0
elif [ $# -eq 1 -a x"$1" = x"-s" ]
then
touch y.quit
exit 0
elif [ $# -ne 0 ]
then
echo "usage: $0 -i #" 1>&2
echo " $0 -c" 1>&2
echo " $0 -s" 1>&2
echo " $0" 1>&2
exit 1
fi
main
exit 0
dist:
#! /bin/sh
gr=/home/g
for h in 1 2 3 4 5 6 7 8
do
echo $h
ssh m$h ./y -s &
done
sleep 11
for h in 1 2 3 4 5 6 7 8
do
echo $h
(ssh m$h rm -f $gr/wbin/xgetassoc; scp $gr/wbin/xgetassoc m$h:$gr/wbin/xgetassoc) &
done
sleep 2
for h in 1 2 3 4 5 6 7 8
do
echo $h
#scp y m$h:y &
#ssh m$h ./y -i 16 &
#ssh m$h ./y -c &
ssh m$h ./y &
done