HPCシステムズではエンジニアを募集しています。詳しくはこちらをご覧ください。
HPCシステムズのエンジニア達による技術ブログ

Tech Blog

PDCP使ってますか?

ファイルだって並列でDistributeしたい

前回のpdshには、pdcpというファイルコピーを複数のサーバーへ並列で行うユーティリティが存在します。これを用いれば、クラスターノードを増設で全てのマシンの/etc/hostsを更新したいとか、ライセンスサーバーのアドレスが変わったので静的ルートの設定ファイルを一斉に更新したいとか、そういうケースでコマンド一発でしかも並列実行できます。多数のファイルを一斉に送信できるという意味のパラレルではありませんのでご注意下さい。

転送

基本的に使い方はpdshと変わりません。-wや-gで標的となるホスト名やグループを指定します。次に展開するファイル名、コピー先のディレクトリの指定となります。

# pdcp -w 'node[001-128]' /etc/hosts /etc

これで手元のマシンの/etc/hostsが、node001-node128の128台の/etcへコピーされます。ディレクトリごとコピーしたい場合は-rオプションも指定できます。オリジナルのタイムスタンプを保持する-pオプションもあります。

ただ、多数のファイルやディレクトリをコピーする必要がある場合は、別の方法を取ったほうが効率的なことが多いです。よくやるのは、既に共有されているホームディレクトリなどにtarファイルを置いてpdshでそれを展開する方法です。圧縮はしてもしなくても構いません。ファイルサーバーやそのネットワーク負荷を考慮して適宜選んで下さい。ファイル数やノード数も多くなく、サイズも数百MB程度であれば、しないほうが効率的かもしれません。

# XZ_OPT='-T8' tar cJf /home/tmp/refdata.tar.xz /opt/reference_data
# pdsh -w 'node[001-128]' tar xJf /home/tmp/refdata.tar.xz -C /

xzはわりと新しい圧縮方法およびプログラムで、高い圧縮率と速度のバランスが良いのが特徴です。さらにここでは環境変数XZ_OPTを設定して8並列で動作させています。これまで高い圧縮率だが高負荷で遅かったbzip2にくらべて大幅な作業効率アップに繋がります。

回収

pdshとpdcpまではよく知られているのですが、実はrpdcpというpdcpの逆(reverse)バージョンが存在します。たとえば、全ての計算ノードのシステムログを回収したいというケースで活躍します。昨今では多数のコンピュータを管理するのに、システムログを個別に保存せず、ログサーバーに集約する場合も多いのですが、ここではレガシーなクラスターであるとします。

# mkdir logs
# rpdcp -w 'node[001-004]' /var/log/messages logs
# ls -l logs
-rw------- 1 root root  21777 5月 21 10:08 messages.node001
-rw------- 1 root root  37678 5月 21 10:08 messages.node002
-rw------- 1 root root 158377 5月 21 10:08 messages.node003
-rw------- 1 root root  97353 5月 21 10:08 messages.node004

ファイル名の末尾に指定したホスト名がついたファイルで保存されています。これで手元でログ解析をノード毎に比較しながら実行できます。

まとめ

2回に渡って、pdsh/pdcp/rpcdpについて紹介しました。クラスターの管理は「これ全部同じことするの?」と、うんざりするようなことが多いのも事実ですが、適切なユーティリティとちょっとした工夫で大幅に楽ができることがあります。一方で使い方を間違えると被害が全ノードに渡り、結局手で全部やり直すはめになることもあります。特にネットワーク周りの設定や変更は注意が必要です。

追記

基本的にpdsh/pdcp/rpdcpはrootで作業するのを効率的にする目的で使う事が多いのですが、もし一般ユーザーで使いたい場合、権限がたりないために失敗します。一般ユーザーで使う必要がある場合はRHEL/CentOS6ではsetuidを、7ではケーパビリティのセットをしておく必要があります。

sshではなくrsh/rcpをベースにしたいという場合、pdshg -Lでrcmd/rshがあるかを確認します。無ければpdsh-rcmd-rshをインストールの上で-R rshとして明示的に指定するか、環境変数PDSH_RCMD_TYPEにrshを設定します。また、sshのポート指定が必要など、sshに渡したいオプションがある場合には環境変数PDSH_SSH_ARGS(オリジナルのオプションを上書きしても良い場合。単に追加したい場合はPDSH_SSH_ARGS_APPEND)に設定します。