Skip to content

Instantly share code, notes, and snippets.

@stakizawa
Created December 25, 2020 10:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save stakizawa/26542c6e33371d157dd3e61f39fca4a5 to your computer and use it in GitHub Desktop.
Save stakizawa/26542c6e33371d157dd3e61f39fca4a5 to your computer and use it in GitHub Desktop.
ABCI上でSpark 2.4.0を実行する方法

ABCI上でSpark 2.4.0を実行する方法

Sparkの実行モードはStand Aloneモード、Master, Workerのデータ・ログはSSD領域を使用する設定で動作させます。

spark_on_abci.shは、ABCIで実行されるジョブの中でSparkの実行準備、終了処理を行う関数群を定義したファイル。 Sparkを使用するためには、そのファイルをジョブスクリプト内やシェル上で読み込みます。

バッチジョブとして使用する場合

Spark付属のPI計算のサンプルプログラムを実行する例。 Sparkの実行環境を構築する前(prepare_spark呼び出し前)に、ジョブのバックグラウンドでSpark Workerを起動させ続ける時間を指定する必要がある。 以下の例ではジョブの最大実行時間に合わせている。

#!/bin/sh
#$-l rt_F=3
#$-cwd
#$-l h_rt=1:00:00

source ./spark_on_abci.sh
export SPARK_WORKER_RUNTIME=3600
prepare_spark
$SPARK_HOME/bin/spark-submit $SPARK_HOME/examples/src/main/python/pi.py 10
cleanup_spark

ジョブ実行終了後、標準出力、エラー出力に加えて、Sparkのログファイルが出力される。

インタラクティブジョブでspark-shellを使用する場合

spark-submitspark-shellに変わっただけで、上記の処理とほぼ同じ手続きでSparkの実行準備、終了処理を行う。

[esX] $ qrsh -g gab50212 -ar 2625 -l rt_F=3 -l h_rt=05:00:00
[gXXXX] $ source spark_on_abci.sh
[gXXXX] $ export SPARK_WORKER_RUNTIME=3300
[gXXXX] $ prepare_spark
[gXXXX] $ spark-shell
...
[gXXXX] $ cleanup_spark
source /etc/profile.d/uge.sh
source /etc/profile.d/modules.sh
module load openjdk/1.8.0.242
module load spark/2.4
export SPARK_HOME=/apps/spark/2.4
# Set directory path
export SPARK_PID_DIR=$SGE_LOCALDIR/tmp
export SPARK_LOG_DIR=$SGE_LOCALDIR/spark_log
export SPARK_DATA_DIR=$SGE_LOCALDIR/spark_data
export SPARK_LOCAL_DIRS=$SPARK_PID_DIR
# Select master and workers
export SPARK_MASTER_NODE=`cat $PE_HOSTFILE | cut -f1 -d " " | head -1`
SPARK_WORKER_NODES=(`cat $PE_HOSTFILE | cut -f1 -d " "`)
export SPARK_WORKER_NODES
function prepare_spark () {
echo Spark Master: $SPARK_MASTER_NODE
echo Spark Workers:
for worker in ${SPARK_WORKER_NODES[@]}; do
echo ' ' ${worker}
done
# Start master
$SPARK_HOME/sbin/start-master.sh
# Start slave
SPARK_WORKER_RUNTIME=${SPARK_WORKER_RUNTIME:-600}
for worker in ${SPARK_WORKER_NODES[@]}; do
qrsh -inherit ${worker} \
mkdir -p $SPARK_PID_DIR $SPARK_LOG_DIR $SPARK_DATA_DIR
qrsh -inherit -v SPARK_PID_DIR=$SPARK_PID_DIR \
-v SPARK_LOCAL_DIRS=$SPARK_LOCAL_DIRS \
-v SPARK_LOG_DIR=$SPARK_LOG_DIR ${worker} \
"$SPARK_HOME/sbin/start-slave.sh --work-dir $SPARK_DATA_DIR spark://$SPARK_MASTER_NODE:7077; sleep $SPARK_WORKER_RUNTIME" &
done
}
function stop_spark () {
# Stop slave
for worker in ${SPARK_WORKER_NODES[@]}; do
qrsh -inherit -v SPARK_PID_DIR=$SPARK_PID_DIR \
-v SPARK_LOCAL_DIRS=$SPARK_LOCAL_DIRS \
-v SPARK_LOG_DIR=$SPARK_LOG_DIR ${worker} \
$SPARK_HOME/sbin/stop-slave.sh
done
# Stop master
$SPARK_HOME/sbin/stop-master.sh
}
function collect_spark_log () {
LOGOUT_DIR=`pwd`/${JOB_NAME}.sparklog${JOB_ID}
mkdir -p $LOGOUT_DIR
ALL_HOSTS=(`cat $PE_HOSTFILE | cut -f1 -d " "`)
for host in ${ALL_HOSTS[@]}; do
qrsh -inherit ${host} \
tar zcf $LOGOUT_DIR/spark-log-${host}.tar.gz -C $SGE_LOCALDIR spark_log
qrsh -inherit ${host} rm -fr $SPARK_LOG_DIR
done
}
function cleanup_spark () {
stop_spark
collect_spark_log
}
#!/bin/sh
#$-l rt_F=3
#$-cwd
#$-l h_rt=1:00:00
source ./spark_on_abci.sh
export SPARK_WORKER_RUNTIME=3600
prepare_spark
$SPARK_HOME/bin/spark-submit $SPARK_HOME/examples/src/main/python/pi.py 10
cleanup_spark
@yoriyuki
Copy link

spark-submitに--master spark://$SPARK_MASTER_NODE:7077のようなmasterの指定はいらないのでしょうか。

@stakizawa
Copy link
Author

このspark_on_abci.shを使う場合はなくても問題ありません。明示的に指定しても問題ありません。

spark_on_abci.shのl.29でSpark Masterを実行していますが、qrshでリモートホスト実行指定していないため、ローカルホスト上で実行されます。
このとき、バッチジョブ(spark_submit.sh)として実行する場合、spark_on_abci.shをsourceしたホスト上でMasterは実行されます。
spark_submit.shのl.9のspark-submitspark_on_abci.shをsourceしたホスト上で実行されているため、デフォルトのMaster(local[*])に接続を試みます。実際にMasterはそこで動作しているため、問題なくMasterと通信できます。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment