0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Databricksでのファイル解凍のベストプラクティス

Last updated at Posted at 2025-02-19

ファイルの解凍(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ファイルをボリュームにダウンロードします。

shell
%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

ボリュームに解凍します。

shell
%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秒かかっています。

Screenshot 2025-02-19 at 20.40.24.png

ブロックストレージ(クラスターのドライバーノード)でのファイル解凍

Databricksクラスターでは、一時的なキャッシュとして使用できるクラスターに直接アタッチされたストレージのマウントパスは /local_disk0 となります。

shell
%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
shell
%sh
ls /local_disk0
blockmgr-5e3c6cc1-15fa-4160-8553-f69dc7281aef
repl_tmp_data
spark-1b346bb4-fb4f-4668-872f-dec7d1aacfd4
tmp

ドライバーノードストレージの/local_disk0/tmp/にファイルをダウンロードします。

shell
%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

ブロックストレージでファイルを解凍します。

shell
%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倍)です。

Screenshot 2025-02-19 at 20.43.36.png

ただ、このままですとクラスターを停止した際にファイルが失われてしまいます。Databricksユーティリティやシェルコマンドでファイルをボリュームに移動します。

Python
dbutils.fs.mv("file:/local_disk0/tmp/bronze", "/Volumes/users/takaaki_yayoi/data/bronze", recurse=True)

これで解凍ファイルがボリュームに永続化されました。

Screenshot 2025-02-19 at 20.50.07.png

まとめ

unzip処理におけるパフォーマンス要件を考えると、より高速なデータアクセスや処理をサポートしているブロックストレージを使うことが通常は推奨となります。オブジェクトストレージは長期保管における高いコスト効率性を提供しますが、高速なunzipオペレーションに必要なパフォーマンス要件を満たさない可能性があります。

はじめてのDatabricks

はじめてのDatabricks

Databricks無料トライアル

Databricks無料トライアル

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?