マルチノードでApache Sparkを利用する
大規模データを扱う機械学習に適したSpark。ABCIでも利用できる。では、マルチノードを使って分散処理を最大限生かすには、どんな注意点があるのだろうか?
・ABCIでSparkの環境設定は簡単: 関連リンクへ
1.割当ホスト情報の確認
ジョブスケジューラ(Univa Grid Engine: UGE)によってジョブに割り当てられた環境変数(PE_HOSTFILEまたは、SGE_JOB_HOSTLIST)を参照して、割り当てられた計算資源を参照する。
<実行例:2台の計算ノードで実行する場合>
[username@es1 ~]$ qrsh -l rt_F=2 -g ABCIグループ名
[username@g0120 ~]$ cat $PE_HOSTFILE
g0120 80 gpu@g0120 <NULL>
g0121 80 gpu@g0121 <NULL>
[username@g0120 ~]$ cat $SGE_JOB_HOSTLIST
g0120
g0121
2.ジョブのスレーブノードでコマンド実行するには、qrshを使う
計算ノード間でsshアクセスは許可されていないので、ジョブのスレーブノードでコマンドを実行する場合は、qrshコマンドを使用し、オプションに -inherit を指定する。
<実行例>
[username@g0120 ~]$ qrsh -inherit g0121 hostname
g0121.abci.local
3.ジョブのマスタノードで処理が終了する時の注意
ジョブのマスタノードで処理が終了すると、バックグランドプロセスやスレーブノードにプロセスが存在していてもジョブが終了してしまう。したがって、適宜、待合せ処理を追加して、それを防止する。
コメント
yoriyuki さん: 2020-12-23 15:07:55
複数ノードを予約してSparkのスタンドアローンモードでクラスターを構成しようとしています。いくつか質問させてください
start-master.shとstart-slaves.shはどのように実行すればよいでしょうか。qsubやqrshでコマンドを実行するとその後予約時間が終了するまでmaster/workerは動き続けるのでしょうか。なおqrshでのインタラクティブセッションによる実行は、セッション切れの可能性があるため避けたいと思っています。
master/worker間の通信はとくに設定せずとも予約ホストのホスト名+masterのポート番号を使ってできるのでしょうか。それともsshによるトンネリング等が必要なのでしょうか。
slave listはconf/slavesを用いて通常設定すると思いますが、SPARK_HOME以下は書き込み禁止であるため設定できないと思います。この場合どのようにすればよいでしょうか。
よろしくお願いします。
通報
コメント
コメントを削除
この操作は取り消しできません。本当に続けますか?
複数ノードを予約してSparkのスタンドアローンモードでクラスターを構成 hagi さん: 2020-12-25 14:48:26
yoriyukiさん、コメントありがとうございます。以下の通り、回答します。
qrsh コマンドに -inherit オプションを指定し、spark workerのプロセスを立ち上げることで、Apache Spark を複数ノードで利用可能です。
例) ジョブに g0001, g0002 が割り当たっている場合
g0001 $ ${SPARK_DIR}/sbin/start-master.sh
...
g0001 $ qrsh -inherit g0002 "${SPARK_DIR}/sbin/start-slave.sh spark://g0001:7077 >/dev/null 2>&1; sleep 3600" &
* sleepを入れないと、qrshセッションが切れてしまい、spark workerプロセスが停止してしまいます。
* Apache Spark(スタンドアロンモード)では、ssh の利用は不要です。
通報
コメント
コメントを削除
この操作は取り消しできません。本当に続けますか?