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

ファイルの解凍(unzip)については、こちらのマニュアルがあります。

https://learn.microsoft.com/ja-jp/azure/databricks/files/unzip-files

要はシェルで`unzip`を実行しろということなのですが、こちらには**どこに**解凍したらいいのかについては特に言及されていません。

Databricksではファイルを格納する場所についての選択肢があり、こちらのマニュアルで説明がされています。

https://learn.microsoft.com/ja-jp/azure/databricks/files/write-data

https://learn.microsoft.com/ja-jp/azure/databricks/files/

これらをベースに、(個人的意見による)ファイル解凍のベストプラクティスをまとめます。

# Databricksにおけるストレージの理解

Databricksでは、ファイルを解凍する際に用いるストレージに以下の選択肢があります。

- **オブジェクトストレージ:** Unity Catalogの[ボリューム](https://learn.microsoft.com/ja-jp/azure/databricks/sql/language-manual/sql-ref-volumes)や[DBFS](https://learn.microsoft.com/ja-jp/azure/databricks/dbfs/)。背後にあるのはADLSやS3と言ったオブジェクトストレージです。
- **ブロックストレージ:** Databricksクラスターにアタッチされる揮発性のストレージはブロックストレージです。

ファイルのunzipを検討する際、ブロックストレージとオブジェクトストレージには、それぞれの強みとユースケースがありますが、どちらにするかの選択は特定の要件や条件によります。

**ブロックストレージ:**

- **強み:**
  - 頻繁で高速な読み書きアクセスを必要とするオペレーションに適しているブロックとしてデータを取り扱うので、通常より高速なI/Oパフォーマンスを提供します。
  - データの処理やアクセスをクイックに行う必要があるワークロードに最適化されており、ファイルのunzipのような中間データ処理に適したものとなります。
  - ファイルシステムへの直接アクセスに必要なオペレーションデメリットとなる、ビルトインのPOSIXベースのアクセスを提供します。
- **考慮事項:**
  - VMにアタッチされている際にはエフェメラル(揮発性)の性質を持つので、明示的に永続化しない限り、コンピュートインスタンスが停止されるとブロックストレージに格納されているデータは永続化されないことを意味します。

**オブジェクトストレージ:**

- **強み:**
  - 高い可用性、耐障害性、信頼性を提供します。
  - 無限にスケールするソリューションであり、長期のデータ保管のコスト効率が高くなります。
  - ブロックストレージと比べて安価なコストとなります。
- **考慮事項:**
  - データ操作ではREST APIインタフェースを用いているため、ファイルのunzipのような頻繁な読み書きのオペレーションでは非効率的となり、ブロックストレージと比較して多くの場合遅くなります。
  - 高いI/Oパフォーマンスやファイルシステムへの直接アクセスを必要とするワークロードには通常向いていません。

以下では、196Mのzipファイルをオブジェクトストレージとブロックストレージで解凍します。

# オブジェクトストレージ(ボリューム)でのファイル解凍

zipファイルをボリュームにダウンロードします。

```sh: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
```

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

```sh: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b2b33b0d-ff5f-45d6-bd42-d54773492ffe.png)

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

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

```sh: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
```

```sh:shell
%sh
ls /local_disk0
```
```
blockmgr-5e3c6cc1-15fa-4160-8553-f69dc7281aef
repl_tmp_data
spark-1b346bb4-fb4f-4668-872f-dec7d1aacfd4
tmp
```

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

```sh: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
```

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

```sh: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/0ec48802-648b-4a1a-97f4-ed46f19d59a3.png)

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

```py: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/50ff9c22-6354-4a93-bdfd-7ea9b32cc661.png)



# まとめ

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

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)