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 を使う事とある
以下に 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 の2つのファイル置き場
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 のマジックコマンド
マジックコマンド
- %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