PrivateLink構成のDatabricksでライブラリをインストールする

DatabricksではAWS PrivateLinkを用いて閉域網の構成を組むことができます。セキュリティは向上しますが、クラスターから公衆回線にアクセスできないので、GUI経由でのライブラリのインストールができなくなります。

https://qiita.com/taka_yayoi/items/c6bdbb6452f6a0895961

この場合、ライブラリのインストール方法の選択肢には以下のようなものがあります。

1. インターネット接続可能なネットワークでライブラリをダウンロード、ファイルを閉域網に移動してからインストール(オフラインインストール)
1. 閉域網内にリポジトリサーバーを立てる
1. Proxyサーバで特定のURLのみの通信を許可する(AWSとProxyサーバでネットワークが疎通している必要あり)
1. 必要なライブラリをインストール済みのカスタムランタイムをDockerコンテナに用意しておく

一長一短ありますが、ここでは追加の設定が不要な手順1を説明します。また、ここではPyPIとMavenからのインストールが必要なライブラリ[Glow](https://glow.readthedocs.io/en/latest/index.html)を対象にします。

:::note info
**注意**
上記ライブラリ以外での動作確認を行ったわけではないので、場合によっては動作しない可能性があることにご注意ください。ここで説明しているオフラインインストールの方法でライブラリをインストールしても、ライブラリ自体が外部との通信を必要とする場合もあります。
:::

# PyPIからのライブラリのダウンロード

ローカルマシンでダウンロード用のディレクトリを作成します。

```bash:Bash
mkdir glow
cd glow
```

ライブラリで使用するwheelファイルをダウンロードします。

```bash:Bash
pip download glow.py==1.0.0
```

![Screen Shot 2022-06-15 at 11.38.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/304cc779-3165-b7cb-eb71-0f9a82c680c2.png)

こちらを圧縮しておきます。圧縮ファイルは`glow.zip`とします。

# Mavenからのライブラリのダウンロード

こちらは少し複雑です。以下を参考にさせていただきました。Macの場合は`brew install maven`でmavenをインストールしておきます。

https://qiita.com/rk05231977/items/9dcf8b6cc3cdc9d50a2d

```bash:Bash
mkdir glow_maven
cd glow_maven
```

上のディレクトリ内に`pom.xml`ファイルを作成します。`<dependency>`の内容はMaven Repositoryで取得します。

https://mvnrepository.com/artifact/io.projectglow/glow-spark3_2.12/1.0.0

```xml:pom.xml
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>id</groupId>
<artifactId>dl</artifactId>
<version>1</version>

<dependencies>
<!-- https://mvnrepository.com/artifact/io.projectglow/glow-spark3 -->
<dependency>
    <groupId>io.projectglow</groupId>
    <artifactId>glow-spark3_2.12</artifactId>
    <version>1.0.0</version>
</dependency>

</dependencies>
</project>
```

以下を実行してjarファイルをダウンロードします。

```bash:Bash
mvn dependency::copy-dependencies
```

![Screen Shot 2022-06-15 at 11.43.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/55babdcb-78e7-2c00-d9ee-35b41e8d586d.png)

こちらも`dependency`以下を圧縮しておきます。`dependency.zip`とします。

# ライブラリのアップロード

[Databricksファイルシステム(DBFS)](https://qiita.com/taka_yayoi/items/897264c486e179d72247)に上のステップで作成した圧縮ファイルをアップロードします。事前にライブラリを格納するパスを決めておきます。ここでは`/FileStore/libraries`以下にファイルを格納します。必要に応じてパスを変更ください。

1. サイドバーの**データ**をクリックし、**アップロード**をクリックします。
![Screen Shot 2022-06-15 at 11.51.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/fbd7265f-f3ad-9587-7b49-1b1dc1e0c873.png)
1. DBFSターゲットディレクトリを`/FileStore/libraries`とし、上のステップで作成したzipファイルをドラッグアンドドロップします。
![Screen Shot 2022-06-15 at 11.51.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/47ee889f-7d3c-9cd0-7d83-f613ddb8f8a4.png)
![Screen Shot 2022-06-15 at 12.06.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b6a31493-02b1-8e49-1720-750268bb944c.png)

# ライブラリの解凍

zipファイルを解凍します。

クラスターとノートブックを作成し、以下のコマンドを実行して解凍します。

```sh:Shell
%sh
unzip /dbfs/FileStore/libraries/glow.zip -d /dbfs/FileStore/libraries
```

```sh:Shell
%sh
unzip /dbfs/FileStore/libraries/dependency.zip -d /dbfs/FileStore/libraries/glow_maven
```

このような状態になります。
![Screen Shot 2022-06-15 at 12.49.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/263360d4-3d2e-ea17-d78e-ee80ca53b7cb.png)


# initスクリプトの作成

上のステップまで完了すればGUIからライブラリをインストールすることは可能ですが、ファイルの数が多いので一括でインストールを行うinitスクリプトを作成してクラスターに設定します。

こちらを参考にしました。

https://stackoverflow.com/questions/66431231/install-jar-file-in-dbfs-and-mvn-packages-using-init-script/66480790#66480790

ノートブックで以下を実行して、initスクリプト`/databricks/scripts/maven-glow-install.sh`を作成します。

```py:Python
dbutils.fs.put("/databricks/scripts/maven-glow-install.sh","""
#!/bin/bash
cp /dbfs/FileStore/libraries/glow_maven/dependency/*.jar /databricks/jars/
""", True)
```

# クラスターの作成

Glowをインストールするクラスターを作成します。Glowのバージョンとの関係で、ここでは**Databricks Runtimeのバージョン**を**7.3 LTS ML (includes Apache Spark 3.0.1, Scala 2.12)** にします。

![Screen Shot 2022-06-15 at 12.53.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/fe89b50c-38d9-8895-675a-ff22404de908.png)

**高度なオプション**を展開して**initスクリプト**のタブを開き、**送信先**を**DBFS**、**initスクリプトのパス**に`dbfs:/databricks/scripts/maven-glow-install.sh`を指定し、**追加**をクリックします。
![Screen Shot 2022-06-15 at 12.53.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6e41867a-5a7c-48d8-c3d8-16def83f558a.png)

これでクラスターを起動します。

# wheelのインストール

最後にwheelをライブラリとしてインストールします。

ノートブックの最初のセルで以下を実行します。これによって、`--find-links`に指定したDBFSパスから依存ライブラリも併せてインストールします。

```
%pip install --no-index --find-links=/dbfs/FileStore/libraries/glow/ /dbfs/FileStore/libraries/glow/glow.py-1.0.0-py3-none-any.whl
```

これで、PrivateLink環境でもglowが利用できるようになりました。

```py:Python
import glow
spark = glow.register(spark)
from pyspark.sql.functions import *
path = "/databricks-datasets/genomics/1kg-vcfs/ALL.chr22.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.vcf.gz"

df = spark.read.format("vcf").option("includeSampleIds", True).load(path)

display(df)
```

![Screen Shot 2022-06-24 at 8.40.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2db748fe-af7f-722d-c846-b2909cabb124.png)


### Databricks 無料トライアル

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