マルチノードでApache Sparkを利用する

投稿:hagi  
2 397 通報 ウォッチ

大規模データを扱う機械学習に適した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 の利用は不要です。

    通報

    ログインしてコメントを書く

    関連する投稿