Databricks

Databricks とは、大量のデータを並列に処理するアプリを作るためのサービスだ。Apache Spark の開発者によって Apache Spark のマネージド・サービスとして開発された。ここ数日勉強しているが特に引っかかった点を書く。

一言でいうと Apache Spark とは、表形式のデータを加工するコードを自動的に並列処理に変換して並列で実行してくれるという物だ。開発者があたかも Jupyter 上の Pandas でコードを書いているような気分で巨大データを並列に加工出来る。機械学習関のライブラリも含まれているので、データの前処理から分析や予測まですべて Spark で行う事が出来る。

また、前身の(?) Hadoop との違いは、ストレージを切り離した所にある。Spark はデータ処理に特化してする事で様々な他のストレージと組み合わせて使えるようになった。

## 主な情報源

* Databricks ドキュメント: https://docs.databricks.com/
* 参考書: Spark: The Definitive Guide http://shop.oreilly.com/product/0636920034957.do
    * Apache Spark についての本だが、勉強のお勧めは Databricks Community Edition を使う事とある
        * https://community.cloud.databricks.com/

以下に Databricks で分かりにくい事があったので記録する。

## CLI

分かりにくくは無いが CLI が無いとかなり面倒なのでインストールは必須。インストールには pip3 を使う。`databricks configure` で接続情報を設定すると使えるようになる。

```
# 設定
$ pip3 install databricks-cli
$ databricks configure --token
Databricks Host (should begin with https://): https://hogehoge.cloud.databricks.com/
Token: (GUI で作った token を入力)

# 動作確認
$ databricks fs ls
```

`databricks` コマンドには様々なサブコマンドがあるが、`databricks fs` には最初から短縮形として `dbfs` が用意されている。

### Secret https://docs.databricks.com/security/secrets/index.html

Databricks でパスワードなどの秘密を扱う時は Notebook に直接書かないで Secret に保存した物を取り出して使うのがお作法だ。

* scope とは? secret の名前空間
* acl とは? ある scope のある secret の読み書き権限。

パスワードなどは scope ごとに Secret に保存する。

scope 作成

    databricks secrets create-scope --scope hoge_scope

scope 表示

    databricks secrets list-scopes

scope に secrets 追加

    databricks secrets put --scope hoge_scope --key User
    databricks secrets put --scope hoge_scope --key Password

secrets 表示

    databricks secrets list --scope hoge_scope

他の人からもアクセス出来るようにする

    databricks secrets put-acl --scope hogehoge-scope --principal hoge@hoge.com --permission MANAGE

### Notebook 内から Secret にアクセスする方法

    USER = dbutils.secrets.get(scope='hoge_scope', key='User')
    PASSWORD = dbutils.secrets.get(scope='hoge_scope', key='Password')

Secret の内容を Notebook に表示させようとすると '[REDACTED]' と表示される。面白い。

## DBFS と Workspace の２つのファイル置き場

Databricks で利用するファイルは以下の二箇所がある。

* Databricks File System (DBFS)
    * Python プログラムからは /dbfs にマウントされているように見える。
    * プログラムで利用するファイルはここに置く。
    * cli からは `databricks fs` コマンドでアクセス出来る。
    * 特に、/FileStore/ 以下はファイルのアップロードなど UI からアクセスするのに使う。
* Workspace
    * Notebook はここに置く。
    * cli からは `databricks workspace` コマンドでアクセス出来る。

なんと、プログラムから直接 Workspace にアクセスする事は出来ない！

## SQL Table と DataFrame の関係

Databricks では、表にアクセスするのに Python や SQL を使う事が出来る。同じ表を別の言語で使うには表を SQL から見える所に Table として登録する必要がある。

Table にはどこからでもアクセス出来る global と、同じ Notebook からだけアクセス出来る local がある。

Python の DataFrame を "temp_table_name" という local table として登録する。これで SQL から参照出来る。

    df.createOrReplaceTempView("temp_table_name")

Python の DataFrame を "global_table_name" という global table として登録する。これで SQL から参照出来る。global table は Web UI の Data から参照出来る。

    df.write.format("parquet").saveAsTable("global_table_name")

"temp_table_name" という名前で登録されてある table を Python の DataFrame として読む。

    temp_table = spark.table("temp_table_name")

global table は DBFS 上に保存される。保存される場所は `DESCRIBE DETAIL` で出てくる location で確認出来る。

    DESCRIBE DETAIL `global_table_name`

例えば `dbfs:/user/hive/warehouse/global_table_name`

## Notebook のマジックコマンド

https://docs.databricks.com/notebooks/notebooks-use.html

マジックコマンド

* %fs dbutils.fs を簡単に使う
    * 例: %fs ls /databricks-datasets/structured-streaming/events/
    * dbutils とは: https://docs.databricks.com/data/databricks-file-system.html#dbfs-dbutils
* %sh shell コマンド
    * 例: %sh head -n 5 /dbfs/databricks-datasets/structured-streaming/events/file-0.json
* %md: Markdown