Link

分散版セットアップ

/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