ファイルの解凍(unzip)については、こちらのマニュアルがあります。
要はシェルでunzip
を実行しろということなのですが、こちらにはどこに解凍したらいいのかについては特に言及されていません。
Databricksではファイルを格納する場所についての選択肢があり、こちらのマニュアルで説明がされています。
これらをベースに、(個人的意見による)ファイル解凍のベストプラクティスをまとめます。
Databricksにおけるストレージの理解
Databricksでは、ファイルを解凍する際に用いるストレージに以下の選択肢があります。
- オブジェクトストレージ: Unity CatalogのボリュームやDBFS。背後にあるのはADLSやS3と言ったオブジェクトストレージです。
- ブロックストレージ: Databricksクラスターにアタッチされる揮発性のストレージはブロックストレージです。
ファイルのunzipを検討する際、ブロックストレージとオブジェクトストレージには、それぞれの強みとユースケースがありますが、どちらにするかの選択は特定の要件や条件によります。
ブロックストレージ:
-
強み:
- 頻繁で高速な読み書きアクセスを必要とするオペレーションに適しているブロックとしてデータを取り扱うので、通常より高速なI/Oパフォーマンスを提供します。
- データの処理やアクセスをクイックに行う必要があるワークロードに最適化されており、ファイルのunzipのような中間データ処理に適したものとなります。
- ファイルシステムへの直接アクセスに必要なオペレーションデメリットとなる、ビルトインのPOSIXベースのアクセスを提供します。
-
考慮事項:
- VMにアタッチされている際にはエフェメラル(揮発性)の性質を持つので、明示的に永続化しない限り、コンピュートインスタンスが停止されるとブロックストレージに格納されているデータは永続化されないことを意味します。
オブジェクトストレージ:
-
強み:
- 高い可用性、耐障害性、信頼性を提供します。
- 無限にスケールするソリューションであり、長期のデータ保管のコスト効率が高くなります。
- ブロックストレージと比べて安価なコストとなります。
-
考慮事項:
- データ操作ではREST APIインタフェースを用いているため、ファイルのunzipのような頻繁な読み書きのオペレーションでは非効率的となり、ブロックストレージと比較して多くの場合遅くなります。
- 高いI/Oパフォーマンスやファイルシステムへの直接アクセスを必要とするワークロードには通常向いていません。
以下では、196Mのzipファイルをオブジェクトストレージとブロックストレージで解凍します。
オブジェクトストレージ(ボリューム)でのファイル解凍
zipファイルをボリュームにダウンロードします。
%sh
curl https://sajpstorage.blob.core.windows.net/yayoi/bronze.zip --output /Volumes/users/takaaki_yayoi/data/bronze.zip
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 196M 100 196M 0 0 14.1M 0 0:00:13 0:00:13 --:--:-- 16.0M
ボリュームに解凍します。
%sh
unzip /Volumes/users/takaaki_yayoi/data/bronze.zip -d /Volumes/users/takaaki_yayoi/data/
Archive: /Volumes/users/takaaki_yayoi/data/bronze.zip
creating: /Volumes/users/takaaki_yayoi/data/bronze/
inflating: /Volumes/users/takaaki_yayoi/data/bronze/.DS_Store
inflating: /Volumes/users/takaaki_yayoi/data/__MACOSX/bronze/._.DS_Store
creating: /Volumes/users/takaaki_yayoi/data/bronze/products/
creating: /Volumes/users/takaaki_yayoi/data/bronze/departments/
creating: /Volumes/users/takaaki_yayoi/data/bronze/aisles/
creating: /Volumes/users/takaaki_yayoi/data/bronze/order_products/
creating: /Volumes/users/takaaki_yayoi/data/bronze/orders/
inflating: /Volumes/users/takaaki_yayoi/data/bronze/products/products.csv
inflating: /Volumes/users/takaaki_yayoi/data/__MACOSX/bronze/products/._products.csv
inflating: /Volumes/users/takaaki_yayoi/data/bronze/products/.DS_Store
inflating: /Volumes/users/takaaki_yayoi/data/__MACOSX/bronze/products/._.DS_Store
inflating: /Volumes/users/takaaki_yayoi/data/bronze/departments/.DS_Store
inflating: /Volumes/users/takaaki_yayoi/data/__MACOSX/bronze/departments/._.DS_Store
inflating: /Volumes/users/takaaki_yayoi/data/bronze/departments/departments.csv
inflating: /Volumes/users/takaaki_yayoi/data/__MACOSX/bronze/departments/._departments.csv
inflating: /Volumes/users/takaaki_yayoi/data/bronze/aisles/aisles.csv
inflating: /Volumes/users/takaaki_yayoi/data/__MACOSX/bronze/aisles/._aisles.csv
inflating: /Volumes/users/takaaki_yayoi/data/bronze/order_products/.DS_Store
inflating: /Volumes/users/takaaki_yayoi/data/__MACOSX/bronze/order_products/._.DS_Store
inflating: /Volumes/users/takaaki_yayoi/data/bronze/order_products/order_products__train.csv
inflating: /Volumes/users/takaaki_yayoi/data/__MACOSX/bronze/order_products/._order_products__train.csv
inflating: /Volumes/users/takaaki_yayoi/data/bronze/order_products/order_products__prior.csv
inflating: /Volumes/users/takaaki_yayoi/data/__MACOSX/bronze/order_products/._order_products__prior.csv
inflating: /Volumes/users/takaaki_yayoi/data/bronze/orders/orders.csv
inflating: /Volumes/users/takaaki_yayoi/data/__MACOSX/bronze/orders/._orders.csv
inflating: /Volumes/users/takaaki_yayoi/data/bronze/orders/.DS_Store
inflating: /Volumes/users/takaaki_yayoi/data/__MACOSX/bronze/orders/._.DS_Store
16秒かかっています。
ブロックストレージ(クラスターのドライバーノード)でのファイル解凍
Databricksクラスターでは、一時的なキャッシュとして使用できるクラスターに直接アタッチされたストレージのマウントパスは /local_disk0
となります。
%sh
df -h
Filesystem Size Used Avail Use% Mounted on
/var/lib/lxc/base-images/release__16.1.x-snapshot-cpu-ml-scala2.12__databricks__16.1.2__5548821__c3b85fa__jenkins__41fbd82__format-3 147G 15G 125G 11% /
none 492K 4.0K 488K 1% /dev
/dev/xvdb 147G 15G 125G 11% /mnt/readonly
/dev/mapper/vg-lv 870G 11G 816G 2% /local_disk0
/dev/root 29G 20G 9.4G 68% /ttyd
tmpfs 15G 0 15G 0% /dev/shm
tmpfs 6.0G 72K 6.0G 1% /run
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 4.0M 0 4.0M 0% /sys/fs/cgroup
workspace 10G 0 10G 0% /Workspace
/: 1.0P 0 1.0P 0% /dbfs
/: 1.0P 0 1.0P 0% /Volumes
%sh
ls /local_disk0
blockmgr-5e3c6cc1-15fa-4160-8553-f69dc7281aef
repl_tmp_data
spark-1b346bb4-fb4f-4668-872f-dec7d1aacfd4
tmp
ドライバーノードストレージの/local_disk0/tmp/
にファイルをダウンロードします。
%sh
curl https://sajpstorage.blob.core.windows.net/yayoi/bronze.zip --output /local_disk0/tmp/bronze.zip
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 196M 100 196M 0 0 16.0M 0 0:00:12 0:00:12 --:--:-- 19.0M
ブロックストレージでファイルを解凍します。
%sh
unzip /local_disk0/tmp/bronze.zip -d /local_disk0/tmp/
Archive: /local_disk0/tmp/bronze.zip
creating: /local_disk0/tmp/bronze/
inflating: /local_disk0/tmp/bronze/.DS_Store
inflating: /local_disk0/tmp/__MACOSX/bronze/._.DS_Store
creating: /local_disk0/tmp/bronze/products/
creating: /local_disk0/tmp/bronze/departments/
creating: /local_disk0/tmp/bronze/aisles/
creating: /local_disk0/tmp/bronze/order_products/
creating: /local_disk0/tmp/bronze/orders/
inflating: /local_disk0/tmp/bronze/products/products.csv
inflating: /local_disk0/tmp/__MACOSX/bronze/products/._products.csv
inflating: /local_disk0/tmp/bronze/products/.DS_Store
inflating: /local_disk0/tmp/__MACOSX/bronze/products/._.DS_Store
inflating: /local_disk0/tmp/bronze/departments/.DS_Store
inflating: /local_disk0/tmp/__MACOSX/bronze/departments/._.DS_Store
inflating: /local_disk0/tmp/bronze/departments/departments.csv
inflating: /local_disk0/tmp/__MACOSX/bronze/departments/._departments.csv
inflating: /local_disk0/tmp/bronze/aisles/aisles.csv
inflating: /local_disk0/tmp/__MACOSX/bronze/aisles/._aisles.csv
inflating: /local_disk0/tmp/bronze/order_products/.DS_Store
inflating: /local_disk0/tmp/__MACOSX/bronze/order_products/._.DS_Store
inflating: /local_disk0/tmp/bronze/order_products/order_products__train.csv
inflating: /local_disk0/tmp/__MACOSX/bronze/order_products/._order_products__train.csv
inflating: /local_disk0/tmp/bronze/order_products/order_products__prior.csv
inflating: /local_disk0/tmp/__MACOSX/bronze/order_products/._order_products__prior.csv
inflating: /local_disk0/tmp/bronze/orders/orders.csv
inflating: /local_disk0/tmp/__MACOSX/bronze/orders/._orders.csv
inflating: /local_disk0/tmp/bronze/orders/.DS_Store
inflating: /local_disk0/tmp/__MACOSX/bronze/orders/._.DS_Store
6秒で完了しました。ブロックストレージと比較して10秒高速(2.7倍)です。
ただ、このままですとクラスターを停止した際にファイルが失われてしまいます。Databricksユーティリティやシェルコマンドでファイルをボリュームに移動します。
dbutils.fs.mv("file:/local_disk0/tmp/bronze", "/Volumes/users/takaaki_yayoi/data/bronze", recurse=True)
これで解凍ファイルがボリュームに永続化されました。
まとめ
unzip処理におけるパフォーマンス要件を考えると、より高速なデータアクセスや処理をサポートしているブロックストレージを使うことが通常は推奨となります。オブジェクトストレージは長期保管における高いコスト効率性を提供しますが、高速なunzipオペレーションに必要なパフォーマンス要件を満たさない可能性があります。