Glue (Python Shell)の一時ディレクトリの容量について

2023.10.20

データアナリティクス事業本部のueharaです。

今回は、Glue (Python Shell)の一時ディレクトリの容量について少し見てみたいと思います。

Glue (Python Shell)のスペック

Glue (Python Shell)について、こちらのページに以下の記載があります。

DPU は処理能力を相対的に測定するもので、4個のvCPUのコンピューティング性能と16GBのメモリで構成されています。詳細については、AWS Glue料金を参照してください。

値を 0.0625 または 1 に設定できます。デフォルトは 0.0625 です。

いずれの場合も、インスタンスのローカルディスクは 20GB になります。

実験

巨大な一時ファイルを作成してみる

インスタンスのローカルディスクはDPUに依らず20GBとのことだったので、 /tmp ディレクトリに 約18GB のファイルを書き込む以下のジョブを実行してみます。

test-glue-job.py

import os
import tempfile


file_size_bytes = 18 * 1000 * 1000 * 1000
chunk_size_bytes = 1000 * 1000 * 1000

print("start!")

tmp_dir = tempfile.gettempdir()
with open(os.path.join(tmp_dir, "tmp.txt"), "wb") as f:
    bytes_written = 0
    # 約1GBずつ書き込み
    while bytes_written < file_size_bytes:
        data = os.urandom(min(chunk_size_bytes, file_size_bytes - bytes_written))
        f.write(data)
        bytes_written += len(data)

print("finish!")

上記を実行した結果、以下のエラーとなりました。

OSError: [Errno 28] No space left on device

どうやら 18GB のファイル容量を書き込むための空きスペースが無いようです。

ディスクの容量を確認してみる

以下のジョブを実行し、ディスク容量を確認してみます。

test-glue-job-2.py

import subprocess


cp = subprocess.run("df -h", shell=True, capture_output=True, text=True)
print(cp.stdout)

結果は以下の通りでした。

Filesystem      Size  Used Avail Use% Mounted on
overlay          20G  6.1G   14G  32% /
tmpfs            64M     0   64M   0% /dev
tmpfs           474M     0  474M   0% /sys/fs/cgroup
/dev/nvme0n1p1   20G  6.1G   14G  32% /connection
shm              64M     0   64M   0% /dev/shm
tmpfs           474M     0  474M   0% /proc/acpi
tmpfs           474M     0  474M   0% /sys/firmware

上記を見ても分かる通り、確かにローカルディスクは 20GB となっていますが、その全てが使えるわけでは無いことが分かります。(当然と言えば当然ですが...)

では、今度は 10GB の一時ファイルを作成し、 /tmp の容量を確認する以下のプログラムを実行してみます。

test-glue-job-3.py

import os
import subprocess
import sys
import tempfile


file_size_bytes = 10 * 1000 * 1000 * 1000
chunk_size_bytes = 1000 * 1000 * 1000

print("start!")

tmp_dir = tempfile.gettempdir()
with open(os.path.join(tmp_dir, "tmp.txt"), "wb") as f:
    bytes_written = 0
    # 約1GBずつ書き込み
    while bytes_written < file_size_bytes:
        data = os.urandom(min(chunk_size_bytes, file_size_bytes - bytes_written))
        f.write(data)
        bytes_written += len(data)
        
cp = subprocess.run("df -h /tmp", shell=True, capture_output=True, text=True)
print(cp.stdout)

print("finish!")

無事正常終了し、出力結果は以下の通りでした。

start!
Filesystem      Size  Used Avail Use% Mounted on
overlay          20G   16G  4.1G  79% /
finish!

先程何もしていない状態でのoverlayのAvailは 約14GB だったので、 10GB 書き込んだ後のAvailは 4.1GB になっています。

一時ディレクトリに書き込む際は全体の容量を意識して行いましょう。

最後に

今回は、Glue (Python Shell)の一時ディレクトリの容量について確認してみました。

参考になりましたら幸いです。

参考文献