DatabricksにおけるHailの使用

[Hail \| Databricks on AWS](https://docs.databricks.com/applications/genomics/tertiary-analytics/hail.html) [2022/1/5時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

[Hail](https://hail.is/)は大規模遺伝子データセットの分析のためにSpark上で利用できるライブラリです。

:::note warn
**重要！**
- Hail 0.2.65以降を使用する際には、Apache Spark version 3.1(Databricks Runtime 8.x か 9.x)を使用してください。
- Databricks Runtime for Genomics (deprecated)ではなく、DatabricksランタイムにHailをインストールしてください。
- Hailは[クレディンシャルパススルー](https://docs.databricks.com/security/credential-passthrough/index.html)ではサポートされません。
- Hailは、HailからGlowにエクスポートする際を除いて[Glow](https://qiita.com/taka_yayoi/items/afb2bc6d90f983ae412e)ではサポートされません。
:::

# クラスターの作成

[Databricks Container Services](https://docs.databricks.com/clusters/custom-containers.html)を用いてDocker経由でHailをインストールします。

Hail環境をセットアップするためのコンテナに関しては、[ProjectGlow Dockerhub](https://hub.docker.com/r/projectglow)ページを参照ください。`projectglow/databricks-hail:<hail_version>`で、タグを利用可能なHailのバージョンで置き換えて使用してください。

1. Hailを使用するジョブクラスターを作成します。
    1. [Databricks CLI](https://docs.databricks.com/dev-tools/cli/index.html#set-up-the-cli)をセットアップします。
    1. タグを希望の`<hail_version>`に設定して、[Hail Docker container](https://hub.docker.com/r/projectglow/databricks-hail/tags?page=1&ordering=last_updated)を用いてクラスターを作成します。
    1. 以下にサンプルのジョブ定義を示します。[notebook\_path](https://qiita.com/taka_yayoi/items/c306161906d6d34e8bd5#%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%E3%81%AE%E3%83%91%E3%82%B9%E3%81%AE%E3%82%B3%E3%83%94%E3%83%BC)とDatabricksランタイムの`<databricks_runtime_version>`と`<hail_version>`を編集してください。

    ```bash:Bash
    databricks jobs create --json-file hail-create-job.json
    ```

    `hail-create-job.json`

```json:JSON
{
  "name": "hail-job",
  "notebook_task": {
    "notebook_path" : "/Users/<user@organization.com>/hail/docs/hail-tutorial"
  },
  "new_cluster": {
    "spark_version": "<databricks_runtime_version>.x-scala2.12",
    "aws_attributes": {
      "availability": "SPOT",
      "first_on_demand": 1
    },
    "node_type_id": "r5d.4xlarge",
    "num_workers": 32,
    "docker_image": {
      "url": "projectglow/databricks-hail:<hail_version>"
    }
  }
}
```

# ノートブックでHailを使う

多くの部分に関しては、Hailドキュメントと同じようにDatabricksのHailは動作します。しかし、Databricks環境ではいくつかの変更が必要となります。

## Hailの初期化

Hailを初期化する際、作成済みの`SparkContext`を引渡し、`idempotent`を`True`にしてください。この設定によって、複数のDatabricksノートブックがHailと同じコンテキストを使用するようになります。

:::note info
**注意**
ローテーションされるドライバーのlog4jのアウトプットにログを保存するには、`skip_logging_configuration`を有効化してください。この設定はHail 0.2.39以降でのみサポートされています。
:::

```py:Python
import hail as hl
hl.init(sc, idempotent=True, quiet=True, skip_logging_configuration=True)
```

## Bokehプロットの表示

Hailはプロットの作成に[Bokeh](https://docs.bokeh.org/en/latest/)を使用します。Bokehに組み込まれている`show`関数はDatabricksでは動作しません。Hailによって生成されるBokehプロットを表示するには、以下のようなコマンドを実行します。

```py:Python
from bokeh.embed import components, file_html
from bokeh.resources import CDN
plot = hl.plot.histogram(mt.DP, range=(0,30), bins=30, title='DP Histogram', legend='DP')
html = file_html(plot, CDN, "Chart")
displayHTML(html)
```

詳細は[Bokeh](https://qiita.com/taka_yayoi/items/5dc796aa7ceb33a5d5c6)を参照ください。

### Databricks 無料トライアル

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