Spark on EMRでディスク容量不足になった時の対処法


Spark on EMRでS3のデータを集計する際、ディスク容量不足になったのでその対策

ディスク容量の確認

df -h
ファイルシステム サイズ 使用 残り 使用% マウント位置
/dev/xvda 9.8G 6.6G 2.7G 72% /
devtmpfs 7.4G 20K 7.4G 1% /dev
tmpfs 7.4G 0 7.4G 0% /dev/shm
/dev/xvdb 38G 37M 38G 1% /mnt
/dev/xvdc 38G 35M 38G 1% /mnt1

Sparkがデフォルト使う、/dev/xvdaは10GBしか確保されておらず
かつ最初から7GB弱埋まっていて、残り3GBしか空きがない。
なので、3GB以上のファイルをディスクにのせてしまうとエラーになる。

⇡はm3.xlargeのもので、m3.2xlargeを試しても/dev/xvdaが10GBなのは
変わらなかった。

ディスク不足になる要因

ファイルはS3にあるのに、何のファイルが3GB分も容量を使っているのか調べてみると
スクリプト実行時に、ブロックマネージャーが生成しているファイルが
数GB単位にまで膨らんで、ディスク容量オーバーになっていた。
/tmp/blockmgr-XXXXXXXXXXX-XXXX-XXXXX
⇡これ

このファイルはスクリプト終了時に勝手に消える。

解決策

blockmgr-XXXXXXXXXXX-XXXX-XXXXXの吐き出し先を、/mnt下に移せばいい。
-> Sparkのローカルディレクトリを/mntへ移す。

export SPARK_LOCAL_DIRS='/mnt/s3'

もしくはソース内で、設定する。

# Python
conf = SparkConf()\
        .setMaster("local")\
        .set("spark.local.dir","/mnt/s3")

sc = SparkContext(conf=conf)

/mnt下のs3を指定している理由は特に無し。(必要に応じて変えてください)