複数のリモートマシンに同時に同じコマンドを送るツールpdshについて。 hadoop系はsshコマンドを使用してリモートマシンでコマンドを実行することが多く、pdshもよく出てくるので、ここでまとめておく。

ここでは、以下の通り、driverノードからworker1ノード, worker2ノードの2台に同じコマンドを送る例を見ていく。

                        worker1
                ┌─────► 192.168.64.4
driver node     │
192.168.64.3 ───┤
                │       worker2
                └─────► 192.168.64.5

Installation

基本的にapt, yum, brewなどのパッケージャで対応している。

$ sudo apt install pdsh

$ pdsh
Usage: pdsh [-options] command ...
-S                return largest of remote command return values
-h                output usage menu and quit
-V                output version information and quit
-q                list the option settings and quit
-b                disable ^C status feature (batch mode)
-d                enable extra debug information from ^C status
-l user           execute remote commands as user
-t seconds        set connect timeout (default is 10 sec)
-u seconds        set command timeout (no default)
-f n              use fanout of n nodes
-w host,host,...  set target node list on command line
-x host,host,...  set node exclusion list on command line
-R name           set rcmd module to name
-M name,...       select one or more misc modules to initialize first
-N                disable hostname: labels on output lines
-L                list info on all loaded modules and exit
-g query,...      target nodes using genders query
-X query,...      exclude nodes using genders query
-F file           use alternate genders file `file'
-i                request alternate or canonical hostnames if applicable
-a                target all nodes except those with "pdsh_all_skip" attribute
-A                target all nodes listed in genders database
available rcmd modules: ssh,rsh,exec (default: rsh)

準備

pdsh自体は多種のリモートシェル実行に対応している。ヘルプの最後にある通り、デフォルトだとrshになっている。だけど、ほとんどのケースでsshを使うことが多いはず。ここでもsshを使う例を見ていく。

その準備として、この記事で見た公開鍵を使ったssh認証をリモートホストに事前に実行しておく必要がある。 今回の例では、driver nodeからworker1, worker2sshするので、driver nodeの公開鍵をworker1, worker2に登録しておく。

設定後にパスーワードレスでsshログインできるか確認しておく。

### driver node上(192.168.64.3)
$ ssh 192.168.64.4
> ログイン成功

$ ssh 192.168.64.5
> ログイン成功

pdshコマンドの実行

準備できたので、pdshをやってみる。

$ pdsh -w 192.168.64.4,192.168.64.5 -R ssh "date"
192.168.64.4: Mon Jan  2 10:36:36 JST 2023
192.168.64.5: Mon Jan  2 10:36:35 JST 2023

オプションの説明:

  • -w: コマンドを送る先のホスト一覧。カンマ区切りで複数指定できる。
  • -R: リモートシェルの指定。ssh, rsh, execが指定できる。

いちいち-R sshを指定するのが面倒な場合は、環境変数PDSH_RCMD_TYPE=sshで対応可能になる。

$ export PDSH_RCMD_TYPE=ssh

$ pdsh -w 192.168.64.4,192.168.64.5 "date"
192.168.64.5: Mon Jan  2 10:41:20 JST 2023
192.168.64.4: Mon Jan  2 10:41:20 JST 2023