every Tech Blog

株式会社エブリーのTech Blogです。

データ分析が捗るDatabricksのススメ

はじめに

はじめまして。2020年4月にエブリーに新卒で入社した吉田です。
私はデータエンジニア・データサイエンティストとして入社し、データ関連部門に配属して日々データ業務に関わっています。
私達のチームでは、巨大なデータを集計・分析するための基盤としてDatabricks社のDatabricks を使用しています。
今回の記事では、私達の業務におけるユースケースを交えながら、Databricksの利点や、活用方法を紹介できたらと思います。

Databricksとは

DatabricksはApache Sparkベースの分析プラットフォームであり、データ分析の際に行う

  1. Data Sourceからデータを集約
  2. 分散処理によって高速にデータを整形
  3. 分析
  4. 可視化や集計したデータをData Lakeに保存

といった流れをDatabricks notebookを用いて記述し、Spark clusterを用いた高速な分散処理が可能です。 データ分析によく使われているツールであるJupyter notebookと同じような感覚でビックデータを扱え、インラインでの図表表示などにも対応しています。

またSpark clusterの設定やワークスペース、学習済み機械学習モデル、Jobの管理をWebUIを用いて行え、非常に扱いやすい分析プラットフォームです。

エブリーでDatabricksをどう使ってるか

私達のチームではデータ分析をする際に

  1. Arm Treasure DataやS3、BigQuery、Deltaからデータを抽出
  2. データを加工し、Deltaに保存
  3. Deltaから加工済みデータをTreasureDataに保存
  4. TreasureDataをRedashから読み込み可視化

という流れを行っています。
この2の工程でDatabricksのnotebookを用いています。
No Image

SQLでは複雑なクエリになってしまう処理をDataFrameとして処理すると、コードを簡潔にでき可読性が上がります。

なぜDatabricksなのか

Databricksを扱うにあたり便利な機能を紹介していきます。

豊富なData source

DatabricksではS3上のcsvファイルやBigQuery、TreasureDataのデータ等をSparkを用いて高速に取り込めます。

特にDatabricks社が公開しているオープンソースのストレージレイヤーであるDelta Lakeを用いると、データへの信頼性とパフォーマンスが高まります。 Delta Lakeには

  • ACIDトランザクションによりデータの整合性を確保
  • スキーマの適用によりデータの過不足や不正を検知
  • スナップショット作成によるロールバックや過去データの参照
  • Sparkの分散処理による高速な読みこみ

といった機能が存在します。 これらの利点を、Spark Dataframeへの簡単なAPIによって使用できます。

// 書き込み
sparkDataframe
.write
.format("delta")
.save("delta/path")
// 読み込み
val sparkDataframe = spark.sql("""
select * from delta.`delta/path`
""")

ひとつのnotebook上でscala,python,sql等を混ぜて実行できる

Databricksのnotebookではセルの先頭で%python%scalaといったマジックコマンドを記載すると、notebookに指定した言語とは別に、セル単位で使用する言語を選択できます。
pythonはデータを柔軟に扱え、データ分析において強力な言語ですが、型安全でない、scala等に比べて処理速度に劣るといった欠点が存在します。
そこでノートブック中で高速にしたい処理をscalaで処理し、分析部分をpythonで扱うといった運用が可能です。

履歴管理機能や同時編集機能が便利

Databricksにはnotebookの履歴を管理する機能や、複数人で同時に1つのnotebookを編集する機能が備えられています。
履歴の管理機能ですが、例えば

  • notebookをリファクタリングしていたら重要なセルをまるごと消去してしまった
  • データをいじくり回していたらnotebookがわけわからなくなった

といった場合に、自動的に保存されている履歴から任意の履歴の復元が可能な機能です。
この機能はgitでの管理に関係なく履歴を保存してくれるため、わざわざgitで管理するほどでもない簡単な分析でも気軽に利用できるのが利点です。

次に複数人でのnotebook編集機能ですが、Databricksでは自分が見ているnotebookを他の人が閲覧している場合、閲覧しているユーザ名とそのユーザがどのセルを見ているかがセルに色がつき、わかるようになっています。
この機能を活用すると、複数人でnotebookを見ながら分析方法についての議論等が簡単に行なえます。

Gitによってバージョン管理が可能

DatabricksのnotebookではIpython notebookとは異なりセルの出力結果等がファイルに記載されないため、gitを用いたコードのバージョン管理が可能です。
これにより、一般的なコード開発と同じような

  1. コーディング
  2. P/Rを送る
  3. レビューしてもらう
  4. 修正
  5. 取り込み
  6. 運用

といった流れをデータ分析にも適用可能です。
そのため、クエリミスや不適切なデータ処理を可能な限りなくせ、また、より良い分析方法を協議できます。 それにより、信頼性の高いデータ分析を行えます。 No Image

また、gitホスティングサービスに連携したCircleCIを用いると、notebookのP/Rマージ時に本番環境への自動デプロイや、Job作成が行えます。 No Image

notebookをバッチスクリプトとして扱える

Databricksで作成したnotebookはそのままDatabricks上でバッチJobとして登録できます。

使用するクラスタ構成や、実行するnotebook、スケジュールやリトライ回数等を簡単に設定できます。

notebookをバッチとして登録する利点として、 - 過去の実行結果がnotebookの出力としてセル単位で残る - セル単位で実行され結果が残るため修正が容易

というものがあります。

実行結果がセル単位で残るため、各セルごとの実行時間を比較してパフォーマンスが悪い処理を容易に特定可能で、パフォーマンス改善中の比較データとして過去の実装の結果を参照できます。
私達のチームでは、バッチのアラートをSlackに通知しており、アラート発生 -> セル単位の処理結果を見てエラー箇所を特定しリカバリという流れで安定したバッチ処理の管理を行えています。 No Image

まとめ

以上、エブリーでのDatabricksのユースケースと利点を簡単に紹介させていただきました。 Databricksを使用すると

  • Spark clusterによるスケーラブルな計算基盤
  • Delta lakeによるデータの安全性
  • データ分析の信頼性

を確保できます。
こちらはあくまで一例ですが、Databricksの利点等を知っていただけたのであれば幸いです。