LoginSignup
5
4

More than 3 years have passed since last update.

Azureデータ分析入門 #4 【ツール比較 Databricks編】

Last updated at Posted at 2019-09-18

はじめに

ツール比較の3つ目として、Databricks を用いて簡易集計及び可視化を行い、発生した費用を概算します。

連載目次

Azureデータ分析入門 #1 【はじめに】
Azureデータ分析入門 #2 【ツール比較 Excel編】
Azureデータ分析入門 #3 【ツール比較 Azure Notebook編】
Azureデータ分析入門 #4 【ツール比較 Databricks編】 → 本記事はこちら
Azureデータ分析入門 #5 【Databricks → Power BI Desktop】
Azureデータ分析入門 #6 【CSVデータ → Power BI サービス】
Azureデータ分析入門 #7 【AutoML でタイタニック号の生存者予測】

Databricksとは?

概要

以前の記事でも取り上げましたが、こんな特徴のデータ分析基盤プラットフォームです。

  • Apache Spark環境を数分でセットアップ

    • 分析環境がすぐに作れる
    • スケーラブル
    • 自動でスケーリング可能
    • Sparkを作った人達が、Spark用にカリカリにチューニングしたプラットフォーム
  • Notebookをバッチスクリプトとして使える

    • 例えば、
    • データストリームに対して、Aの処理を一週間に一回かけて、Bのテーブルに追記する、
    • という処理が必要な場合、Aの処理を記載したNotebookを、バッチジョブとして設定できる
  • バージョン管理が楽

    • いわゆるタイムマシーン機能が使える
    • 複数人での作業がしやすい
  • マジックコマンドが便利

    • デフォルト言語としてPythonを設定しても、セルの頭にマジックコマンド(%sql)でクエリが書ける
  • 簡単に可視化

    • 発行したクエリをそのままグラフ化
    • 別途ライブラリのインポート不要
  • オートターミネーションで安心

    • クラスタをxx分未使用の場合には停止(=課金されない) といった設定ができる
    • 高額なクラスタを立ち上げっぱなしで、気が付いたらものすごい課金が…みたいなケースを回避できる
    • 今回発生した費用のまとめは後述します

設定

こちらのドキュメントを参照いただき、

  • Azure Portal へのサインイン
  • Spark クラスタの作成
  • notebookの作成

まで行ったら準備完了です。

操作のきほん

Notebook自体の操作は、Jupyter Notebookとほとんど同じです。結構直感的に操作できますが、迷ったときは公式ドキュメントを参照しましょう。

手順

Azure Notebookの回でやったように、Sparkで中間テーブルを作成します。そこから先は、SQLオンリーでグラフ化まで行います。

使用するデータのインポート

ストリーミングデータや大規模なテーブルを接続するのであれば、データの保存先は、Blob Storage Gen 2Delta Lake が候補になります。今回は、そこまで大きくないCSVデータx3ですので、Databricksにテーブルを作成します。

ホーム画面の下記の場所に、CSVデータをドラッグアンドドロップ
00.png

Create Table with UIをクリック
01.png

作成したクラスタを選択し、Preview Tableをクリック
02.png

デフォルトだと、列名やスキーマはこのようになっています
03.png

以下のオプションを指定し、Create Tableをクリック。

First Row is Header オプション: 一行目を列名として読み込み
Infer Schema オプション: スキーマを類推

04.png

しばらくするとテーブルの作成が完了します。CSVファイル3つそれぞれでこれらの作業を行います。Data > Databases > Tables でアップロードしたデータを確認できます。

(これらのテーブルは内部的には Spark Dataframe として格納されています。クエリを書くためには後述の View を作ってあげる必要があります)

2019-09-13_16h30_36.png

ライブラリのインポート

今回の用途であればこれだけでOKです。

from pyspark.sql.functions import col, desc, to_timestamp, month, year, dayofweek, hour

データフレームの読み込み

先ほど作成したデータフレームの名称を変数に格納。

orders = 'olist_order_items_dataset_csv'
items = 'olist_products_dataset_csv'
translation = 'product_category_name_translation_csv'

それぞれのデータフレームをSparkで読み込みます。

t1 = spark.read.table(orders)
t2 = spark.read.table(items)
t3 = spark.read.table(translation)

日付データの書式をタイムスタンプに、結合に使用するキーの名称を整理しておきます。

t1 = t1.withColumn('time', to_timestamp(t1.shipping_limit_date, 'yyyy/MM/dd HH:mm'))
t2 = t2.withColumnRenamed('product_id', 'product_id2')
t3 = t3.withColumnRenamed('product_category_name', 'product_category_name2')

データフレームの結合

フレーム結合のために、必要な列名を確認。

t1.printSchema()
t2.printSchema()
t3.printSchema()

とりあえず3つのデータフレームを結合します。カテゴリの英語名が長いので、名称を変えておきます。

temp_t = t1\
.join(t2, t1.product_id == t2.product_id2, 'inner')\
.join(t3, t2.product_category_name == t3.product_category_name2, 'inner')\
.withColumnRenamed('product_category_name_english', 'category')\

結合後のデータフレームのスキーマを確認しておきます。

temp_t.printSchema()

ビューの作成

集計用の一時ビューとして、temp_view を作成します。

temp_t.select('order_id'\
              , 'product_id'\
              , 'category'\
              , 'price'\
              , 'freight_value'\
              , 'time'\
              , hour('time').alias('hour')\
              , dayofweek('time').alias('dayofweek')\
              , month('time').alias('month')\
              , year('time').alias('year'))\
.createOrReplaceTempView('temp_view')

SQL で集計 → 可視化

以上の操作で、マジックコマンド %sql を使用してクエリを直接書けるようになりました。

%sql
SELECT * FROM temp_view

テーブルの詳細は以下のコードで確認できます。

%sql
DESCRIBE temp_view

マジックコマンドを使用してのクエリでも、一時ビューを作成することができます。集計結果を格納するビュー agged_view をこの方法で作成してみましょう。(今回は使用しませんが、カテゴリ別売上のランキングのカラムを追加しています)

%sql
CREATE OR REPLACE TEMPORARY VIEW agged_view AS
  SELECT
      category as cat
      , sum(price) / count(order_id) as cat_price_ave
      , sum(freight_value) / count(order_id) as cat_freight_ave
      , sum(freight_value) / (sum(freight_value) + sum(price)) as category_freight_ratio
      , RANK () OVER (ORDER BY sum(price) DESC) as ranking
  FROM
      temp_view
  GROUP BY
      category

agged_view の一部を抜き出し、可視化します。平均単価と送料の割合が同じくらいのスケールに収まるように、送料の割合を1000倍しておきます。

%sql
SELECT
  cat
  , category_freight_ratio * 1000 as freight_ratio_x_1000
  , cat_price_ave
FROM agged_view
WHERE ranking > 0 AND ranking <= 10
ORDER BY cat_price_ave DESC

結果はこちら。デフォルトだと表が出力されます。下のボタンでクエリの結果をそのまま可視化可能。
2019-09-24_14h18_44.png

こんな感じです。アドホックな分析にとても便利!
zeppelin.gif

費用

料金体系

クラスターの起動時間に応じて、分単位で、以下のマシンリソースに対して課金されます。 (詳細はこちら)

名称 概要
Virtual Machine 通称 VM。Azure上の仮想マシン
Databricks Unit 通称 DBU。VMインスタンスに基づくDatabricks計算資源の単位
ストレージ 分析対象データを保管するストレージ

料金表だけを見ていると意識に上がりずらいのですが、Databricks Unit には DriverWorkerの2タイプがあり、クラスタを立ち上げると両方が起動され、課金されます。それぞれにインスタンスを割り当てて処理をしてもらうわけですが、当然、性能の高いインスタンス(= 高いDBU値) ほど、高コストになります。
今回使用したのはもっとも安価な 0.5 DBU のインスタンス。

名称 概要
Driver 1台必要。分散処理をマネージメントするDBU
Worker 1台以上必要。実際に処理を行うDBU。最小数と最大数を設定でき、オートスケール可能

今回の費用概算

今回の簡易分析・可視化で、どのくらいの費用が発生したか概算してみましょう。以下は今回使用したクラスタの設定画面。費用に大きく響いてくるところなので、本格的に分析基盤を立ち上げる際には、分析対象と内容に応じて、必要十分な計算資源を割り当てるように留意する必要があります。

2019-09-18_13h30_00.png

設定は以下の通り。
クラスタのJob履歴を見てみたところ、Workerのスケーリングはしなかったようなので、クラスタの起動中は、0.5 DBU + 0.5 DBU で合計 1 DBU 使ってる計算になります。

  • リージョン: 米国西部 2
  • ワークロード:データ分析
  • レベル:Standard
  • Driverタイプ:F4s (0.5 DBU)
  • Workerタイプ:F4s (0.5 DBU)
    • 最小ワーカー数: 1
    • 最大ワーカー数: 4
  • 自動停止
    • 15分操作がなかったらクラスタを停止

分単位の課金なので、Cluster の Event Log から、ここ2日間で何分間クラスタを起動したかざっくり見てみます。3回起動/停止しているようです。合計約70分。

2019-09-18_14h36_17.png

Databricks の料金表を参照し、70分間インスタンスを起動した今回の費用概算と、仮に48時間インスタンスを立てたままにした場合の料金を比較してみました。

当たり前ですが、オートターミネーションした場合と継続利用では、かなりの金額差がありますね。

costlast.jpg

分析プラットフォームサービスは、どうしてもマシンスペックでの比較がされやすい傾向にあります。

しかし、実運用に則して考えると、Databricks の費用対効果の高さはピカイチじゃないかと思います。

まとめ

最後にDatabricksの長所をおさらい。

  • すぐApache Spark環境を作れる
  • Notebookをバッチスクリプトとして使える
  • バージョン管理が楽
  • マジックコマンドが便利
  • 簡単に可視化
  • オートターミネーション

アドホックな分析をするなら、SQLをそのままかけて、すぐに可視化できて、クラスタのオートターミネーションが利用できる Databricks が最高に便利。

Databricks、簡易的な可視化ならできるけど、ちょっと凝ったグラフは?BIとの接続は?ということで、次回は DatabricksPower BI につなげてみようと思います。お楽しみに!

参考サイト

クイック スタート: Azure portal を使用して Azure Databricks 上で Spark ジョブを実行する
Databricksで分析業務がはかどっている話
平成最後の1月ですし、Databricksでもやってみましょうか

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4