このページの本文へ

FIXER cloud.config Tech Blog

Azure Blob Storageにあるデータをクエリで効率的に分析しよう!

2020年05月22日 11時00分更新

文● 山本 和貴/FIXER

  • この記事をはてなブックマークに追加
  • 本文印刷

 本記事はFIXERが提供する「cloud.config Tech Blog」に掲載された「Blobに入ってるデータをクエリで分析しよう!」を再編集したものです。

 こんにちは。R&D Divisionの山本です。

 みなさん、Blob Storage使ってますか?

 どんな形式のデータでも格納でき、容量あたりの利用料も安いので私の大好きなサービスの一つです。

 ただ、格納したデータを分析するのは中々大変です。

 機械学習で予測モデル作成する場合、まず最初にどんなデータを使うのかを知るため、データの内容をじっくりと観察します。その際に、Blob Storageに格納されている多数のファイルをダウンロードしてExcelで開いてみたり、SQL Databaseを立ててデータをインポートしたりするのですが、これらの作業はあまり生産的とは言えません。

 そこで、今回はAzure Databricksを利用して効率的にBlob Storageに格納されたデータを分析していきましょう。

Databricks利用の準備

 今回は分析対象のサンプルデータとしてUCI Machine Learning Repositoryで提供されているWine Qualityデータを用います。下記URLからwinequality-white.csvをダウンロードしてください。

https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/

 winequality-white.csvの各項目の意味合いは以下になります。

・fixed acidity:酒石酸濃度
・volatile acidity:酢酸濃度
・citric acid:クエン酸濃度
・residual sugar:残留糖分濃度
・chlorides:塩化ナトリウム濃度
・free sulfur dioxide:遊離亜硫酸濃度
・total sulfur dioxide:総亜硫酸濃度
・density:密度
・pH:水素イオン濃度
・sulphates:硫酸カリウム濃度
・alcohol:アルコール度数
・quality:ワインの評価

 次にAzureにリソースを作成していきます。今回作成するのはAzure DatabricksとStorage Accountの2つです。

 まずはAzure Databricksを作成します。下記URLからAzure Portalへ移動し、リソースの作成をクリックします。

https://portal.azure.com/

 検索欄にAzure Databricksと入力します。

 Azure Databricksの概要等が表示されます。作成をクリックします。

 リソースを作成するに当たって、いくつか入力や選択する項目があるので、埋めて確認及び作成をクリックします。

・サブスクリプション:課金が紐づくサブスクリプションの選択
・リソースグループ:任意の文字列 → これから作成していくリソース群を格納する場所の名前
・ワークスペース名:任意の文字列 → 作成するリソースに付ける名前
・場所:任意のリージョン → リージョンによって料金が微妙に異なります。また、現在地から遠い場所を利用するとアクセスも遅くなるので注意。料金の詳細はこちら
・価格レベル:Standard → StandardとPremiumを選べる。レベルによって機能や値段が異なります。詳しくはこちら

 設定内容の確認画面が表示されます。作成をクリックします。

 3分程度待つとデプロイが完了します。これでAzure Databricksの準備が完了しました。

 次にデータを格納しておくBlob Storageを準備します。Azure Databricksのときと同様にリソースの作成画面に移動し、検索欄にStorage accountと入力してStorage account – blob, file, table, queueをクリックします。

 Storage accountの概要等が表示されます。作成をクリックします。

 リソースを作成するに当たって、いくつか入力や選択する項目があるので、埋めて確認及び作成をクリックします。

・サブスクリプション:課金が紐づくサブスクリプションの選択
・リソースグループ:Azure Databricksを作成したリソースグループと同じもの
・ストレージアカウント名:任意の文字列 → 作成するストレージに付ける名前
・場所:任意のリージョン → リージョンによって料金が微妙に異なります。また、現在地から遠い場所を利用するとアクセスも遅くなるので注意。料金の詳細はこちら
・パフォーマンス:Standard → StandardとPremiumがあり、PremiumだとSSDを利用するが、料金が高くなる。アカウント種類がBlob Strageの場合、Standardしか選べない
・アカウント種類:Blob Storage → 利用するサービスによって変更。TableやQueueを利用する場合はStandardV2を選択
・レプリケーション:ローカル冗長ストレージ → データをどのようにレプリケーションするかを選択
・アクセス層:ホット → データに対するアクセス頻度によってホットとクールを選択

 設定内容の確認画面が表示されます。作成をクリックします

 少しするとデプロイが完了します。これでStorage Accountの作成は完了です。

 次はBlob Storageにデータを登録します。リソースに移動をクリックします。

 Storage Accountの管理画面に移動したら、データを格納するためのコンテナーをまずは作成します。画面中央のコンテナーをクリックします。

 +コンテナーをクリックすると、右に入力欄が表示されるので、名前に任意の文字列(今回はdata)を入力し、作成をクリックします。

 作成されたdataコンテナーをクリックします。

 ↑アップロードをクリックし、右に表示された入力欄で最初にダウンロードしたファイルをアップロード対象として選択し、アップロードをクリックします。

 アップロードしたファイルが表示されれば完了です。

 次はAzure Databricksからアップロードしたファイルなどにアクセスするためのキーを取得します。上の方にある(ストレージアカウント名) | コンテナー(今回はdbksblob | コンテナー)をクリックします。

 アクセスキーをクリックします。

 Key 1のキーをメモ帳等にコピーしておきます。これでStorage Accountで行なう作業は終わりです。作成したAzure Databricksの管理画面に移動するため概要をクリックします。

 リソースグループのリンクをクリックします。

 最初に作成したAzure Databricksがあるので、クリックします。

 Databricksの管理画面に移動できました。

 Databricksの具体的な利用はAzureポータルからはできません。専用のワークスペースに移動する必要があります。ワークスペースの起動をクリックします。

Blob上のデータをクエリで利用する

 Azure Databricksのワークスペースに移動しました。ここでデータ分析などを行ないます。まずは、分析用のクラスター(VM)を作成します。New Clusterをクリックします。

 いくつか設定項目がありますが、今回入力・変更をする項目は以下です。設定が完了したらCreate Clusterをクリックします。

・Cluster Name:任意の文字列
・Enable autoscaling:チェックを外す → チェックしておくと、負荷に応じてノード数が増え、処理時間が短くなるが、料金もノード数分高くなる
・Worker Type:Standard_F4s → VMのサイズになります。今回はCPU性能の高いFシリーズを利用
・Workers:1 → 料金を抑えるために、Workerの数を1台にします

 作成が開始され、5分程度待つとStateがRunningになります。Runningになったら左上のAzure Databricksをクリックしてメインページに戻ります。

 ここからはNotebookでPythonを使っていきます。New Notebookをクリックします。

 Notebookの名前や、言語、どのClusterで利用するかを選び、Createをクリックします。

・Name:任意の文字列
・Language:Python
・Cluster:先程作成したクラスター

 Pythonをよく使うひとにとっては見慣れたNotebookのような画面が表示されます。ここにPythonコードを書き、Blobの情報をクエリで取得します。

 書くコードは大きくわけ、下記の3つです。

1.BlobのコンテナーをAzure Databricksにマウント
2.マウントしたデータをクエリで読み取れるように読込
3.クエリと実行

 まずは「BlobのコンテナーをAzure Databricksにマウント」をします。先程作成したストレージアカウント名やコンテナー名、アクセスキーを下記のコードの中に書き加えてください。今回の場合は下記のようになります。

・任意のマウント先ディレクトリ名:data
・ストレージアカウント名:dbksblob
・コンテナー名:data
・ストレージアカウントアクセスキー:(シークレット)


mount_name= "(任意のマウント先ディレクトリ名)"
storage_account_name = "(ストレージアカウント名)"
container_name = "(コンテナー名)"
storage_account_access_key = "(ストレージアカウントアクセスキー)"

mount_point = "/mnt/" + mount_name
source = "wasbs://" + container_name + "@" + storage_account_name + ".blob.core.windows.net"
conf_key = "fs.azure.account.key." + storage_account_name + ".blob.core.windows.net"


mounted = dbutils.fs.mount(
  source=source,
  mount_point = mount_point,
  extra_configs = {conf_key: storage_account_access_key}
)

 「マウントしたデータをクエリで読み取れるように読込」をします。今回のBlobにあげたファイルの名前は「winequality-white.csv」なので、ファイル名をそのように設定し、区切り文字が「,」ではなく「;」だったため、区切り文字に指定を変えています。

 その後、クエリとして扱うときのテーブル名として「Winequality」という名前をつけています。


Winequality_df = spark.read.option("header","true").option("delimiter", ";").csv("mnt/data/winequality-white.csv")
Winequality_df.createOrReplaceTempView("Winequality")

 これでBlob上のデータをクエリで扱うための準備が整いました。クエリを作成して、実行します。

 作成したクエリはオーソドックスな上から10行のデータを取得するものです。


query = """
SELECT *
FROM Winequality
"""
 
display(spark.sql(query))

 各コードを書いて実行をします。実行はRun Allをクリックすると行なえます。クエリで取得した結果が表示されます。

 集計などもできます。


query = """
SELECT
  quality,
  COUNT(*) AS n
FROM
  Winequality
GROUP BY
  quality
ORDER BY
  quality
"""
 
display(spark.sql(query))

 さらに、読み込むファイルの指定をワイルドカードにすると、複数ファイル同時に扱えます(今回は赤ワインの情報を追加でBlobにアップロードし、マウントし直しました)。

 もちろん、データ数が増えたので集計結果も変わります。


Winequality_df = spark.read.option("header","true").option("delimiter", ";").csv("mnt/data/*.csv")
Winequality_df.createOrReplaceTempView("Winequality")

 いかがだったでしょうか。Azure Databricksを使うとBlobのなかに貯めていたデータも簡単に分析できるようになるので、皆さんも是非使ってみてください。

 それでは!

山本 和貴/FIXER

 MLの本とか書いてます。

[転載元]
 Blobに入ってるデータをクエリで分析しよう!

カテゴリートップへ