diff --git a/Instructions/Exercises/DE-01-Real-time-ingestion.md b/Instructions/Exercises/DE-01-Real-time-ingestion.md new file mode 100644 index 0000000..dc59913 --- /dev/null +++ b/Instructions/Exercises/DE-01-Real-time-ingestion.md @@ -0,0 +1,184 @@ +--- +lab: + title: Azure Databricks を使用した Spark 構造化ストリーミングと Delta Lake を使用したリアルタイムのインジェストと処理 +--- + +# Azure Databricks を使用した Spark 構造化ストリーミングと Delta Lake を使用したリアルタイムのインジェストと処理 + +Spark Structured Streaming を使用すると、エンドツーエンドのフォールト トレランスを使用してリアルタイムでデータを処理できます。 Delta Lakeは、ACIDトランザクションを提供するストレージ層を追加することでこれを強化し、データの整合性と一貫性を確保します。 クラウド ストレージから Delta Lake にデータを取り込み、Delta Live Tables を使用してストリーミング データ パイプラインを管理および最適化できます。 + +このラボは完了するまで、約 **30** 分かかります。 + +## Azure Databricks ワークスペースをプロビジョニングする + +> **ヒント**: 既に Azure Databricks ワークスペースがある場合は、この手順をスキップして、既存のワークスペースを使用できます。 + +この演習には、新しい Azure Databricks ワークスペースをプロビジョニングするスクリプトが含まれています。 このスクリプトは、この演習で必要なコンピューティング コアに対する十分なクォータが Azure サブスクリプションにあるリージョンに、*Premium* レベルの Azure Databricks ワークスペース リソースを作成しようとします。また、使用するユーザー アカウントのサブスクリプションに、Azure Databricks ワークスペース リソースを作成するための十分なアクセス許可があることを前提としています。 十分なクォータやアクセス許可がないためにスクリプトが失敗した場合は、[Azure portal で、Azure Databricks ワークスペースを対話形式で作成](https://learn.microsoft.com/azure/databricks/getting-started/#--create-an-azure-databricks-workspace)してみてください。 + +1. Web ブラウザーで、`https://portal.azure.com` の [Azure portal](https://portal.azure.com) にサインインします。 + +2. ページ上部の検索バーの右側にある **[\>_]** ボタンを使用して、Azure portal に新しい Cloud Shell を作成します。メッセージが表示されたら、***PowerShell*** 環境を選んで、ストレージを作成します。 次に示すように、Azure portal の下部にあるペインに、Cloud Shell のコマンド ライン インターフェイスが表示されます。 + + ![Azure portal と Cloud Shell のペイン](./images/cloud-shell.png) + + > **注**: 前に *Bash* 環境を使ってクラウド シェルを作成している場合は、そのクラウド シェル ペインの左上にあるドロップダウン メニューを使って、***PowerShell*** に変更します。 + +3. ペインの上部にある区分線をドラッグして Cloud Shell のサイズを変更したり、ペインの右上にある **—** 、 **◻** 、**X** アイコンを使用して、ペインを最小化または最大化したり、閉じたりすることができます。 Azure Cloud Shell の使い方について詳しくは、[Azure Cloud Shell のドキュメント](https://docs.microsoft.com/azure/cloud-shell/overview)をご覧ください。 + +4. PowerShell のペインで、次のコマンドを入力して、リポジトリを複製します。 + + ```powershell + rm -r mslearn-databricks -f + git clone https://github.com/MicrosoftLearning/mslearn-databricks + ``` + +5. リポジトリをクローンした後、次のコマンドを入力して **setup.ps1** スクリプトを実行します。これにより、使用可能なリージョンに Azure Databricks ワークスペースがプロビジョニングされます。 + + ```powershell + ./mslearn-databricks/setup.ps1 + ``` + +6. メッセージが表示された場合は、使用するサブスクリプションを選択します (これは、複数の Azure サブスクリプションへのアクセス権を持っている場合にのみ行います)。 + +7. スクリプトが完了するまで待ちます。通常、約 5 分かかりますが、さらに時間がかかる場合もあります。 待っている間に、Azure Databricks ドキュメントの[Delta Lake の概要](https://docs.microsoft.com/azure/databricks/delta/delta-intro)に関する記事をご確認ください。 + +## クラスターの作成 + +Azure Databricks は、Apache Spark "クラスター" を使用して複数のノードでデータを並列に処理する分散処理プラットフォームです。** 各クラスターは、作業を調整するドライバー ノードと、処理タスクを実行するワーカー ノードで構成されています。 この演習では、ラボ環境で使用されるコンピューティング リソース (リソースが制約される場合がある) を最小限に抑えるために、*単一ノード* クラスターを作成します。 運用環境では、通常、複数のワーカー ノードを含むクラスターを作成します。 + +> **ヒント**: Azure Databricks ワークスペースに 13.3 LTS 以降のランタイム バージョンを持つクラスターが既にある場合は、それを使ってこの演習を完了し、この手順をスキップできます。 + +1. Azure portal で、スクリプトによって作成された **msl-*xxxxxxx*** リソース グループ (または既存の Azure Databricks ワークスペースを含むリソース グループ) に移動します + +1. Azure Databricks Service リソース (セットアップ スクリプトを使って作成した場合は、**databricks-*xxxxxxx*** という名前) を選択します。 + +1. Azure Databricks ワークスペースの [**概要**] ページで、[**ワークスペースの起動**] ボタンを使用して、新しいブラウザー タブで Azure Databricks ワークスペースを開きます。サインインを求められた場合はサインインします。 + + > **ヒント**: Databricks ワークスペース ポータルを使用すると、さまざまなヒントと通知が表示される場合があります。 これらは無視し、指示に従ってこの演習のタスクを完了してください。 + +1. 左側のサイドバーで、**[(+) 新規]** タスクを選択し、**[クラスター]** を選択します。 + +1. **[新しいクラスター]** ページで、次の設定を使用して新しいクラスターを作成します。 + - **クラスター名**: "ユーザー名の" クラスター (既定のクラスター名)** + - **ポリシー**:Unrestricted + - **クラスター モード**: 単一ノード + - **アクセス モード**: 単一ユーザー (*自分のユーザー アカウントを選択*) + - **Databricks Runtime のバージョン**: 13.3 LTS (Spark 3.4.1、Scala 2.12) 以降 + - **Photon Acceleration を使用する**: 選択済み + - **ノードの種類**: Standard_DS3_v2 + - **非アクティブ状態が ** *20* ** 分間続いた後終了する** + +1. クラスターが作成されるまで待ちます。 これには 1、2 分かかることがあります。 + + > **注**: クラスターの起動に失敗した場合、Azure Databricks ワークスペースがプロビジョニングされているリージョンでサブスクリプションのクォータが不足していることがあります。 詳細については、「[CPU コアの制限によってクラスターを作成できない](https://docs.microsoft.com/azure/databricks/kb/clusters/azure-core-limit)」を参照してください。 その場合は、ワークスペースを削除し、別のリージョンに新しいワークスペースを作成してみてください。 次のように、セットアップ スクリプトのパラメーターとしてリージョンを指定できます: `./mslearn-databricks/setup.ps1 eastus` + +## ノートブックを作成してデータを取り込む + +Azure Databricks ワークスペースにノートブックを作成して、さまざまなプログラミング言語で記述されたコードを実行できます。 この演習では、ファイルからデータを取り込んで Databricks File System (DBFS) のフォルダーに保存する簡単なノートブックを作成します。 + +1. 次に、Azure Databricks ワークスペース ポータルを表示し、左側のサイド バーに、実行できるさまざまなタスクのアイコンが含まれていることに注目します。 + +1. サイド バーで **[(+) 新規]** タスクを使用して、**Notebook** を作成します。 + +1. 既定のノートブック名 (**無題のノートブック *[日付]***) を **RealTimeIngestion** に変更します。 + +1. ノートブックの最初のセルに次のコードを入力します。このコードは、"シェル" コマンドを使用して、GitHub からクラスターで使用されるファイル システムにデータ ファイルをダウンロードします。** + + ```python + %sh + rm -r /dbfs/device_stream + mkdir /dbfs/device_stream + wget -O /dbfs/device_stream/devices1.json https://raw.githubusercontent.com/MicrosoftLearning/mslearn-databricks/main/data/devices1.json + ``` + +1. セルの左側にある **[▸ セルの実行]** メニュー オプションを使用して実行を行います。 そして、コードによって実行される Spark ジョブが完了するまで待ちます。 + +## ストリーミング データにデルタ テーブルを使用する + +Delta Lake では、"*ストリーミング*" データがサポートされています。 デルタ テーブルは、Spark 構造化ストリーミング API を使用して作成されたデータ ストリームの "シンク" または "ソース" に指定できます。** ** この例では、モノのインターネット (IoT) のシミュレーション シナリオで、一部のストリーミング データのシンクにデルタ テーブルを使用します。 シミュレートされたデバイス データは、次のような JSON 形式です。 + +```json +{"device":"Dev1","status":"ok"} +{"device":"Dev1","status":"ok"} +{"device":"Dev1","status":"ok"} +{"device":"Dev2","status":"error"} +{"device":"Dev1","status":"ok"} +{"device":"Dev1","status":"error"} +{"device":"Dev2","status":"ok"} +{"device":"Dev2","status":"error"} +{"device":"Dev1","status":"ok"} +``` + +1. 新しいセルで、次のコードを実行して、JSON デバイス データを含むフォルダーに基づいてストリームを作成します。 + + ```python + from pyspark.sql.types import * + from pyspark.sql.functions import * + + # Create a stream that reads data from the folder, using a JSON schema + inputPath = '/device_stream/' + jsonSchema = StructType([ + StructField("device", StringType(), False), + StructField("status", StringType(), False) + ]) + iotstream = spark.readStream.schema(jsonSchema).option("maxFilesPerTrigger", 1).json(inputPath) + print("Source stream created...") + ``` + +1. 新しいコード セルを追加し、それを使用して、データのストリームをデルタ フォルダーに永続的に書き込みます。 + + ```python + # Write the stream to a delta table + delta_stream_table_path = '/delta/iotdevicedata' + checkpointpath = '/delta/checkpoint' + deltastream = iotstream.writeStream.format("delta").option("checkpointLocation", checkpointpath).start(delta_stream_table_path) + print("Streaming to delta sink...") + ``` + +1. 他の差分フォルダーと同様に、データを読み取るコードを追加します。 + + ```python + # Read the data in delta format into a dataframe + df = spark.read.format("delta").load(delta_stream_table_path) + display(df) + ``` + +1. 次のコードを追加して、ストリーミング データの書き込み先となる差分フォルダーに基づいてテーブルを作成します。 + + ```python + # create a catalog table based on the streaming sink + spark.sql("CREATE TABLE IotDeviceData USING DELTA LOCATION '{0}'".format(delta_stream_table_path)) + ``` + +1. 次のコードを使用してテーブルにクエリを実行します。 + + ```sql + %sql + SELECT * FROM IotDeviceData; + ``` + +1. 次のコードを実行して、新しいデバイス データをストリームに追加します。 + + ```Bash + %sh + wget -O /dbfs/device_stream/devices2.json https://raw.githubusercontent.com/MicrosoftLearning/mslearn-databricks/main/data/devices2.json + ``` + +1. 次の SQL クエリ コードを再実行して、新しいデータがストリームに追加され、差分フォルダーに書き込まれたことを確認します。 + + ```sql + %sql + SELECT * FROM IotDeviceData; + ``` + +1. 次のコードを実行してストリームを停止します。 + + ```python + deltastream.stop() + ``` + +## クリーンアップ + +Azure Databricks ポータルの **[コンピューティング]** ページでクラスターを選択し、**[■ 終了]** を選択してクラスターをシャットダウンします。 + +Azure Databricks を調べ終わったら、作成したリソースを削除できます。これにより、不要な Azure コストが生じないようになり、サブスクリプションの容量も解放されます。 diff --git a/Instructions/Exercises/DE-02-End-to-end-streaming.md b/Instructions/Exercises/DE-02-End-to-end-streaming.md new file mode 100644 index 0000000..d102a3e --- /dev/null +++ b/Instructions/Exercises/DE-02-End-to-end-streaming.md @@ -0,0 +1,203 @@ +--- +lab: + title: Azure Databricks の Delta Live Tables を使用したエンド ツー エンドストリーミング パイプライン +--- + +# Azure Databricks の Delta Live Tables を使用したエンド ツー エンドストリーミング パイプライン + +Azure Databricks で Delta Live Tables を使用してエンドツーエンドのストリーミング パイプラインを作成するには、データの変換を定義する必要があります。この変換は、Delta Live Tables がタスク オーケストレーション、クラスター管理、監視を通じて管理します。 このフレームワークでは、継続的に更新されるデータを処理するためのストリーミング テーブル、複雑な変換用の具体化されたビュー、中間変換とデータ品質チェック用のビューがサポートされています。 + +このラボは完了するまで、約 **30** 分かかります。 + +## Azure Databricks ワークスペースをプロビジョニングする + +> **ヒント**: 既に Azure Databricks ワークスペースがある場合は、この手順をスキップして、既存のワークスペースを使用できます。 + +この演習には、新しい Azure Databricks ワークスペースをプロビジョニングするスクリプトが含まれています。 このスクリプトは、この演習で必要なコンピューティング コアに対する十分なクォータが Azure サブスクリプションにあるリージョンに、*Premium* レベルの Azure Databricks ワークスペース リソースを作成しようとします。また、使用するユーザー アカウントのサブスクリプションに、Azure Databricks ワークスペース リソースを作成するための十分なアクセス許可があることを前提としています。 十分なクォータやアクセス許可がないためにスクリプトが失敗した場合は、[Azure portal で、Azure Databricks ワークスペースを対話形式で作成](https://learn.microsoft.com/azure/databricks/getting-started/#--create-an-azure-databricks-workspace)してみてください。 + +1. Web ブラウザーで、`https://portal.azure.com` の [Azure portal](https://portal.azure.com) にサインインします。 + +2. ページ上部の検索バーの右側にある **[\>_]** ボタンを使用して、Azure portal に新しい Cloud Shell を作成します。メッセージが表示されたら、***PowerShell*** 環境を選んで、ストレージを作成します。 次に示すように、Azure portal の下部にあるペインに、Cloud Shell のコマンド ライン インターフェイスが表示されます。 + + ![Azure portal と Cloud Shell のペイン](./images/cloud-shell.png) + + > **注**: 前に *Bash* 環境を使ってクラウド シェルを作成している場合は、そのクラウド シェル ペインの左上にあるドロップダウン メニューを使って、***PowerShell*** に変更します。 + +3. ペインの上部にある区分線をドラッグして Cloud Shell のサイズを変更したり、ペインの右上にある **—** 、 **◻** 、**X** アイコンを使用して、ペインを最小化または最大化したり、閉じたりすることができます。 Azure Cloud Shell の使い方について詳しくは、[Azure Cloud Shell のドキュメント](https://docs.microsoft.com/azure/cloud-shell/overview)をご覧ください。 + +4. PowerShell のペインで、次のコマンドを入力して、リポジトリを複製します。 + + ```powershell + rm -r mslearn-databricks -f + git clone https://github.com/MicrosoftLearning/mslearn-databricks + ``` + +5. リポジトリをクローンした後、次のコマンドを入力して **setup.ps1** スクリプトを実行します。これにより、使用可能なリージョンに Azure Databricks ワークスペースがプロビジョニングされます。 + + ```powershell + ./mslearn-databricks/setup.ps1 + ``` + +6. メッセージが表示された場合は、使用するサブスクリプションを選択します (これは、複数の Azure サブスクリプションへのアクセス権を持っている場合にのみ行います)。 + +7. スクリプトが完了するまで待ちます。通常、約 5 分かかりますが、さらに時間がかかる場合もあります。 待っている間に、Azure Databricks ドキュメントの[Delta Lake の概要](https://docs.microsoft.com/azure/databricks/delta/delta-intro)に関する記事をご確認ください。 + +## クラスターの作成 + +Azure Databricks は、Apache Spark "クラスター" を使用して複数のノードでデータを並列に処理する分散処理プラットフォームです。** 各クラスターは、作業を調整するドライバー ノードと、処理タスクを実行するワーカー ノードで構成されています。 この演習では、ラボ環境で使用されるコンピューティング リソース (リソースが制約される場合がある) を最小限に抑えるために、*単一ノード* クラスターを作成します。 運用環境では、通常、複数のワーカー ノードを含むクラスターを作成します。 + +> **ヒント**: Azure Databricks ワークスペースに 13.3 LTS 以降のランタイム バージョンを持つクラスターが既にある場合は、それを使ってこの演習を完了し、この手順をスキップできます。 + +1. Azure portal で、スクリプトによって作成された **msl-*xxxxxxx*** リソース グループ (または既存の Azure Databricks ワークスペースを含むリソース グループ) に移動します + +1. Azure Databricks Service リソース (セットアップ スクリプトを使って作成した場合は、**databricks-*xxxxxxx*** という名前) を選択します。 + +1. Azure Databricks ワークスペースの [**概要**] ページで、[**ワークスペースの起動**] ボタンを使用して、新しいブラウザー タブで Azure Databricks ワークスペースを開きます。サインインを求められた場合はサインインします。 + + > **ヒント**: Databricks ワークスペース ポータルを使用すると、さまざまなヒントと通知が表示される場合があります。 これらは無視し、指示に従ってこの演習のタスクを完了してください。 + +1. 左側のサイドバーで、**[(+) 新規]** タスクを選択し、**[クラスター]** を選択します。 + +1. **[新しいクラスター]** ページで、次の設定を使用して新しいクラスターを作成します。 + - **クラスター名**: "ユーザー名の" クラスター (既定のクラスター名)** + - **ポリシー**:Unrestricted + - **クラスター モード**: 単一ノード + - **アクセス モード**: 単一ユーザー (*自分のユーザー アカウントを選択*) + - **Databricks Runtime のバージョン**: 13.3 LTS (Spark 3.4.1、Scala 2.12) 以降 + - **Photon Acceleration を使用する**: 選択済み + - **ノードの種類**: Standard_DS3_v2 + - **非アクティブ状態が ** *20* ** 分間続いた後終了する** + +1. クラスターが作成されるまで待ちます。 これには 1、2 分かかることがあります。 + + > **注**: クラスターの起動に失敗した場合、Azure Databricks ワークスペースがプロビジョニングされているリージョンでサブスクリプションのクォータが不足していることがあります。 詳細については、「[CPU コアの制限によってクラスターを作成できない](https://docs.microsoft.com/azure/databricks/kb/clusters/azure-core-limit)」を参照してください。 その場合は、ワークスペースを削除し、別のリージョンに新しいワークスペースを作成してみてください。 次のように、セットアップ スクリプトのパラメーターとしてリージョンを指定できます: `./mslearn-databricks/setup.ps1 eastus` + +## ノートブックを作成してデータを取り込む + +1. サイド バーで **[(+) 新規]** タスクを使用して、**Notebook** を作成します。 **[接続]** ドロップダウン リストで、まだ選択されていない場合はクラスターを選択します。 クラスターが実行されていない場合は、起動に 1 分ほどかかる場合があります。 + +3. ノートブックの最初のセルに次のコードを入力します。このコードは、"シェル" コマンドを使用して、GitHub からクラスターで使用されるファイル システムにデータ ファイルをダウンロードします。** + + ```python + %sh + rm -r /dbfs/device_stream + mkdir /dbfs/device_stream + wget -O /dbfs/device_stream/device_data.csv https://github.com/MicrosoftLearning/mslearn-databricks/raw/main/data/device_data.csv + ``` + +4. セルの左側にある **[▸ セルの実行]** メニュー オプションを使用して実行を行います。 そして、コードによって実行される Spark ジョブが完了するまで待ちます。 + +## ストリーミング データにデルタ テーブルを使用する + +Delta Lake では、"*ストリーミング*" データがサポートされています。 デルタ テーブルは、Spark 構造化ストリーミング API を使用して作成されたデータ ストリームの "シンク" または "ソース" に指定できます。** ** この例では、モノのインターネット (IoT) のシミュレーション シナリオで、一部のストリーミング データのシンクにデルタ テーブルを使用します。 次のタスクでは、この差分テーブルはリアルタイムでデータ変換のソースとして機能します。 + +1. 新しいセルで、次のコードを実行して、CSV デバイス データを含むフォルダーに基づいてストリームを作成します。 + + ```python + from pyspark.sql.functions import * + from pyspark.sql.types import * + + # Define the schema for the incoming data + schema = StructType([ + StructField("device_id", StringType(), True), + StructField("timestamp", TimestampType(), True), + StructField("temperature", DoubleType(), True), + StructField("humidity", DoubleType(), True) + ]) + + # Read streaming data from folder + inputPath = '/device_stream/' + iotstream = spark.readStream.schema(schema).option("header", "true").csv(inputPath) + print("Source stream created...") + + # Write the data to a Delta table + query = (iotstream + .writeStream + .format("delta") + .option("checkpointLocation", "/tmp/checkpoints/iot_data") + .start("/tmp/delta/iot_data")) + ``` + +2. セルの左側にある **[▸ セルの実行]** メニュー オプションを使用して実行を行います。 + +この差分テーブルは、リアルタイムでデータ変換のソースになります。 + + > 注: 上記のコード セルはソース ストリームを作成します。 したがって、ジョブの実行は完了状態に変更されることはありません。 ストリーミングを手動で停止するには、新しいセルで `query.stop()` を実行します。 + +## Delta Live Tables パイプラインを作成する + +パイプラインは、Delta Live Tables でデータ処理ワークフローの構成と実行に使用されるメイン ユニットです。 Python または SQL で宣言された有向非巡回グラフ (DAG) を使用して、データ ソースをターゲット データセットにリンクします。 + +1. 左側のサイドバーで **Delta Live Tables** を選択し、 **[パイプラインの作成]** を選択します。 + +2. **[パイプラインの作成**] ページで、次の設定を使用して新しいパイプラインを作成します。 + - **パイプライン名**: パイプラインに名前を付ける + - **製品エディション**: 詳細 + - **パイプライン モード**: トリガー + - **ソース コード**: 空白のままにします + - **ストレージ オプション**: Hive メタストア + - **ストレージの場所**: dbfs:/pipelines/device_stream + +3. **[作成]** を選択します + +4. パイプラインが作成されたら、右側のパネルの**ソース コード**の下にある空白のノートブックへのリンクを開きます。 + + ![delta-live-table-pipeline](./images/delta-live-table-pipeline.png) + +5. ノートブックの最初のセルで、次のコードを入力して Delta Live Tables を作成し、データを変換します。 + + ```python + import dlt + from pyspark.sql.functions import col, current_timestamp + + @dlt.table( + name="raw_iot_data", + comment="Raw IoT device data" + ) + def raw_iot_data(): + return spark.readStream.format("delta").load("/tmp/delta/iot_data") + + @dlt.table( + name="transformed_iot_data", + comment="Transformed IoT device data with derived metrics" + ) + def transformed_iot_data(): + return ( + dlt.read("raw_iot_data") + .withColumn("temperature_fahrenheit", col("temperature") * 9/5 + 32) + .withColumn("humidity_percentage", col("humidity") * 100) + .withColumn("event_time", current_timestamp()) + ) + ``` + +6. **[スタート]** を選択します。 + +7. パイプラインが正常に実行されたら、最初のノートブックに戻り、次のコードを使用して、指定したストレージの場所に新しいテーブルが作成されていることを確認します。 + + ```sql + display(dbutils.fs.ls("dbfs:/pipelines/device_stream/tables")) + ``` + +## 結果を視覚化として表示する + +テーブルを作成した後、テーブルをデータフレームに読み込み、データを視覚化することができます。 + +1. 最初のノートブックで、新しいコード セルを追加し、次のコードを実行して `transformed_iot_data` をデータフレームに読み込みます。 + + ```python + df = spark.read.format("delta").load('/pipelines/device_stream/tables/transformed_iot_data') + display(df) + ``` + +1. 結果の表の上にある **[+]** 、 **[視覚化]** の順に選択して視覚化エディターを表示し、次のオプションを適用します。 + - **視覚化の種類**: 折れ線 + - **X 列**: タイムスタンプ + - **Y 列**: *新しい列を追加して、**temperature_fahrenheit** を選択します*。 ****合計***集計を適用します*。 + +1. 視覚化を保存し、結果のグラフをノートブックに表示します。 + +## クリーンアップ + +Azure Databricks ポータルの **[コンピューティング]** ページでクラスターを選択し、**[■ 終了]** を選択してクラスターをシャットダウンします。 + +Azure Databricks を調べ終わったら、作成したリソースを削除できます。これにより、不要な Azure コストが生じないようになり、サブスクリプションの容量も解放されます。 diff --git a/Instructions/Exercises/DE-03-Optimize-data-pipelines.md b/Instructions/Exercises/DE-03-Optimize-data-pipelines.md new file mode 100644 index 0000000..68dbf2c --- /dev/null +++ b/Instructions/Exercises/DE-03-Optimize-data-pipelines.md @@ -0,0 +1,188 @@ +--- +lab: + title: Azure Databricks でパフォーマンスを向上させるためにデータ パイプラインを最適化する +--- + +# Azure Databricks でパフォーマンスを向上させるためにデータ パイプラインを最適化する + +Azure Databricks でデータ パイプラインを最適化すると、パフォーマンスと効率が大幅に向上します。 自動ローダーを使用して、増分データ インジェストを Delta Lake のストレージ レイヤーと組み合わせて使用することで、信頼性と ACID トランザクションが保証されます。 ソルティングを実装するとデータ スキューを防ぐことができますが、Z オーダー クラスタリングでは関連情報を併置することでファイルの読み取りが最適化されます。 Azure Databricks の自動チューニング機能とコストベースのオプティマイザーでは、ワークロードの要件に基づいて設定を調整することで、パフォーマンスをさらに向上させることができます。 + +このラボは完了するまで、約 **30** 分かかります。 + +## Azure Databricks ワークスペースをプロビジョニングする + +> **ヒント**: 既に Azure Databricks ワークスペースがある場合は、この手順をスキップして、既存のワークスペースを使用できます。 + +この演習には、新しい Azure Databricks ワークスペースをプロビジョニングするスクリプトが含まれています。 このスクリプトは、この演習で必要なコンピューティング コアに対する十分なクォータが Azure サブスクリプションにあるリージョンに、*Premium* レベルの Azure Databricks ワークスペース リソースを作成しようとします。また、使用するユーザー アカウントのサブスクリプションに、Azure Databricks ワークスペース リソースを作成するための十分なアクセス許可があることを前提としています。 十分なクォータやアクセス許可がないためにスクリプトが失敗した場合は、[Azure portal で、Azure Databricks ワークスペースを対話形式で作成](https://learn.microsoft.com/azure/databricks/getting-started/#--create-an-azure-databricks-workspace)してみてください。 + +1. Web ブラウザーで、`https://portal.azure.com` の [Azure portal](https://portal.azure.com) にサインインします。 + +2. ページ上部の検索バーの右側にある **[\>_]** ボタンを使用して、Azure portal に新しい Cloud Shell を作成します。メッセージが表示されたら、***PowerShell*** 環境を選んで、ストレージを作成します。 次に示すように、Azure portal の下部にあるペインに、Cloud Shell のコマンド ライン インターフェイスが表示されます。 + + ![Azure portal と Cloud Shell のペイン](./images/cloud-shell.png) + + > **注**: 前に *Bash* 環境を使ってクラウド シェルを作成している場合は、そのクラウド シェル ペインの左上にあるドロップダウン メニューを使って、***PowerShell*** に変更します。 + +3. ペインの上部にある区分線をドラッグして Cloud Shell のサイズを変更したり、ペインの右上にある **—** 、 **◻** 、**X** アイコンを使用して、ペインを最小化または最大化したり、閉じたりすることができます。 Azure Cloud Shell の使い方について詳しくは、[Azure Cloud Shell のドキュメント](https://docs.microsoft.com/azure/cloud-shell/overview)をご覧ください。 + +4. PowerShell のペインで、次のコマンドを入力して、リポジトリを複製します。 + + ```powershell + rm -r mslearn-databricks -f + git clone https://github.com/MicrosoftLearning/mslearn-databricks + ``` + +5. リポジトリをクローンした後、次のコマンドを入力して **setup.ps1** スクリプトを実行します。これにより、使用可能なリージョンに Azure Databricks ワークスペースがプロビジョニングされます。 + + ```powershell + ./mslearn-databricks/setup.ps1 + ``` + +6. メッセージが表示された場合は、使用するサブスクリプションを選択します (これは、複数の Azure サブスクリプションへのアクセス権を持っている場合にのみ行います)。 + +7. スクリプトが完了するまで待ちます。通常、約 5 分かかりますが、さらに時間がかかる場合もあります。 待っている間に、Azure Databricks ドキュメントの[Delta Lake の概要](https://docs.microsoft.com/azure/databricks/delta/delta-intro)に関する記事をご確認ください。 + +## クラスターの作成 + +Azure Databricks は、Apache Spark "クラスター" を使用して複数のノードでデータを並列に処理する分散処理プラットフォームです。** 各クラスターは、作業を調整するドライバー ノードと、処理タスクを実行するワーカー ノードで構成されています。 この演習では、ラボ環境で使用されるコンピューティング リソース (リソースが制約される場合がある) を最小限に抑えるために、*単一ノード* クラスターを作成します。 運用環境では、通常、複数のワーカー ノードを含むクラスターを作成します。 + +> **ヒント**: Azure Databricks ワークスペースに 13.3 LTS 以降のランタイム バージョンを持つクラスターが既にある場合は、それを使ってこの演習を完了し、この手順をスキップできます。 + +1. Azure portal で、スクリプトによって作成された **msl-*xxxxxxx*** リソース グループ (または既存の Azure Databricks ワークスペースを含むリソース グループ) に移動します + +1. Azure Databricks Service リソース (セットアップ スクリプトを使って作成した場合は、**databricks-*xxxxxxx*** という名前) を選択します。 + +1. Azure Databricks ワークスペースの [**概要**] ページで、[**ワークスペースの起動**] ボタンを使用して、新しいブラウザー タブで Azure Databricks ワークスペースを開きます。サインインを求められた場合はサインインします。 + + > **ヒント**: Databricks ワークスペース ポータルを使用すると、さまざまなヒントと通知が表示される場合があります。 これらは無視し、指示に従ってこの演習のタスクを完了してください。 + +1. 左側のサイドバーで、**[(+) 新規]** タスクを選択し、**[クラスター]** を選択します。 + +1. **[新しいクラスター]** ページで、次の設定を使用して新しいクラスターを作成します。 + - **クラスター名**: "ユーザー名の" クラスター (既定のクラスター名)** + - **ポリシー**:Unrestricted + - **クラスター モード**: 単一ノード + - **アクセス モード**: 単一ユーザー (*自分のユーザー アカウントを選択*) + - **Databricks Runtime のバージョン**: 13.3 LTS (Spark 3.4.1、Scala 2.12) 以降 + - **Photon Acceleration を使用する**: 選択済み + - **ノードの種類**: Standard_DS3_v2 + - **非アクティブ状態が ** *20* ** 分間続いた後終了する** + +1. クラスターが作成されるまで待ちます。 これには 1、2 分かかることがあります。 + + > **注**: クラスターの起動に失敗した場合、Azure Databricks ワークスペースがプロビジョニングされているリージョンでサブスクリプションのクォータが不足していることがあります。 詳細については、「[CPU コアの制限によってクラスターを作成できない](https://docs.microsoft.com/azure/databricks/kb/clusters/azure-core-limit)」を参照してください。 その場合は、ワークスペースを削除し、別のリージョンに新しいワークスペースを作成してみてください。 次のように、セットアップ スクリプトのパラメーターとしてリージョンを指定できます: `./mslearn-databricks/setup.ps1 eastus` + +## ノートブックを作成してデータを取り込む + +1. サイド バーで **[(+) 新規]** タスクを使用して、**Notebook** を作成します。 **[接続]** ドロップダウン リストで、まだ選択されていない場合はクラスターを選択します。 クラスターが実行されていない場合は、起動に 1 分ほどかかる場合があります。 + +2. ノートブックの最初のセルに次のコードを入力します。このコードは、"シェル" コマンドを使用して、GitHub からクラスターで使用されるファイル システムにデータ ファイルをダウンロードします。** + + ```python + %sh + rm -r /dbfs/nyc_taxi_trips + mkdir /dbfs/nyc_taxi_trips + wget -O /dbfs/nyc_taxi_trips/yellow_tripdata_2021-01.parquet https://github.com/MicrosoftLearning/mslearn-databricks/raw/main/data/yellow_tripdata_2021-01.parquet + ``` + +3. あたらしいセルで、データセットをデータフレームに読み込むには、次のコードを入力します。 + + ```python + # Load the dataset into a DataFrame + df = spark.read.parquet("/nyc_taxi_trips/yellow_tripdata_2021-01.parquet") + display(df) + ``` + +4. セルの左側にある **[▸ セルの実行]** メニュー オプションを使用して実行を行います。 そして、コードによって実行される Spark ジョブが完了するまで待ちます。 + +## 自動ローダーを使用してデータ インジェストを最適化する: + +大規模なデータセットを効率的に処理するには、データ インジェストの最適化が不可欠です。 自動ローダーは、クラウド ストレージに到着した新しいデータ ファイルを処理し、さまざまなファイル形式とクラウド ストレージ サービスをサポートするように設計されています。 + +自動ローダーは、`cloudFiles` と呼ばれる構造化ストリーミング ソースを提供します。 クラウド ファイル ストレージ上に入力ディレクトリ パスを指定すると、`cloudFiles` ソースでは、新しいファイルが到着したときにそれらが自動的に処理されます。また、そのディレクトリ内の既存のファイルも処理できます。 + +1. 新しいセルで、次のコードを実行して、サンプル データを含むフォルダーに基づいてストリームを作成します。 + + ```python + df = (spark.readStream + .format("cloudFiles") + .option("cloudFiles.format", "parquet") + .option("cloudFiles.schemaLocation", "/stream_data/nyc_taxi_trips/schema") + .load("/nyc_taxi_trips/")) + df.writeStream.format("delta") \ + .option("checkpointLocation", "/stream_data/nyc_taxi_trips/checkpoints") \ + .option("mergeSchema", "true") \ + .start("/delta/nyc_taxi_trips") + display(df) + ``` + +2. 新しいセルで、次のコードを実行して、新しい Parquet ファイルをストリームに追加します。 + + ```python + %sh + rm -r /dbfs/nyc_taxi_trips + mkdir /dbfs/nyc_taxi_trips + wget -O /dbfs/nyc_taxi_trips/yellow_tripdata_2021-02_edited.parquet https://github.com/MicrosoftLearning/mslearn-databricks/raw/main/data/yellow_tripdata_2021-02_edited.parquet + ``` + +新しいファイルには新しい列があるため、ストリームは `UnknownFieldException` エラーで停止します。 ストリームからこのエラーがスローされる前に、自動ローダーによって、データの最新のマイクロバッチに対してスキーマ推論が実行され、新しい列をスキーマの末尾にマージすることによって、スキーマの場所が最新のスキーマで更新されます。 既存の列のデータ型は変更されません。 + +3. ストリーミング コード セルをもう一度実行し、2 つの新しい列がテーブルに追加されたことを確認します。 + + ![新しい列を含む差分テーブル](./images/autoloader-new-columns.png) + +> 注: `_rescued_data` 列には、型の不一致、大文字と小文字の不一致、またはスキーマに列がないために解析されないデータが含まれています。 + +4. **[割り込み]** を選択して、データ ストリーミングを停止します。 + +ストリーミング データは差分テーブルに書き込まれます。 Delta Lake には、ACID トランザクション、スキーマの進化、タイム トラベル、ストリーミングとバッチ データ処理の統合など、従来の Parquet ファイルに対する一連の強化機能が用意されているため、Delta Lake は、ビッグ データ ワークロードを管理するための強力なソリューションになります。 + +## 最適化されたデータ変換 + +データ スキューは分散コンピューティングにおいて大きな課題であり、特に Apache Spark などのフレームワークを使用したビッグ データ処理において顕著です。 ソルティングはデータ スキューを最適化するための効果的な技術であり、パーティショニングの前にキーにランダムな要素、つまり "ソルト" を追加します。  このプロセスはデータをより均等にパーティション間で分散させるのに役立ち、よりバランスの取れたワークロードとパフォーマンスの向上をもたらします。 + +1. 新しいセルで、次のコードを実行して、ランダムな整数を持つ *[salt]* 列を追加して、大きな傾斜したパーティションをより小さなパーティションに分割します。 + + ```python + from pyspark.sql.functions import lit, rand + + # Convert streaming DataFrame back to batch DataFrame + df = spark.read.parquet("/nyc_taxi_trips/*.parquet") + + # Add a salt column + df_salted = df.withColumn("salt", (rand() * 100).cast("int")) + + # Repartition based on the salted column + df_salted.repartition("salt").write.format("delta").mode("overwrite").save("/delta/nyc_taxi_trips_salted") + + display(df_salted) + ``` + +## ストレージを最適化する + +Delta Lake には、データ ストレージのパフォーマンスと管理を大幅に強化できる最適化コマンドのスイートが用意されています。 `optimize` コマンドは、圧縮や Z オーダーなどの手法を使用してデータをより効率的に整理することで、クエリ速度を向上するように設計されています。 + +圧縮は、小さなファイルを大きなファイルに統合するもので、特に読み取りクエリにとって有益です。 Z オーダーとは、関連情報が近くに保存されるようにデータポイントを配置することで、クエリ中にこのデータにアクセスする時間を短縮することです。 + +1. 新しいセルで、次のコードを実行して差分テーブルへの圧縮を実行します。 + + ```python + from delta.tables import DeltaTable + + delta_table = DeltaTable.forPath(spark, "/delta/nyc_taxi_trips") + delta_table.optimize().executeCompaction() + ``` + +2. 新しいセルで、次のコードを実行して Z オーダー クラスタリングを実行します。 + + ```python + delta_table.optimize().executeZOrderBy("tpep_pickup_datetime") + ``` + +この手法により、同じファイル セット内に関連情報が併置され、クエリのパフォーマンスが向上します。 + +## クリーンアップ + +Azure Databricks ポータルの **[コンピューティング]** ページでクラスターを選択し、**[■ 終了]** を選択してクラスターをシャットダウンします。 + +Azure Databricks を調べ終わったら、作成したリソースを削除できます。これにより、不要な Azure コストが生じないようになり、サブスクリプションの容量も解放されます。 diff --git a/Instructions/Exercises/DE-04-Implement-CI-CD-pipeline.md b/Instructions/Exercises/DE-04-Implement-CI-CD-pipeline.md new file mode 100644 index 0000000..02155be --- /dev/null +++ b/Instructions/Exercises/DE-04-Implement-CI-CD-pipeline.md @@ -0,0 +1,217 @@ +--- +lab: + title: Azure Databricks と Azure DevOps または Azure Databricks と GitHub を使用して CI/CD パイプラインを実装する +--- + +# Azure Databricks と Azure DevOps または Azure Databricks と GitHub を使用して CI/CD パイプラインを実装する + +Azure Databricks と Azure DevOps または Azure Databricks と GitHub を使用して継続的インテグレーション (CI) パイプラインと継続的デプロイ (CD) パイプラインを実装するには、コードの変更が統合され、テストされ、効率的にデプロイされるように、一連の自動化された手順を設定する必要があります。 通常、このプロセスには、Git リポジトリへの接続、Azure Pipelines を使用したジョブの実行、コードのビルドと単体テスト、Databricks ノートブックで使用するためのビルド成果物のデプロイが含まれます。 このワークフローにより、堅牢な開発サイクルが可能になり、最新の DevOps プラクティスに合わせた継続的インテグレーションとデリバリーが可能になります。 + +このラボは完了するまで、約 **40** 分かかります。 + +>**注:** この演習を完了するには、Github アカウントと Azure DevOps アクセス権が必要です。 + +## Azure Databricks ワークスペースをプロビジョニングする + +> **ヒント**: 既に Azure Databricks ワークスペースがある場合は、この手順をスキップして、既存のワークスペースを使用できます。 + +この演習には、新しい Azure Databricks ワークスペースをプロビジョニングするスクリプトが含まれています。 このスクリプトは、この演習で必要なコンピューティング コアに対する十分なクォータが Azure サブスクリプションにあるリージョンに、*Premium* レベルの Azure Databricks ワークスペース リソースを作成しようとします。また、使用するユーザー アカウントのサブスクリプションに、Azure Databricks ワークスペース リソースを作成するための十分なアクセス許可があることを前提としています。 十分なクォータやアクセス許可がないためにスクリプトが失敗した場合は、[Azure portal で、Azure Databricks ワークスペースを対話形式で作成](https://learn.microsoft.com/azure/databricks/getting-started/#--create-an-azure-databricks-workspace)してみてください。 + +1. Web ブラウザーで、`https://portal.azure.com` の [Azure portal](https://portal.azure.com) にサインインします。 + +2. ページ上部の検索バーの右側にある **[\>_]** ボタンを使用して、Azure portal に新しい Cloud Shell を作成します。メッセージが表示されたら、***PowerShell*** 環境を選んで、ストレージを作成します。 次に示すように、Azure portal の下部にあるペインに、Cloud Shell のコマンド ライン インターフェイスが表示されます。 + + ![Azure portal と Cloud Shell のペイン](./images/cloud-shell.png) + + > **注**: 前に *Bash* 環境を使ってクラウド シェルを作成している場合は、そのクラウド シェル ペインの左上にあるドロップダウン メニューを使って、***PowerShell*** に変更します。 + +3. ペインの上部にある区分線をドラッグして Cloud Shell のサイズを変更したり、ペインの右上にある **—** 、 **◻** 、**X** アイコンを使用して、ペインを最小化または最大化したり、閉じたりすることができます。 Azure Cloud Shell の使い方について詳しくは、[Azure Cloud Shell のドキュメント](https://docs.microsoft.com/azure/cloud-shell/overview)をご覧ください。 + +4. PowerShell のペインで、次のコマンドを入力して、リポジトリを複製します。 + + ```powershell + rm -r mslearn-databricks -f + git clone https://github.com/MicrosoftLearning/mslearn-databricks + ``` + +5. リポジトリをクローンした後、次のコマンドを入力して **setup.ps1** スクリプトを実行します。これにより、使用可能なリージョンに Azure Databricks ワークスペースがプロビジョニングされます。 + + ```powershell + ./mslearn-databricks/setup.ps1 + ``` + +6. メッセージが表示された場合は、使用するサブスクリプションを選択します (これは、複数の Azure サブスクリプションへのアクセス権を持っている場合にのみ行います)。 + +7. スクリプトが完了するまで待ちます。通常、約 5 分かかりますが、さらに時間がかかる場合もあります。 待っている間に、Azure Databricks ドキュメントの[Delta Lake の概要](https://docs.microsoft.com/azure/databricks/delta/delta-intro)に関する記事をご確認ください。 + +## クラスターの作成 + +Azure Databricks は、Apache Spark "クラスター" を使用して複数のノードでデータを並列に処理する分散処理プラットフォームです。** 各クラスターは、作業を調整するドライバー ノードと、処理タスクを実行するワーカー ノードで構成されています。 この演習では、ラボ環境で使用されるコンピューティング リソース (リソースが制約される場合がある) を最小限に抑えるために、*単一ノード* クラスターを作成します。 運用環境では、通常、複数のワーカー ノードを含むクラスターを作成します。 + +> **ヒント**: Azure Databricks ワークスペースに 13.3 LTS 以降のランタイム バージョンを持つクラスターが既にある場合は、それを使ってこの演習を完了し、この手順をスキップできます。 + +1. Azure portal で、スクリプトによって作成された **msl-*xxxxxxx*** リソース グループ (または既存の Azure Databricks ワークスペースを含むリソース グループ) に移動します + +1. Azure Databricks Service リソース (セットアップ スクリプトを使って作成した場合は、**databricks-*xxxxxxx*** という名前) を選択します。 + +1. Azure Databricks ワークスペースの [**概要**] ページで、[**ワークスペースの起動**] ボタンを使用して、新しいブラウザー タブで Azure Databricks ワークスペースを開きます。サインインを求められた場合はサインインします。 + + > **ヒント**: Databricks ワークスペース ポータルを使用すると、さまざまなヒントと通知が表示される場合があります。 これらは無視し、指示に従ってこの演習のタスクを完了してください。 + +1. 左側のサイドバーで、**[(+) 新規]** タスクを選択し、**[クラスター]** を選択します。 + +1. **[新しいクラスター]** ページで、次の設定を使用して新しいクラスターを作成します。 + - **クラスター名**: "ユーザー名の" クラスター (既定のクラスター名)** + - **ポリシー**:Unrestricted + - **クラスター モード**: 単一ノード + - **アクセス モード**: 単一ユーザー (*自分のユーザー アカウントを選択*) + - **Databricks Runtime のバージョン**: 13.3 LTS (Spark 3.4.1、Scala 2.12) 以降 + - **Photon Acceleration を使用する**: 選択済み + - **ノードの種類**: Standard_DS3_v2 + - **非アクティブ状態が ** *20* ** 分間続いた後終了する** + +1. クラスターが作成されるまで待ちます。 これには 1、2 分かかることがあります。 + + > **注**: クラスターの起動に失敗した場合、Azure Databricks ワークスペースがプロビジョニングされているリージョンでサブスクリプションのクォータが不足していることがあります。 詳細については、「[CPU コアの制限によってクラスターを作成できない](https://docs.microsoft.com/azure/databricks/kb/clusters/azure-core-limit)」を参照してください。 その場合は、ワークスペースを削除し、別のリージョンに新しいワークスペースを作成してみてください。 次のように、セットアップ スクリプトのパラメーターとしてリージョンを指定できます: `./mslearn-databricks/setup.ps1 eastus` + +## ノートブックを作成してデータを取り込む + +1. サイド バーで **[(+) 新規]** タスクを使用して、**Notebook** を作成します。 **[接続]** ドロップダウン リストで、まだ選択されていない場合はクラスターを選択します。 クラスターが実行されていない場合は、起動に 1 分ほどかかる場合があります。 + +2. ノートブックの最初のセルに次のコードを入力します。このコードは、"シェル" コマンドを使用して、GitHub からクラスターで使用されるファイル システムにデータ ファイルをダウンロードします。** + + ```python + %sh + rm -r /dbfs/FileStore + mkdir /dbfs/FileStore + wget -O /dbfs/FileStore/sample_sales.csv https://github.com/MicrosoftLearning/mslearn-databricks/raw/main/data/sample_sales.csv + ``` + +3. セルの左側にある **[▸ セルの実行]** メニュー オプションを使用して実行を行います。 そして、コードによって実行される Spark ジョブが完了するまで待ちます。 + +## GitHub リポジトリとAzure DevOps プロジェクトを設定する + +GitHub リポジトリを Azure DevOps プロジェクトに接続したら、リポジトリに加えられた変更をトリガーする CI パイプラインを設定できます。 + +1. [GitHub アカウント](https://github.com/)に移動し、プロジェクトの新しいリポジトリを作成します。 + +2. `git clone` を使用して、ローカル コンピューターにリポジトリを複製します。 + +3. [CSV ファイル](https://github.com/MicrosoftLearning/mslearn-databricks/raw/main/data/sample_sales.csv)をローカル リポジトリにダウンロードし、変更内容をコミットします。 + +4. CSV ファイルの読み取りとデータ変換の実行に使用する [Databricks ノートブック](https://github.com/MicrosoftLearning/mslearn-databricks/raw/main/data/sample_sales_notebook.dbc)をダウンロードします。 変更をコミットします。 + +5. [Azure DevOps ポータル](https://azure.microsoft.com/en-us/products/devops/)に移動し、新しいプロジェクトを作成します。 + +6. Azure DevOps プロジェクトで、 **Repos** セクションに移動し、**[Import]** を選択して GitHub リポジトリに接続します。 + +7. 左側のバーで、**[プロジェクト設定] > [サービス接続]** に移動します。 + +8. **[サービス接続の作成]** を選択し、次に **[Azure Resource Manager]** を選択します。 + +9. **[認証方法]** ウィンドウで、 **[ワークロード ID フェデレーション (自動)]** を選択します。 [**次へ**] を選択します。 + +10. **[スコープ レベル]** で **[サブスクリプション]** を選択します。 Databricks ワークスペースを作成したサブスクリプションとリソース グループを選択します。 + +11. サービス接続の名前を入力し、**[すべてのパイプラインへのアクセス許可を与える]** オプションをオンにします。 **[保存]** を選択します。 + +これで、DevOps プロジェクトが Databricks ワークスペースにアクセスできるようになり、パイプラインに接続できるようになります。 + +## CI/CD パイプラインを構成する + +1. 左側のバーで、**Pipelines** に移動し **[パイプラインの作成]** を選択します。 + +2. ソース コードの場所として **[GitHub]** を選択し、リポジトリを選択してください。 + +3. **[パイプラインの構成]** ウィンドウで、**[スタート パイプライン]** を選択し、CI パイプラインに次の YAML 構成を使用します。 + +```yaml +trigger: +- main + +pool: + vmImage: 'ubuntu-latest' + +steps: +- task: UsePythonVersion@0 + inputs: + versionSpec: '3.x' + addToPath: true + +- script: | + pip install databricks-cli + displayName: 'Install Databricks CLI' + +- script: | + databricks fs cp dbfs:/FileStore/sample_sales.csv . + displayName: 'Download Sample Data from DBFS' + +- script: | + python -m unittest discover -s tests + displayName: 'Run Unit Tests' +``` + +4. **[保存して実行]** を選択します。 + +この YAML ファイルは、リポジトリの `main` ブランチへの変更によってトリガーされる CI パイプラインを設定します。 パイプラインは Python 環境を設定し、Databricks CLI をインストールし、Databricks ワークスペースからサンプル データをダウンロードして、Python 単体テストを実行します。 これは CI ワークフローの一般的なセットアップです。 + +## CI/CD パイプラインを構成する + +1. 左側のバーで、**Pipelines > Releases** に移動し **[リリースの作成]** を選択します。 + +2. 成果物ソースとしてビルド パイプラインを選択します。 + +3. ステージを追加し、Azure Databricks にデプロイするタスクを構成します。 + +```yaml +stages: +- stage: Deploy + jobs: + - job: DeployToDatabricks + pool: + vmImage: 'ubuntu-latest' + steps: + - task: UsePythonVersion@0 + inputs: + versionSpec: '3.x' + addToPath: true + + - script: | + pip install databricks-cli + displayName: 'Install Databricks CLI' + + - script: | + databricks workspace import_dir /path/to/notebooks /Workspace/Notebooks + displayName: 'Deploy Notebooks to Databricks' +``` + +このパイプラインを実行する前に、`/path/to/notebooks` をリポジトリ内のノートブックがあるディレクトリへのパスに置き換え、`/Workspace/Notebooks` を、Databricks ワークスペースでノートブックを保存したいファイル パスに置き換えます。 + +4. **[保存して実行]** を選択します。 + +## パイプラインを実行する + +1. ローカル レポジトリで、`sample_sales.csv` ファイルの末尾に次の行を追加します。 + + ```sql + 2024-01-01,ProductG,1,500 + ``` + +2. 変更をコミットし、GitHub リポジトリにプッシュする。 + +3. リポジトリ内の変更によって CI パイプラインがトリガーされます。 パイプラインの実行が正常に完了することを確認します。 + +4. リリース パイプラインで新しいリリースを作成し、ノートブックを Databricks にデプロイします。 ノートブックが Databricks ワークスペースで正常にデプロイされ、実行されていることを確認します。 + +## クリーンアップ + +Azure Databricks ポータルの **[コンピューティング]** ページでクラスターを選択し、**[■ 終了]** を選択してクラスターをシャットダウンします。 + +Azure Databricks を調べ終わったら、作成したリソースを削除できます。これにより、不要な Azure コストが生じないようになり、サブスクリプションの容量も解放されます。 + + + + + + + diff --git a/Instructions/Exercises/DE-05-Automate-data-ingestion.md b/Instructions/Exercises/DE-05-Automate-data-ingestion.md new file mode 100644 index 0000000..c54bb4e --- /dev/null +++ b/Instructions/Exercises/DE-05-Automate-data-ingestion.md @@ -0,0 +1,132 @@ +--- +lab: + title: Azure Databricks を使用したデータ インジェストと処理の自動化 +--- + +# Azure Databricks を使用したデータ インジェストと処理の自動化 + +Databricks ジョブは、データ インジェストと処理ワークフローの自動化を可能にする強力なサービスです。 これにより、複雑なデータ パイプラインのオーケストレーションが可能になります。これには、さまざまなソースからの生データの取り込み、Delta Live Tables を使用したこのデータの変換、さらに分析のために Delta Lake への永続化などのタスクが含まれます。 Azure Databricks を使用すると、ユーザーはデータ処理タスクを自動的にスケジュールして実行できるため、データが常に最新であり、意思決定プロセスで使用できるようになります。 + +このラボは完了するまで、約 **20** 分かかります。 + +## Azure Databricks ワークスペースをプロビジョニングする + +> **ヒント**: 既に Azure Databricks ワークスペースがある場合は、この手順をスキップして、既存のワークスペースを使用できます。 + +この演習には、新しい Azure Databricks ワークスペースをプロビジョニングするスクリプトが含まれています。 このスクリプトは、この演習で必要なコンピューティング コアに対する十分なクォータが Azure サブスクリプションにあるリージョンに、*Premium* レベルの Azure Databricks ワークスペース リソースを作成しようとします。また、使用するユーザー アカウントのサブスクリプションに、Azure Databricks ワークスペース リソースを作成するための十分なアクセス許可があることを前提としています。 十分なクォータやアクセス許可がないためにスクリプトが失敗した場合は、[Azure portal で、Azure Databricks ワークスペースを対話形式で作成](https://learn.microsoft.com/azure/databricks/getting-started/#--create-an-azure-databricks-workspace)してみてください。 + +1. Web ブラウザーで、`https://portal.azure.com` の [Azure portal](https://portal.azure.com) にサインインします。 + +2. ページ上部の検索バーの右側にある **[\>_]** ボタンを使用して、Azure portal に新しい Cloud Shell を作成します。メッセージが表示されたら、***PowerShell*** 環境を選んで、ストレージを作成します。 次に示すように、Azure portal の下部にあるペインに、Cloud Shell のコマンド ライン インターフェイスが表示されます。 + + ![Azure portal と Cloud Shell のペイン](./images/cloud-shell.png) + + > **注**: 前に *Bash* 環境を使ってクラウド シェルを作成している場合は、そのクラウド シェル ペインの左上にあるドロップダウン メニューを使って、***PowerShell*** に変更します。 + +3. ペインの上部にある区分線をドラッグして Cloud Shell のサイズを変更したり、ペインの右上にある **—** 、 **◻** 、**X** アイコンを使用して、ペインを最小化または最大化したり、閉じたりすることができます。 Azure Cloud Shell の使い方について詳しくは、[Azure Cloud Shell のドキュメント](https://docs.microsoft.com/azure/cloud-shell/overview)をご覧ください。 + +4. PowerShell のペインで、次のコマンドを入力して、リポジトリを複製します。 + + ```powershell + rm -r mslearn-databricks -f + git clone https://github.com/MicrosoftLearning/mslearn-databricks + ``` + +5. リポジトリをクローンした後、次のコマンドを入力して **setup.ps1** スクリプトを実行します。これにより、使用可能なリージョンに Azure Databricks ワークスペースがプロビジョニングされます。 + + ```powershell + ./mslearn-databricks/setup.ps1 + ``` + +6. メッセージが表示された場合は、使用するサブスクリプションを選択します (これは、複数の Azure サブスクリプションへのアクセス権を持っている場合にのみ行います)。 + +7. スクリプトが完了するまで待ちます。通常、約 5 分かかりますが、さらに時間がかかる場合もあります。 待っている間に、Azure Databricks ドキュメントの[Delta Lake の概要](https://docs.microsoft.com/azure/databricks/delta/delta-intro)に関する記事をご確認ください。 + +## クラスターの作成 + +Azure Databricks は、Apache Spark "クラスター" を使用して複数のノードでデータを並列に処理する分散処理プラットフォームです。** 各クラスターは、作業を調整するドライバー ノードと、処理タスクを実行するワーカー ノードで構成されています。 この演習では、ラボ環境で使用されるコンピューティング リソース (リソースが制約される場合がある) を最小限に抑えるために、*単一ノード* クラスターを作成します。 運用環境では、通常、複数のワーカー ノードを含むクラスターを作成します。 + +> **ヒント**: Azure Databricks ワークスペースに 13.3 LTS 以降のランタイム バージョンを持つクラスターが既にある場合は、それを使ってこの演習を完了し、この手順をスキップできます。 + +1. Azure portal で、スクリプトによって作成された **msl-*xxxxxxx*** リソース グループ (または既存の Azure Databricks ワークスペースを含むリソース グループ) に移動します + +1. Azure Databricks Service リソース (セットアップ スクリプトを使って作成した場合は、**databricks-*xxxxxxx*** という名前) を選択します。 + +1. Azure Databricks ワークスペースの [**概要**] ページで、[**ワークスペースの起動**] ボタンを使用して、新しいブラウザー タブで Azure Databricks ワークスペースを開きます。サインインを求められた場合はサインインします。 + + > **ヒント**: Databricks ワークスペース ポータルを使用すると、さまざまなヒントと通知が表示される場合があります。 これらは無視し、指示に従ってこの演習のタスクを完了してください。 + +1. 左側のサイドバーで、**[(+) 新規]** タスクを選択し、**[クラスター]** を選択します。 + +1. **[新しいクラスター]** ページで、次の設定を使用して新しいクラスターを作成します。 + - **クラスター名**: "ユーザー名の" クラスター (既定のクラスター名)** + - **ポリシー**:Unrestricted + - **クラスター モード**: 単一ノード + - **アクセス モード**: 単一ユーザー (*自分のユーザー アカウントを選択*) + - **Databricks Runtime のバージョン**: 13.3 LTS (Spark 3.4.1、Scala 2.12) 以降 + - **Photon Acceleration を使用する**: 選択済み + - **ノードの種類**: Standard_DS3_v2 + - **非アクティブ状態が ** *20* ** 分間続いた後終了する** + +1. クラスターが作成されるまで待ちます。 これには 1、2 分かかることがあります。 + + > **注**: クラスターの起動に失敗した場合、Azure Databricks ワークスペースがプロビジョニングされているリージョンでサブスクリプションのクォータが不足していることがあります。 詳細については、「[CPU コアの制限によってクラスターを作成できない](https://docs.microsoft.com/azure/databricks/kb/clusters/azure-core-limit)」を参照してください。 その場合は、ワークスペースを削除し、別のリージョンに新しいワークスペースを作成してみてください。 次のように、セットアップ スクリプトのパラメーターとしてリージョンを指定できます: `./mslearn-databricks/setup.ps1 eastus` + +## ノートブックを作成してデータを取り込む + +1. サイド バーで **[(+) 新規]** タスクを使用して、**Notebook** を作成します。 **[接続]** ドロップダウン リストで、まだ選択されていない場合はクラスターを選択します。 クラスターが実行されていない場合は、起動に 1 分ほどかかる場合があります。 + +2. ノートブックの最初のセルに次のコードを入力します。このコードは、"シェル" コマンドを使用して、GitHub からクラスターで使用されるファイル システムにデータ ファイルをダウンロードします。** + + ```python + %sh + rm -r /dbfs/FileStore + mkdir /dbfs/FileStore + wget -O /dbfs/FileStore/sample_sales_data.csv https://github.com/MicrosoftLearning/mslearn-databricks/raw/main/data/sample_sales_data.csv + ``` + +3. セルの左側にある **[▸ セルの実行]** メニュー オプションを使用して実行を行います。 そして、コードによって実行される Spark ジョブが完了するまで待ちます。 + +## Azure Databricks ジョブによるデータ処理の自動化 + +1. 新しいノートブックを作成し、後で簡単に識別できるように*データ処理*という名前を付けます。 これは、Databricks ジョブのデータ インジェストと処理ワークフローを自動化するタスクとして使用されます。 + +2. ノートブックの最初のセルで、次のコードを実行してデータセットをデータフレームに読み込みます。 + + ```python + # Load the sample dataset into a DataFrame + df = spark.read.csv('/FileStore/*.csv', header=True, inferSchema=True) + df.show() + ``` + +3. 新しいセルに、次のコードを入力して、製品カテゴリ別に売上データを集計します。 + + ```python + from pyspark.sql.functions import col, sum + + # Aggregate sales data by product category + sales_by_category = df.groupBy('product_category').agg(sum('transaction_amount').alias('total_sales')) + sales_by_category.show() + ``` + +4. サイド バーで **[(+) 新規]** リンクを使用して、**ジョブ**を作成します。 + +5. タスクの名前を指定し、作成したノートブックをタスクのソースとして **Path** フィールドに指定します。 + +6. **[タスクの作成]** を選択します。 + +7. 右側のパネルの**スケジュール**の下で、**[トリガーを追加]** を選択し、ジョブの実行スケジュール(例:毎日、毎週)を設定できます。 ただし、この演習では、手動で実行します。 + +8. **[今すぐ実行]** を選択します。 + +9. [ジョブ] パネルで **[実行]** タブを選択し、ジョブの実行を監視します。 + +10. ジョブの実行が成功したら、[実行] リストでジョブを選択し、その出力を確認できます。 + +Azure Databricks ジョブを使用して、データインジェストと処理を正常に設定し、自動化しました。 このソリューションをスケーリングして、より複雑なデータ パイプラインを処理し、他の Azure サービスと統合して堅牢なデータ処理アーキテクチャを実現できるようになりました。 + +## クリーンアップ + +Azure Databricks ポータルの **[コンピューティング]** ページでクラスターを選択し、**[■ 終了]** を選択してクラスターをシャットダウンします。 + +Azure Databricks を調べ終わったら、作成したリソースを削除できます。これにより、不要な Azure コストが生じないようになり、サブスクリプションの容量も解放されます。 diff --git a/Instructions/Exercises/DE-06-Implement-data-privacy.md b/Instructions/Exercises/DE-06-Implement-data-privacy.md new file mode 100644 index 0000000..fe8f22c --- /dev/null +++ b/Instructions/Exercises/DE-06-Implement-data-privacy.md @@ -0,0 +1,189 @@ +--- +lab: + title: Azure Databricks で Microsoft Purview と Unity Catalog を使用したデータ プライバシーとガバナンスの実装 +--- + +# Azure Databricks で Microsoft Purview と Unity Catalog を使用したデータ プライバシーとガバナンスの実装 + +Microsoft Purview を使用すると、データ資産全体にわたる包括的なデータ ガバナンスを実現し、Azure Databricks とシームレスに統合して Lakehouse データを管理し、メタデータをデータ マップに取り込むことができます。 Unity Catalog では、データ管理とガバナンスを一元化することでこれを強化し、Databricks ワークスペース全体のセキュリティとコンプライアンスを簡素化します。 + +このラボは完了するまで、約 **30** 分かかります。 + +## Azure Databricks ワークスペースをプロビジョニングする + +> **ヒント**: 既に Azure Databricks ワークスペースがある場合は、この手順をスキップして、既存のワークスペースを使用できます。 + +この演習には、新しい Azure Databricks ワークスペースをプロビジョニングするスクリプトが含まれています。 このスクリプトは、この演習で必要なコンピューティング コアに対する十分なクォータが Azure サブスクリプションにあるリージョンに、*Premium* レベルの Azure Databricks ワークスペース リソースを作成しようとします。また、使用するユーザー アカウントのサブスクリプションに、Azure Databricks ワークスペース リソースを作成するための十分なアクセス許可があることを前提としています。 十分なクォータやアクセス許可がないためにスクリプトが失敗した場合は、[Azure portal で、Azure Databricks ワークスペースを対話形式で作成](https://learn.microsoft.com/azure/databricks/getting-started/#--create-an-azure-databricks-workspace)してみてください。 + +1. Web ブラウザーで、`https://portal.azure.com` の [Azure portal](https://portal.azure.com) にサインインします。 + +2. ページ上部の検索バーの右側にある **[\>_]** ボタンを使用して、Azure portal に新しい Cloud Shell を作成します。メッセージが表示されたら、***PowerShell*** 環境を選んで、ストレージを作成します。 次に示すように、Azure portal の下部にあるペインに、Cloud Shell のコマンド ライン インターフェイスが表示されます。 + + ![Azure portal と Cloud Shell のペイン](./images/cloud-shell.png) + + > **注**: 前に *Bash* 環境を使ってクラウド シェルを作成している場合は、そのクラウド シェル ペインの左上にあるドロップダウン メニューを使って、***PowerShell*** に変更します。 + +3. ペインの上部にある区分線をドラッグして Cloud Shell のサイズを変更したり、ペインの右上にある **—** 、 **◻** 、**X** アイコンを使用して、ペインを最小化または最大化したり、閉じたりすることができます。 Azure Cloud Shell の使い方について詳しくは、[Azure Cloud Shell のドキュメント](https://docs.microsoft.com/azure/cloud-shell/overview)をご覧ください。 + +4. PowerShell のペインで、次のコマンドを入力して、リポジトリを複製します。 + + ```powershell + rm -r mslearn-databricks -f + git clone https://github.com/MicrosoftLearning/mslearn-databricks + ``` + +5. リポジトリをクローンした後、次のコマンドを入力して **setup.ps1** スクリプトを実行します。これにより、使用可能なリージョンに Azure Databricks ワークスペースがプロビジョニングされます。 + + ```powershell + ./mslearn-databricks/setup.ps1 + ``` + +6. メッセージが表示された場合は、使用するサブスクリプションを選択します (これは、複数の Azure サブスクリプションへのアクセス権を持っている場合にのみ行います)。 + +7. スクリプトが完了するまで待ちます。通常、約 5 分かかりますが、さらに時間がかかる場合もあります。 待っている間に、Azure Databricks ドキュメントの[Delta Lake の概要](https://docs.microsoft.com/azure/databricks/delta/delta-intro)に関する記事をご確認ください。 + +## クラスターの作成 + +Azure Databricks は、Apache Spark "クラスター" を使用して複数のノードでデータを並列に処理する分散処理プラットフォームです。** 各クラスターは、作業を調整するドライバー ノードと、処理タスクを実行するワーカー ノードで構成されています。 この演習では、ラボ環境で使用されるコンピューティング リソース (リソースが制約される場合がある) を最小限に抑えるために、*単一ノード* クラスターを作成します。 運用環境では、通常、複数のワーカー ノードを含むクラスターを作成します。 + +> **ヒント**: Azure Databricks ワークスペースに 13.3 LTS 以降のランタイム バージョンを持つクラスターが既にある場合は、それを使ってこの演習を完了し、この手順をスキップできます。 + +1. Azure portal で、スクリプトによって作成された **msl-*xxxxxxx*** リソース グループ (または既存の Azure Databricks ワークスペースを含むリソース グループ) に移動します + +1. Azure Databricks Service リソース (セットアップ スクリプトを使って作成した場合は、**databricks-*xxxxxxx*** という名前) を選択します。 + +1. Azure Databricks ワークスペースの [**概要**] ページで、[**ワークスペースの起動**] ボタンを使用して、新しいブラウザー タブで Azure Databricks ワークスペースを開きます。サインインを求められた場合はサインインします。 + + > **ヒント**: Databricks ワークスペース ポータルを使用すると、さまざまなヒントと通知が表示される場合があります。 これらは無視し、指示に従ってこの演習のタスクを完了してください。 + +1. 左側のサイドバーで、**[(+) 新規]** タスクを選択し、**[クラスター]** を選択します。 + +1. **[新しいクラスター]** ページで、次の設定を使用して新しいクラスターを作成します。 + - **クラスター名**: "ユーザー名の" クラスター (既定のクラスター名)** + - **ポリシー**:Unrestricted + - **クラスター モード**: 単一ノード + - **アクセス モード**: 単一ユーザー (*自分のユーザー アカウントを選択*) + - **Databricks Runtime のバージョン**: 13.3 LTS (Spark 3.4.1、Scala 2.12) 以降 + - **Photon Acceleration を使用する**: 選択済み + - **ノードの種類**: Standard_DS3_v2 + - **非アクティブ状態が ** *20* ** 分間続いた後終了する** + +1. クラスターが作成されるまで待ちます。 これには 1、2 分かかることがあります。 + + > **注**: クラスターの起動に失敗した場合、Azure Databricks ワークスペースがプロビジョニングされているリージョンでサブスクリプションのクォータが不足していることがあります。 詳細については、「[CPU コアの制限によってクラスターを作成できない](https://docs.microsoft.com/azure/databricks/kb/clusters/azure-core-limit)」を参照してください。 その場合は、ワークスペースを削除し、別のリージョンに新しいワークスペースを作成してみてください。 次のように、セットアップ スクリプトのパラメーターとしてリージョンを指定できます: `./mslearn-databricks/setup.ps1 eastus` + +## Unity Catalog を設定する + +Unity Catalog メタストアには、セキュリティ保護可能なオブジェクト (テーブル、ボリューム、外部の場所、共有など) とそのオブジェクトへのアクセスを制御するアクセス許可に関するメタデータが登録されます。 各メタストアでは、データを整理できる 3 レベルの名前空間 (`catalog`.`schema`.`table`) が公開されます。 組織が活動しているリージョンごとに、1 つのメタストアが存在する必要があります。 Unity Catalog を操作するには、ユーザーが自分のリージョンのメタストアに接続されているワークスペース上に存在する必要があります。 + +1. サイドバーで、**カタログ**を選択します。 + +2. カタログ エクスプローラーには、ワークスペース名を持つ既定の Unity Catalog (**databricks-*xxxxxxx*** (セットアップ スクリプトを使用して作成した場合) が存在する必要があります。 カタログを選択し、右側のウィンドウの上部にある **スキーマの作成**を選択します。 + +3. 新しいスキーマを **e コマース**と名付け、ワークスペースと共に作成したストレージ ロケーションを選択し、**[作成]** を選びます。 + +4. カタログを選択し、右側のウィンドウで **[ワークスペース]** タブを選択します。ワークスペースがそれに `Read & Write`アクセスできることを確認します。 + +## Azure Databricks にサンプル データを取り込む + +1. 次のサンプル データ ファイルのダウンロード。 + * [customers.csv](https://github.com/MicrosoftLearning/mslearn-databricks/raw/main/data/DE-05/customers.csv) + * [products.csv](https://github.com/MicrosoftLearning/mslearn-databricks/raw/main/data/DE-05/products.csv) + * [sales.csv](https://github.com/MicrosoftLearning/mslearn-databricks/raw/main/data/DE-05/sales.csv) + +2. Azure Databricks ワークスペースのカタログ エクスプローラーの上部で**+** を選択し、その後 **[データの追加]** を選択します。 + +3. 新しいウィンドウで、**[ファイルをボリュームにアップロード]** を選択します。 + +4. 新しいウィンドウで、`ecommerce`スキーマに移動し、それを展開して **[ボリュームの作成]** を選択します。 + +5. 新しいボリュームに **sample_data** と名前を付け、 **[作成]** を選択します。 + +6. 新しいボリュームを選択し、ファイル `customers.csv`、`products.csv`、`sales.csv` をアップロードします。 **[アップロード]** を選択します。 + +7. サイド バーで **[(+) 新規]** タスクを使用して、**Notebook** を作成します。 **[接続]** ドロップダウン リストで、まだ選択されていない場合はクラスターを選択します。 クラスターが実行されていない場合は、起動に 1 分ほどかかる場合があります。 + +8. ノートブックの最初のセルに、次のコードを入力し、CSV ファイルからテーブルを作成します。 + + ```python + # Load Customer Data + customers_df = spark.read.format("csv").option("header", "true").load("/Volumes/databricksxxxxxxx/ecommerce/sample_data/customers.csv") + customers_df.write.saveAsTable("ecommerce.customers") + + # Load Sales Data + sales_df = spark.read.format("csv").option("header", "true").load("/Volumes/databricksxxxxxxx/ecommerce/sample_data/sales.csv") + sales_df.write.saveAsTable("ecommerce.sales") + + # Load Product Data + products_df = spark.read.format("csv").option("header", "true").load("/Volumes/databricksxxxxxxx/ecommerce/sample_data/products.csv") + products_df.write.saveAsTable("ecommerce.products") + ``` + +>**注:** `.load` ファイル パスで、`databricksxxxxxxx` をカタログ名に置き換えます。 + +9. カタログ エクスプローラーで、`sample_data` ボリュームに移動し、その中に新しいテーブルがあることを確認します。 + +## Microsoft Purview を設定する + +Microsoft Purview は、組織がさまざまな環境でデータを管理およびセキュリティで保護するのに役立つ統合データ ガバナンス サービスです。 データ損失防止、情報保護、コンプライアンス管理などの機能を備えた Microsoft Purview には、そのライフサイクル全体を通じてデータを理解、管理、保護するためのツールが用意されています。 + +1. [Azure Portal](https://portal.azure.com/) に移動します。 + +2. **[リソースの作成]** を選択し、**Microsoft Purview** を検索します。 + +3. 次の設定を使って **Microsoft Purview** リソースを作成します。 + - **[サブスクリプション]**: *Azure サブスクリプションを選択します* + - **リソース グループ**: * Azure Databricks ワークスペースと同じリソース グループを選択します* + - **Microsoft Purview アカウント名**: *任意の一意の名前* + - **位置情報**: * Azure Databricks ワークスペースと同じリージョンを選択します* + +4. **[確認および作成]** を選択します。 検証を待ってから、**[作成]** を選択します。 + +5. デプロイが完了するまで待ちます。 次に、Azure portal でデプロイされた Azure OpenAI リソースに移動します。 + +6. Microsoft Purview ガバナンス ポータルで、サイドバーの **データマップ** セクションに移動します。 + +7. **[データソース]** ウィンドウで、**[登録]** を選びます。 + +8. **[データ ソースの登録]** ウィンドウで、**Azure Databricks** を検索して選択します。 **続行**を選択します。 + +9. データ ソースに一意の名前を付け、Azure Databricks ワークスペースを選択します。 **登録** を選択します。 + +## データ プライバシーとガバナンス ポリシーを実装する + +1. サイドバーの **データ マップ** セクションで、**[分類]** を選択します。 + +2. **[分類]** ウィンドウで、**[ + 新規]** を選択し、**PII** (個人を特定できる情報) という名前の新しい分類を作成します。 **[OK]** を選択します。 + +3. サイドバーで **[Data Catalog]** を選択し、**Customers** テーブルに移動します。 + +4. PII 分類を電子メールと電話の列に適用します。 + +5. Azure Databricks に移動し、以前に作成したノートブックを開きます。 + +6. 新しいセルで、次のコードを実行して、PII データへのアクセスを制限するデータ アクセス ポリシーを作成します。 + + ```sql + CREATE OR REPLACE TABLE ecommerce.customers ( + customer_id STRING, + name STRING, + email STRING, + phone STRING, + address STRING, + city STRING, + state STRING, + zip_code STRING, + country STRING + ) TBLPROPERTIES ('data_classification'='PII'); + + GRANT SELECT ON TABLE ecommerce.customers TO ROLE data_scientist; + REVOKE SELECT (email, phone) ON TABLE ecommerce.customers FROM ROLE data_scientist; + ``` + +7. data_scientist ロールを持つユーザーとして、顧客テーブルのクエリを試みます。 PII 列 (電子メールと電話) へのアクセスが制限されていることを確認します。 + +## クリーンアップ + +Azure Databricks ポータルの **[コンピューティング]** ページでクラスターを選択し、**[■ 終了]** を選択してクラスターをシャットダウンします。 + +Azure Databricks を調べ終わったら、作成したリソースを削除できます。これにより、不要な Azure コストが生じないようになり、サブスクリプションの容量も解放されます。 diff --git a/Instructions/Exercises/LA-01-Explore-Azure-Databricks.md b/Instructions/Exercises/LA-01-Explore-Azure-Databricks.md new file mode 100644 index 0000000..8fc5022 --- /dev/null +++ b/Instructions/Exercises/LA-01-Explore-Azure-Databricks.md @@ -0,0 +1,118 @@ +--- +lab: + title: Azure Databricks を探索する +--- + +# Azure Databricks を探索する + +Azure Databricks は、一般的なオープンソース Databricks プラットフォームの Microsoft Azure ベースのバージョンです。 + +Azure Synapse Analytics と同様に、Azure Databricks の "ワークスペース" は、Azure 上の Databricks クラスター、データ、およびリソースを管理するための中心点を提供します。** + +この演習の所要時間は約 **20** 分です。 + +## Azure Databricks ワークスペースをプロビジョニングする + +> **ヒント**: 既に Azure Databricks ワークスペースがある場合は、この手順をスキップして、既存のワークスペースを使用できます。 + +この演習には、新しい Azure Databricks ワークスペースをプロビジョニングするスクリプトが含まれています。 このスクリプトは、この演習で必要なコンピューティング コアに対する十分なクォータが Azure サブスクリプションにあるリージョンに、*Premium* レベルの Azure Databricks ワークスペース リソースを作成しようとします。また、使用するユーザー アカウントのサブスクリプションに、Azure Databricks ワークスペース リソースを作成するための十分なアクセス許可があることを前提としています。 十分なクォータやアクセス許可がないためにスクリプトが失敗した場合は、[Azure portal で、Azure Databricks ワークスペースを対話形式で作成](https://learn.microsoft.com/azure/databricks/getting-started/#--create-an-azure-databricks-workspace)してみてください。 + +1. Web ブラウザーで、`https://portal.azure.com` の [Azure portal](https://portal.azure.com) にサインインします。 +2. ページ上部の検索バーの右側にある **[\>_]** ボタンを使用して、Azure portal に新しい Cloud Shell を作成します。メッセージが表示されたら、***PowerShell*** 環境を選んで、ストレージを作成します。 次に示すように、Azure portal の下部にあるペインに、Cloud Shell のコマンド ライン インターフェイスが表示されます。 + + ![Azure portal と Cloud Shell のペイン](./images/cloud-shell.png) + + > **注**: 前に *Bash* 環境を使ってクラウド シェルを作成している場合は、そのクラウド シェル ペインの左上にあるドロップダウン メニューを使って、***PowerShell*** に変更します。 + +3. ペインの上部にある区分線をドラッグして Cloud Shell のサイズを変更したり、ペインの右上にある **—** 、 **◻** 、**X** アイコンを使用して、ペインを最小化または最大化したり、閉じたりすることができます。 Azure Cloud Shell の使い方について詳しくは、[Azure Cloud Shell のドキュメント](https://docs.microsoft.com/azure/cloud-shell/overview)をご覧ください。 + +4. PowerShell のペインで、次のコマンドを入力して、リポジトリを複製します。 + + ``` + rm -r mslearn-databricks -f + git clone https://github.com/MicrosoftLearning/mslearn-databricks + ``` + +5. リポジトリをクローンした後、次のコマンドを入力して **setup.ps1** スクリプトを実行します。これにより、使用可能なリージョンに Azure Databricks ワークスペースがプロビジョニングされます。 + + ``` + ./mslearn-databricks/setup.ps1 + ``` + +6. メッセージが表示された場合は、使用するサブスクリプションを選択します (これは、複数の Azure サブスクリプションへのアクセス権を持っている場合にのみ行います)。 +7. スクリプトの完了まで待ちます。通常、約 5 分かかりますが、さらに時間がかかる場合もあります。 待っている間に、Azure Databricks ドキュメントの記事「[Azure Databricks とは](https://learn.microsoft.com/azure/databricks/introduction/)」を確認してください。 + +## クラスターの作成 + +Azure Databricks は、Apache Spark "クラスター" を使用して複数のノードでデータを並列に処理する分散処理プラットフォームです。** 各クラスターは、作業を調整するドライバー ノードと、処理タスクを実行するワーカー ノードで構成されています。 この演習では、ラボ環境で使用されるコンピューティング リソース (リソースが制約される場合がある) を最小限に抑えるために、*単一ノード* クラスターを作成します。 運用環境では、通常、複数のワーカー ノードを含むクラスターを作成します。 + +> **ヒント**: Azure Databricks ワークスペースに 13.3 LTS 以降のランタイム バージョンを持つクラスターが既にある場合は、それを使ってこの演習を完了し、この手順をスキップできます。 + +1. Azure portal で、スクリプトによって作成された **msl-*xxxxxxx*** リソース グループ (または既存の Azure Databricks ワークスペースを含むリソース グループ) に移動します +1. Azure Databricks Service リソース (セットアップ スクリプトを使って作成した場合は、**databricks-*xxxxxxx*** という名前) を選択します。 +1. Azure Databricks ワークスペースの [**概要**] ページで、[**ワークスペースの起動**] ボタンを使用して、新しいブラウザー タブで Azure Databricks ワークスペースを開きます。サインインを求められた場合はサインインします。 + + > **ヒント**: Databricks ワークスペース ポータルを使用すると、さまざまなヒントと通知が表示される場合があります。 これらは無視し、指示に従ってこの演習のタスクを完了してください。 + +1. 左側のサイドバーで、**[(+) 新規]** タスクを選択し、**[クラスター]** を選択します。 +1. **[新しいクラスター]** ページで、次の設定を使用して新しいクラスターを作成します。 + - **クラスター名**: "ユーザー名の" クラスター (既定のクラスター名)** + - **ポリシー**:Unrestricted + - **クラスター モード**: 単一ノード + - **アクセス モード**: 単一ユーザー (*自分のユーザー アカウントを選択*) + - **Databricks Runtime のバージョン**: 13.3 LTS (Spark 3.4.1、Scala 2.12) 以降 + - **Photon Acceleration を使用する**: 選択済み + - **ノードの種類**: Standard_DS3_v2 + - **非アクティブ状態が ** *20* ** 分間続いた後終了する** + +1. クラスターが作成されるまで待ちます。 これには 1、2 分かかることがあります。 + +> **注**: クラスターの起動に失敗した場合、Azure Databricks ワークスペースがプロビジョニングされているリージョンでサブスクリプションのクォータが不足していることがあります。 詳細については、「[CPU コアの制限によってクラスターを作成できない](https://docs.microsoft.com/azure/databricks/kb/clusters/azure-core-limit)」を参照してください。 その場合は、ワークスペースを削除し、別のリージョンに新しいワークスペースを作成してみてください。 次のように、セットアップ スクリプトのパラメーターとしてリージョンを指定できます: `./mslearn-databricks/setup.ps1 eastus` + +## Spark を使用してデータを分析する + +多くの Spark 環境と同様に、Databricks では、ノートブックを使用して、データの探索に使用できるノートと対話型のコード セルを組み合わせることができます。 + +1. [**products.csv**](https://raw.githubusercontent.com/MicrosoftLearning/mslearn-databricks/main/data/products.csv) ファイルを `https://raw.githubusercontent.com/MicrosoftLearning/mslearn-databricks/main/data/products.csv` からローカル コンピューターにダウンロードし、**products.csv** として保存します。 +1. サイドバーの **[(+) 新規]** リンク メニューで、**[ファイル アップロード]** を選択します。 +1. コンピューターにダウンロードした **products.csv** ファイルをアップロードします。 +1. **[ファイル アップロードからのテーブルの作成または変更]** ページで、ページの右上でクラスターが選択されていることを確認します。 次に、**hive_metastore** カタログとその既定のスキーマを選択して、**products** という名前の新しいテーブルを作成します。 +1. **[カタログ エクスプローラー]** ページで、**products** ページが作成されたら、**[作成]** ボタン メニューで、**[ノートブック]** を選択してノートブックを作成します。 +1. ノートブックで、ノートブックがクラスターに接続されていることを確認し、最初のセルに自動的に追加されたコードを確認します。これは次のようになるはずです。 + + ```python + %sql + SELECT * FROM `hive_metastore`.`default`.`products`; + ``` + +1. セルの左側にある **[▸ セルの実行]** メニュー オプションを使用してセルを実行し、ダイアログが表示されたらクラスターを起動してアタッチします。 +1. コードによって実行される Spark ジョブが完了するまで待ちます。 このコードは、アップロードしたファイルに基づいて作成されたテーブルからデータを取得します。 +1. 結果の表の上にある **[+]** 、 **[視覚化]** の順に選択して視覚化エディターを表示し、次のオプションを適用します。 + - **視覚化の種類**: 横棒 + - **X 列**: カテゴリ + - **Y 列**: "新しい列を追加し、" **ProductID** "を選択します"。** **Count** "集計を適用します"。** ** + + 視覚化を保存し、次のようにノートブックに表示されることを確認します。 + + ![カテゴリ別の製品数を示す横棒グラフ](./images/databricks-chart.png) + +## データフレームを使用してデータを分析する + +ほとんどのデータ分析では、前の例のような SQL コードの使用で十分ですが、一部のデータ アナリストやデータ サイエンティストは、データを効率的に操作するために、*PySpark* (Python の Spark 最適化バージョン) などのプログラミング言語における "データフレーム" などのネイティブ Spark オブジェクトを使用する可能性があります。** + +1. ノートブックで、先ほど実行したコード セルのグラフ出力の下で、**+** アイコンを使用して新しいセルを追加します。 +1. この新しいセルに次のコードを入力して実行します。 + + ```python + df = spark.sql("SELECT * FROM products") + df = df.filter("Category == 'Road Bikes'") + display(df) + ``` + +1. "ロード バイク" カテゴリの製品を返す新しいセルを実行します。** + +## クリーンアップ + +Azure Databricks ポータルの **[コンピューティング]** ページでクラスターを選択し、**[■ 終了]** を選択してクラスターをシャットダウンします。 + +Azure Databricks を調べ終わったら、作成したリソースを削除できます。これにより、不要な Azure コストが生じないようになり、サブスクリプションの容量も解放されます。 diff --git a/Instructions/Exercises/LA-02-Explore-data.md b/Instructions/Exercises/LA-02-Explore-data.md new file mode 100644 index 0000000..ff3f732 --- /dev/null +++ b/Instructions/Exercises/LA-02-Explore-data.md @@ -0,0 +1,302 @@ +--- +lab: + title: Azure Databricks を使用したデータ探索 +--- + +# Azure Databricks を使用したデータ探索 + +Azure Databricks は、一般的なオープンソース Databricks プラットフォームの Microsoft Azure ベースのバージョンです。 + +Azure Databricks を使用すると、探索的データ分析 (EDA) が容易になり、ユーザーは分析情報をすばやく検出し、意思決定を促すことができます。 + +統計手法や視覚化など、EDA のさまざまなツールや手法と統合して、データ特性を要約し、基になる問題を特定します。 + +この演習の所要時間は約 **45** 分です。 + +## Azure Databricks ワークスペースをプロビジョニングする + +> **ヒント**: 既に Azure Databricks ワークスペースがある場合は、この手順をスキップして、既存のワークスペースを使用できます。 + +この演習には、新しい Azure Databricks ワークスペースをプロビジョニングするスクリプトが含まれています。 このスクリプトは、この演習で必要なコンピューティング コアに対する十分なクォータが Azure サブスクリプションにあるリージョンに、*Premium* レベルの Azure Databricks ワークスペース リソースを作成しようとします。また、使用するユーザー アカウントのサブスクリプションに、Azure Databricks ワークスペース リソースを作成するための十分なアクセス許可があることを前提としています。 + +十分なクォータやアクセス許可がないためにスクリプトが失敗した場合は、[Azure portal で、Azure Databricks ワークスペースを対話形式で作成](https://learn.microsoft.com/azure/databricks/getting-started/#--create-an-azure-databricks-workspace)してみてください。 + +1. Web ブラウザーで、`https://portal.azure.com` の [Azure portal](https://portal.azure.com) にサインインします。 +2. ページ上部の検索バーの右側にある **[\>_]** ボタンを使用して、Azure portal に新しい Cloud Shell を作成します。メッセージが表示されたら、***PowerShell*** 環境を選んで、ストレージを作成します。 次に示すように、Azure portal の下部にあるペインに、Cloud Shell のコマンド ライン インターフェイスが表示されます。 + + ![Azure portal と Cloud Shell のペイン](./images/cloud-shell.png) + + > **注**: 前に *Bash* 環境を使ってクラウド シェルを作成している場合は、そのクラウド シェル ペインの左上にあるドロップダウン メニューを使って、***PowerShell*** に変更します。 + +3. ペインの上部にある区分線をドラッグして Cloud Shell のサイズを変更したり、ペインの右上にある **—** 、 **◻** 、**X** アイコンを使用して、ペインを最小化または最大化したり、閉じたりすることができます。 Azure Cloud Shell の使い方について詳しくは、[Azure Cloud Shell のドキュメント](https://docs.microsoft.com/azure/cloud-shell/overview)をご覧ください。 + +4. PowerShell のペインで、次のコマンドを入力して、リポジトリを複製します。 + + ``` + rm -r mslearn-databricks -f + git clone https://github.com/MicrosoftLearning/mslearn-databricks + ``` + +5. リポジトリをクローンした後、次のコマンドを入力して **setup.ps1** スクリプトを実行します。これにより、使用可能なリージョンに Azure Databricks ワークスペースがプロビジョニングされます。 + + ``` + ./mslearn-databricks/setup.ps1 + ``` + +6. メッセージが表示された場合は、使用するサブスクリプションを選択します (これは、複数の Azure サブスクリプションへのアクセス権を持っている場合にのみ行います)。 +7. スクリプトの完了まで待ちます。通常、約 5 分かかりますが、さらに時間がかかる場合もあります。 待っている間に、Azure Databricks ドキュメントの記事「[Azure Databricks での探索的データ分析](https://learn.microsoft.com/azure/databricks/exploratory-data-analysis/)」を確認してください。 + +## クラスターの作成 + +Azure Databricks は、Apache Spark "クラスター" を使用して複数のノードでデータを並列に処理する分散処理プラットフォームです。** 各クラスターは、作業を調整するドライバー ノードと、処理タスクを実行するワーカー ノードで構成されています。 + +この演習では、ラボ環境で使用されるコンピューティング リソース (リソースが制約される場合がある) を最小限に抑えるために、*単一ノード* クラスターを作成します。 運用環境では、通常、複数のワーカー ノードを含むクラスターを作成します。 + +> **ヒント**: Azure Databricks ワークスペースに 13.3 LTS 以降のランタイム バージョンを持つクラスターが既にある場合は、それを使ってこの演習を完了し、この手順をスキップできます。 + +1. Azure portal で、スクリプトによって作成された **msl-*xxxxxxx*** リソース グループ (または既存の Azure Databricks ワークスペースを含むリソース グループ) に移動します +1. Azure Databricks Service リソース (セットアップ スクリプトを使って作成した場合は、**databricks-*xxxxxxx*** という名前) を選択します。 +1. Azure Databricks ワークスペースの [**概要**] ページで、[**ワークスペースの起動**] ボタンを使用して、新しいブラウザー タブで Azure Databricks ワークスペースを開きます。サインインを求められた場合はサインインします。 + + > **ヒント**: Databricks ワークスペース ポータルを使用すると、さまざまなヒントと通知が表示される場合があります。 これらは無視し、指示に従ってこの演習のタスクを完了してください。 + +1. 左側のサイドバーで、**[(+) 新規]** タスクを選択し、**[クラスター]** を選択します。 +1. **[新しいクラスター]** ページで、次の設定を使用して新しいクラスターを作成します。 + - **クラスター名**: "ユーザー名の" クラスター (既定のクラスター名)** + - **ポリシー**:Unrestricted + - **クラスター モード**: 単一ノード + - **アクセス モード**: 単一ユーザー (*自分のユーザー アカウントを選択*) + - **Databricks Runtime のバージョン**: 13.3 LTS (Spark 3.4.1、Scala 2.12) 以降 + - **Photon Acceleration を使用する**: 選択済み + - **ノードの種類**: Standard_DS3_v2 + - **非アクティブ状態が ** *20* ** 分間続いた後終了する** + +1. クラスターが作成されるまで待ちます。 これには 1、2 分かかることがあります。 + +> **注**: クラスターの起動に失敗した場合、Azure Databricks ワークスペースがプロビジョニングされているリージョンでサブスクリプションのクォータが不足していることがあります。 詳細については、「[CPU コアの制限によってクラスターを作成できない](https://docs.microsoft.com/azure/databricks/kb/clusters/azure-core-limit)」を参照してください。 その場合は、ワークスペースを削除し、別のリージョンに新しいワークスペースを作成してみてください。 次のように、セットアップ スクリプトのパラメーターとしてリージョンを指定できます: `./mslearn-databricks/setup.ps1 eastus` + +## ノートブックを作成する + +1. サイド バーで **[(+) 新規]** タスクを使用して、**Notebook** を作成します。 + +1. 既定のノートブック名 (**無題のノートブック *[日付]***) を "**Spark を使用したデータの探索**" に変更し、**[接続]** ドロップダウン リストでクラスターを選択します (まだ選択されていない場合)。 クラスターが実行されていない場合は、起動に 1 分ほどかかる場合があります。 + +## データの取り込み + +1. ノートブックの最初のセルに次のコードを入力します。このコードは、"シェル" コマンドを使用して、GitHub からクラスターで使用されるファイル システムにデータ ファイルをダウンロードします。** + + ```python + %sh + rm -r /dbfs/spark_lab + mkdir /dbfs/spark_lab + wget -O /dbfs/spark_lab/2019.csv https://raw.githubusercontent.com/MicrosoftLearning/mslearn-databricks/main/data/2019.csv + wget -O /dbfs/spark_lab/2020.csv https://raw.githubusercontent.com/MicrosoftLearning/mslearn-databricks/main/data/2020.csv + wget -O /dbfs/spark_lab/2021.csv https://raw.githubusercontent.com/MicrosoftLearning/mslearn-databricks/main/data/2021.csv + ``` + +1. セルの左側にある **[▸ セルの実行]** メニュー オプションを使用して実行を行います。 そして、コードによって実行される Spark ジョブが完了するまで待ちます。 + +## ファイル内のデータのクエリを実行する + +1. 既存のコード セルの下で、 **[+]** アイコンを使用して新しいコード セルを追加します。 次に、新しいセルに次のコードを入力して実行し、ファイルからデータを読み込み、最初の 100 行を表示します。 + + ```python + df = spark.read.load('spark_lab/*.csv', format='csv') + display(df.limit(100)) + ``` + +1. 出力を確認し、ファイル内のデータが販売注文に関連しているが、列ヘッダーやデータ型に関する情報が含まれていないことに注意してください。 データの意味をよりわかりやすくするために、データフレームの "*スキーマ*" を定義できます。 + +1. 新しいコード セルを追加し、それを使用して次のコードを実行します。これによりデータのスキーマが定義されます。 + + ```python + from pyspark.sql.types import * + from pyspark.sql.functions import * + orderSchema = StructType([ + StructField("SalesOrderNumber", StringType()), + StructField("SalesOrderLineNumber", IntegerType()), + StructField("OrderDate", DateType()), + StructField("CustomerName", StringType()), + StructField("Email", StringType()), + StructField("Item", StringType()), + StructField("Quantity", IntegerType()), + StructField("UnitPrice", FloatType()), + StructField("Tax", FloatType()) + ]) + df = spark.read.load('/spark_lab/*.csv', format='csv', schema=orderSchema) + display(df.limit(100)) + ``` + +1. 今回は、データフレームに列ヘッダーが含まれていることを確認します。 次に、新しいコード セルを追加し、それを使用して次のコードを実行することでデータフレーム スキーマの詳細を表示し、正しいデータ型が適用されていることを確認します。 + + ```python + df.printSchema() + ``` + +## Spark SQL を使用してデータのクエリを実行する + +1. 新しいコード セルを追加し、それを使用して次のコードを実行します。 + + ```python + df.createOrReplaceTempView("salesorders") + spark_df = spark.sql("SELECT * FROM salesorders") + display(spark_df) + ``` + + 前に使用したデータフレーム オブジェクトのネイティブ メソッドを使用すると、データに対するクエリの実行と分析を非常に効率的に行うことができます。 ただし、SQL 構文の方が扱いやすいと考えるデータ アナリストも多くいます。 Spark SQL は、Spark の SQL 言語 API であり、SQL ステートメントの実行だけではなく、リレーショナル テーブル内でのデータの永続化にも使用できます。 + + 先ほど実行したコードでは、データフレームのデータのリレーショナル "*ビュー*" が作成された後、**spark.sql** ライブラリを使って Python コード内に Spark SQL 構文が埋め込まれ、ビューに対してクエリが実行され、結果がデータフレームとして返されます。 + +## 結果を視覚化として表示する + +1. 新しいコード セルで次のコードを実行して、**salesorders** テーブルに対してクエリを実行します。 + + ```sql + %sql + + SELECT * FROM salesorders + ``` + +1. 結果の表の上にある **[+]** 、 **[視覚化]** の順に選択して視覚化エディターを表示し、次のオプションを適用します。 + - **視覚化の種類**: 横棒 + - **X 列**: 項目 + - **Y 列**: *新しい列を追加し、***数量**を選択します。 ****合計***集計を適用します*。 + +1. 視覚化を保存し、コード セルを再実行して、結果のグラフをノートブックに表示します。 + +## matplotlib の使用を開始する + +1. 新しいコード セルで、次のコードを実行して、販売注文データをいくつか取得してデータフレームに取り込みます。 + + ```python + sqlQuery = "SELECT CAST(YEAR(OrderDate) AS CHAR(4)) AS OrderYear, \ + SUM((UnitPrice * Quantity) + Tax) AS GrossRevenue \ + FROM salesorders \ + GROUP BY CAST(YEAR(OrderDate) AS CHAR(4)) \ + ORDER BY OrderYear" + df_spark = spark.sql(sqlQuery) + df_spark.show() + ``` + +1. 新しいコード セルを追加し、それを使用して次のコードを実行します。これにより **matplotlb** がインポートされ、それを使用してグラフが作成されます。 + + ```python + from matplotlib import pyplot as plt + + # matplotlib requires a Pandas dataframe, not a Spark one + df_sales = df_spark.toPandas() + # Create a bar plot of revenue by year + plt.bar(x=df_sales['OrderYear'], height=df_sales['GrossRevenue']) + # Display the plot + plt.show() + ``` + +1. 結果を確認します。結果には、各年の総収益が縦棒グラフで示されています。 このグラフの生成に使用されているコードの次の機能に注目してください。 + - **matplotlib** ライブラリには Pandas データフレームが必要であるため、Spark SQL クエリによって返される Spark データフレームをこの形式に変換する必要があります。 + - **matplotlib** ライブラリの中核となるのは、**pyplot** オブジェクトです。 これは、ほとんどのプロット機能の基礎となります。 + +1. 既定の設定では、使用可能なグラフが生成されますが、カスタマイズすべき範囲が大幅に増えます。 新しいコード セルを追加して次のコードを含め、それを実行します。 + + ```python + # Clear the plot area + plt.clf() + # Create a bar plot of revenue by year + plt.bar(x=df_sales['OrderYear'], height=df_sales['GrossRevenue'], color='orange') + # Customize the chart + plt.title('Revenue by Year') + plt.xlabel('Year') + plt.ylabel('Revenue') + plt.grid(color='#95a5a6', linestyle='--', linewidth=2, axis='y', alpha=0.7) + plt.xticks(rotation=45) + # Show the figure + plt.show() + ``` + +1. プロットは、技術的に**図**に含まれています。 前の例では、図が暗黙的に作成されていましたが、明示的に作成することもできます。 新しいセルで次を実行してみます。 + + ```python + # Clear the plot area + plt.clf() + # Create a Figure + fig = plt.figure(figsize=(8,3)) + # Create a bar plot of revenue by year + plt.bar(x=df_sales['OrderYear'], height=df_sales['GrossRevenue'], color='orange') + # Customize the chart + plt.title('Revenue by Year') + plt.xlabel('Year') + plt.ylabel('Revenue') + plt.grid(color='#95a5a6', linestyle='--', linewidth=2, axis='y', alpha=0.7) + plt.xticks(rotation=45) + # Show the figure + plt.show() + ``` + +1. 図には複数のサブプロットが含まれており、それぞれに独自の "軸" があります。 このコードを使用して複数のグラフを作成します。 + + ```python + # Clear the plot area + plt.clf() + # Create a figure for 2 subplots (1 row, 2 columns) + fig, ax = plt.subplots(1, 2, figsize = (10,4)) + # Create a bar plot of revenue by year on the first axis + ax[0].bar(x=df_sales['OrderYear'], height=df_sales['GrossRevenue'], color='orange') + ax[0].set_title('Revenue by Year') + # Create a pie chart of yearly order counts on the second axis + yearly_counts = df_sales['OrderYear'].value_counts() + ax[1].pie(yearly_counts) + ax[1].set_title('Orders per Year') + ax[1].legend(yearly_counts.keys().tolist()) + # Add a title to the Figure + fig.suptitle('Sales Data') + # Show the figure + plt.show() + ``` + +> **注**: matplotlib を使用したプロットの詳細については、[matplotlib のドキュメント](https://matplotlib.org/)を参照してください。 + +## seaborn ライブラリを使用する + +1. 新しいコード セルを追加し、それを使用して次のコードを実行します。これにより **seaborn** ライブラリ (matplotlib 上に構築され、その複雑さの一部が抽象化されている) を使用してグラフが作成されます。 + + ```python + import seaborn as sns + + # Clear the plot area + plt.clf() + # Create a bar chart + ax = sns.barplot(x="OrderYear", y="GrossRevenue", data=df_sales) + plt.show() + ``` + +1. **seaborn** ライブラリを使用すると、統計データの複雑なプロットの作成が容易になり、一貫性のあるデータ視覚化を実現するためにビジュアル テーマを制御できます。 新しいセルで次のコードを実行します。 + + ```python + # Clear the plot area + plt.clf() + + # Set the visual theme for seaborn + sns.set_theme(style="whitegrid") + + # Create a bar chart + ax = sns.barplot(x="OrderYear", y="GrossRevenue", data=df_sales) + plt.show() + ``` + +1. matplotlib と同様、 seaborn では複数のグラフの種類がサポートされています。 次のコードを実行して、折れ線グラフを作成します。 + + ```python + # Clear the plot area + plt.clf() + + # Create a bar chart + ax = sns.lineplot(x="OrderYear", y="GrossRevenue", data=df_sales) + plt.show() + ``` + +> **注**: seaborn を使用したプロットの詳細については、[seaborn のドキュメント](https://seaborn.pydata.org/index.html)を参照してください。 + +## クリーンアップ + +Azure Databricks ポータルの **[コンピューティング]** ページでクラスターを選択し、**[■ 終了]** を選択してクラスターをシャットダウンします。 + +Azure Databricks を調べ終わったら、作成したリソースを削除できます。これにより、不要な Azure コストが生じないようになり、サブスクリプションの容量も解放されます。 diff --git a/Instructions/Exercises/LA-03-Transform-data.md b/Instructions/Exercises/LA-03-Transform-data.md new file mode 100644 index 0000000..f359d61 --- /dev/null +++ b/Instructions/Exercises/LA-03-Transform-data.md @@ -0,0 +1,211 @@ +--- +lab: + title: Azure Databricks で Apache Spark を使用してデータを変換する +--- + +# Azure Databricks で Apache Spark を使用してデータを変換する + +Azure Databricks は、一般的なオープンソース Databricks プラットフォームの Microsoft Azure ベースのバージョンです。 + +Azure Databricks は Apache Spark 上に構築されており、ファイル内のデータの操作を伴うデータ エンジニアリングおよび分析タスクに対して非常にスケーラブルなソリューションを提供します。 + +Azure Databricks の一般的なデータ変換タスクには、データのクリーニング、集計の実行、型キャストなどがあります。 これらの変換は、分析のためのデータ準備に不可欠であり、大規模な ETL (抽出、変換、読み込み) プロセスの一部です。 + +この演習の所要時間は約 **30** 分です。 + +## Azure Databricks ワークスペースをプロビジョニングする + +> **ヒント**: 既に Azure Databricks ワークスペースがある場合は、この手順をスキップして、既存のワークスペースを使用できます。 + +この演習には、新しい Azure Databricks ワークスペースをプロビジョニングするスクリプトが含まれています。 このスクリプトは、この演習で必要なコンピューティング コアに対する十分なクォータが Azure サブスクリプションにあるリージョンに、*Premium* レベルの Azure Databricks ワークスペース リソースを作成しようとします。また、使用するユーザー アカウントのサブスクリプションに、Azure Databricks ワークスペース リソースを作成するための十分なアクセス許可があることを前提としています。 十分なクォータやアクセス許可がないためにスクリプトが失敗した場合は、[Azure portal で、Azure Databricks ワークスペースを対話形式で作成](https://learn.microsoft.com/azure/databricks/getting-started/#--create-an-azure-databricks-workspace)してみてください。 + +1. Web ブラウザーで、`https://portal.azure.com` の [Azure portal](https://portal.azure.com) にサインインします。 +2. ページ上部の検索バーの右側にある **[\>_]** ボタンを使用して、Azure portal に新しい Cloud Shell を作成します。メッセージが表示されたら、***PowerShell*** 環境を選んで、ストレージを作成します。 次に示すように、Azure portal の下部にあるペインに、Cloud Shell のコマンド ライン インターフェイスが表示されます。 + + ![Azure portal と Cloud Shell のペイン](./images/cloud-shell.png) + + > **注**: 前に *Bash* 環境を使ってクラウド シェルを作成している場合は、そのクラウド シェル ペインの左上にあるドロップダウン メニューを使って、***PowerShell*** に変更します。 + +3. ペインの上部にある区分線をドラッグして Cloud Shell のサイズを変更したり、ペインの右上にある **—** 、 **◻** 、**X** アイコンを使用して、ペインを最小化または最大化したり、閉じたりすることができます。 Azure Cloud Shell の使い方について詳しくは、[Azure Cloud Shell のドキュメント](https://docs.microsoft.com/azure/cloud-shell/overview)をご覧ください。 + +4. PowerShell のペインで、次のコマンドを入力して、リポジトリを複製します。 + + ``` + rm -r mslearn-databricks -f + git clone https://github.com/MicrosoftLearning/mslearn-databricks + ``` + +5. リポジトリをクローンした後、次のコマンドを入力して **setup.ps1** スクリプトを実行します。これにより、使用可能なリージョンに Azure Databricks ワークスペースがプロビジョニングされます。 + + ``` + ./mslearn-databricks/setup.ps1 + ``` + +6. メッセージが表示された場合は、使用するサブスクリプションを選択します (これは、複数の Azure サブスクリプションへのアクセス権を持っている場合にのみ行います)。 +7. スクリプトの完了まで待ちます。通常、約 5 分かかりますが、さらに時間がかかる場合もあります。 待っている間に、Azure Databricks ドキュメントの記事「[Azure Databricks での探索的データ分析](https://learn.microsoft.com/azure/databricks/exploratory-data-analysis/)」を確認してください。 + +## クラスターの作成 + +Azure Databricks は、Apache Spark "クラスター" を使用して複数のノードでデータを並列に処理する分散処理プラットフォームです。** 各クラスターは、作業を調整するドライバー ノードと、処理タスクを実行するワーカー ノードで構成されています。 この演習では、ラボ環境で使用されるコンピューティング リソース (リソースが制約される場合がある) を最小限に抑えるために、*単一ノード* クラスターを作成します。 運用環境では、通常、複数のワーカー ノードを含むクラスターを作成します。 + +> **ヒント**: Azure Databricks ワークスペースに 13.3 LTS 以降のランタイム バージョンを持つクラスターが既にある場合は、それを使ってこの演習を完了し、この手順をスキップできます。 + +1. Azure portal で、スクリプトによって作成された **msl-*xxxxxxx*** リソース グループ (または既存の Azure Databricks ワークスペースを含むリソース グループ) に移動します +2. Azure Databricks Service リソース (セットアップ スクリプトを使って作成した場合は、**databricks-*xxxxxxx*** という名前) を選択します。 +3. Azure Databricks ワークスペースの [**概要**] ページで、[**ワークスペースの起動**] ボタンを使用して、新しいブラウザー タブで Azure Databricks ワークスペースを開きます。サインインを求められた場合はサインインします。 + + > **ヒント**: Databricks ワークスペース ポータルを使用すると、さまざまなヒントと通知が表示される場合があります。 これらは無視し、指示に従ってこの演習のタスクを完了してください。 + +4. 左側のサイドバーで、**[(+) 新規]** タスクを選択し、**[クラスター]** を選択します。 +5. **[新しいクラスター]** ページで、次の設定を使用して新しいクラスターを作成します。 + - **クラスター名**: "ユーザー名の" クラスター (既定のクラスター名)** + - **ポリシー**:Unrestricted + - **クラスター モード**: 単一ノード + - **アクセス モード**: 単一ユーザー (*自分のユーザー アカウントを選択*) + - **Databricks Runtime のバージョン**: 13.3 LTS (Spark 3.4.1、Scala 2.12) 以降 + - **Photon Acceleration を使用する**: 選択済み + - **ノードの種類**: Standard_DS3_v2 + - **非アクティブ状態が ** *20* ** 分間続いた後終了する** + +6. クラスターが作成されるまで待ちます。 これには 1、2 分かかることがあります。 + +> **注**: クラスターの起動に失敗した場合、Azure Databricks ワークスペースがプロビジョニングされているリージョンでサブスクリプションのクォータが不足していることがあります。 詳細については、「[CPU コアの制限によってクラスターを作成できない](https://docs.microsoft.com/azure/databricks/kb/clusters/azure-core-limit)」を参照してください。 その場合は、ワークスペースを削除し、別のリージョンに新しいワークスペースを作成してみてください。 次のように、セットアップ スクリプトのパラメーターとしてリージョンを指定できます: `./mslearn-databricks/setup.ps1 eastus` + +## ノートブックを作成する + +1. サイド バーで **[(+) 新規]** タスクを使用して、**Notebook** を作成します。 + +2. 既定のノートブック名 (**無題のノートブック *[日付]***) を "**Spark を使用したデータ変換**" に変更し、**[接続]** ドロップダウン リストでクラスターを選択します (まだ選択されていない場合)。 クラスターが実行されていない場合は、起動に 1 分ほどかかる場合があります。 + +## データの取り込み + +1. ノートブックの最初のセルに次のコードを入力します。このコードは、"シェル" コマンドを使用して、GitHub からクラスターで使用されるファイル システムにデータ ファイルをダウンロードします。** + + ```python + %sh + rm -r /dbfs/spark_lab + mkdir /dbfs/spark_lab + wget -O /dbfs/spark_lab/2019.csv https://raw.githubusercontent.com/MicrosoftLearning/mslearn-databricks/main/data/2019_edited.csv + wget -O /dbfs/spark_lab/2020.csv https://raw.githubusercontent.com/MicrosoftLearning/mslearn-databricks/main/data/2020_edited.csv + wget -O /dbfs/spark_lab/2021.csv https://raw.githubusercontent.com/MicrosoftLearning/mslearn-databricks/main/data/2021_edited.csv + ``` + +2. セルの左側にある **[▸ セルの実行]** メニュー オプションを使用して実行を行います。 そして、コードによって実行される Spark ジョブが完了するまで待ちます。 +3. 新しいコード セルを追加し、それを使用して次のコードを実行します。これによりデータのスキーマが定義されます。 + + ```python + from pyspark.sql.types import * + from pyspark.sql.functions import * + orderSchema = StructType([ + StructField("SalesOrderNumber", StringType()), + StructField("SalesOrderLineNumber", IntegerType()), + StructField("OrderDate", DateType()), + StructField("CustomerName", StringType()), + StructField("Email", StringType()), + StructField("Item", StringType()), + StructField("Quantity", IntegerType()), + StructField("UnitPrice", FloatType()), + StructField("Tax", FloatType()) + ]) + df = spark.read.load('/spark_lab/*.csv', format='csv', schema=orderSchema) + display(df.limit(100)) + ``` + +## データをクリーンアップする + +このデータセットの **Tax** 列に重複する行と `null` 値があることを確認します。 そのため、データに対してさらなる処理と分析を行う前に、クリーニングの手順が必要です。 + +![クリーンにするデータを含むテーブル。](./images/data-cleaning.png) + +1. 既存のコード セルの下で、 **[+]** アイコンを使用して新しいコード セルを追加します。 次に、新しいセルに次のコードを入力して実行し、テーブルから重複する行を削除し、`null` エントリを正しい値に置き換えます。 + + ```python + from pyspark.sql.functions import col + df = df.dropDuplicates() + df = df.withColumn('Tax', col('UnitPrice') * 0.08) + df = df.withColumn('Tax', col('Tax').cast("float")) + ``` + +**[税]** 列の値を更新した後、そのデータ型が再び `float` に設定されていることを確認します。 これは、計算の実行後にデータ型が `double` に変更されるためです。 `double` は `float` よりもメモリ使用量が多いため、列を型キャストして `float` に戻す方がパフォーマンスに優れています。 + +## データフレームをフィルター処理する + +1. 新しいコード セルを追加し、それを使用して次のコードを実行します。これにより以下が実行されます。 + - 販売注文データフレームの列をフィルター処理して、顧客名とメール アドレスのみを含める。 + - 注文レコードの合計数をカウントする + - 個別の顧客の数をカウントする + - 個別の顧客を表示する + + ```python + customers = df['CustomerName', 'Email'] + print(customers.count()) + print(customers.distinct().count()) + display(customers.distinct()) + ``` + + 次の詳細を確認します。 + + - データフレームに対して操作を実行すると、その結果として新しいデータフレームが作成されます (この場合、df データフレームから列の特定のサブセットを選択することで、新しい customers データフレームが作成されます) + - データフレームには、そこに含まれているデータの集計やフィルター処理に使用できる count や distinct などの関数が用意されています。 + - `dataframe['Field1', 'Field2', ...]` 構文は、列のサブセットを簡単に定義できる方法です。 また、**select** メソッドを使用すると、上記のコードの最初の行を `customers = df.select("CustomerName", "Email")` のように記述することができます + +1. 次は新しいコード セルで次のコードを実行して、特定の製品の注文を行った顧客のみを含めるフィルターを適用してみましょう。 + + ```python + customers = df.select("CustomerName", "Email").where(df['Item']=='Road-250 Red, 52') + print(customers.count()) + print(customers.distinct().count()) + display(customers.distinct()) + ``` + + 複数の関数を "チェーン化" すると、1 つの関数の出力が次の関数の入力になることに注意してください。この場合、select メソッドによって作成されたデータフレームは、フィルター条件を適用するために使用される where メソッドのソース データフレームとなります。 + +## データフレーム内のデータを集計してグループ化する + +1. 新しいコード セルで次のコードを実行して、注文データを集計およびグループ化します。 + + ```python + productSales = df.select("Item", "Quantity").groupBy("Item").sum() + display(productSales) + ``` + + その結果が、製品ごとにグループ化された注文数の合計を示していることに注意してください。 **groupBy** メソッドを使用すると、*Item* ごとに行がグループ化されます。その後の **sum** 集計関数は、残りのすべての数値列に適用されます (この場合は *Quantity*) + +1. 新しいコード セルで、他の集計を試してみましょう。 + + ```python + yearlySales = df.select(year("OrderDate").alias("Year")).groupBy("Year").count().orderBy("Year") + display(yearlySales) + ``` + + 今回の結果には 1 年あたりの販売注文数が表示されます。 select メソッドには *OrderDate* フィールドの year コンポーネントを抽出するための SQL **year** 関数が含まれており、抽出された year 値に列名を割り当てるために **alias** メソッドが使用されていることに注意してください。 次に、データが派生 *Year* 列によってグループ化され、各グループの行**数**が計算されます。その後、結果として生成されたデータフレームを並べ替えるために、最後に **orderBy** メソッドが使用されます。 + +> **注**:Azure Databricks での DataFrame の使用について詳しくは、Azure Databricks ドキュメントの [DataFrame の概要 - Python](https://docs.microsoft.com/azure/databricks/spark/latest/dataframes-datasets/introduction-to-dataframes-python) に関するページを参照してください。 + +## SQL コードをセル内で実行する + +1. PySpark コードが含まれているセルに SQL ステートメントを埋め込むことができるのは便利ですが、データ アナリストにとっては、SQL で直接作業できればよいという場合も多くあります。 新しいコード セルを追加し、それを使用して次のコードを実行します。 + + ```sql + %sql + + SELECT YEAR(OrderDate) AS OrderYear, + SUM((UnitPrice * Quantity) + Tax) AS GrossRevenue + FROM salesorders + GROUP BY YEAR(OrderDate) + ORDER BY OrderYear; + ``` + + 次の点に注意してください。 + + - セルの先頭にある "%sql" 行 (magic と呼ばれます) は、このセル内でこのコードを実行するには、PySpark ではなく、Spark SQL 言語ランタイムを使用する必要があることを示しています。 + - SQL コードにより、前に作成した **salesorder** ビューが参照されます。 + - SQL クエリからの出力は、セルの下に自動的に結果として表示されます。 + +> **注**: Spark SQL とデータフレームの詳細については、[Spark SQL のドキュメント](https://spark.apache.org/docs/2.2.0/sql-programming-guide.html)を参照してください。 + +## クリーンアップ + +Azure Databricks ポータルの **[コンピューティング]** ページでクラスターを選択し、**[■ 終了]** を選択してクラスターをシャットダウンします。 + +Azure Databricks を調べ終わったら、作成したリソースを削除できます。これにより、不要な Azure コストが生じないようになり、サブスクリプションの容量も解放されます。 diff --git a/Instructions/Exercises/LA-04-Explore-Delta-Lake.md b/Instructions/Exercises/LA-04-Explore-Delta-Lake.md new file mode 100644 index 0000000..93502e5 --- /dev/null +++ b/Instructions/Exercises/LA-04-Explore-Delta-Lake.md @@ -0,0 +1,293 @@ +--- +lab: + title: Azure Databricks で Delta Lake を使用する +--- + +# Azure Databricks で Delta Lake を使用する + +Delta Lake は、データ レイクの上に Spark 用のトランザクション データ ストレージ レイヤーを構築するためのオープンソース プロジェクトです。 Delta Lake では、バッチ データ操作とストリーミング データ操作の両方にリレーショナル セマンティクスのサポートが追加され、Apache Spark を使用して、データ レイク内の基になるファイルに基づくテーブル内のデータを処理しクエリを実行できる *Lakehouse* アーキテクチャを作成できます。 + +このラボは完了するまで、約 **30** 分かかります。 + +## Azure Databricks ワークスペースをプロビジョニングする + +> **ヒント**: 既に Azure Databricks ワークスペースがある場合は、この手順をスキップして、既存のワークスペースを使用できます。 + +この演習には、新しい Azure Databricks ワークスペースをプロビジョニングするスクリプトが含まれています。 このスクリプトは、この演習で必要なコンピューティング コアに対する十分なクォータが Azure サブスクリプションにあるリージョンに、*Premium* レベルの Azure Databricks ワークスペース リソースを作成しようとします。また、使用するユーザー アカウントのサブスクリプションに、Azure Databricks ワークスペース リソースを作成するための十分なアクセス許可があることを前提としています。 十分なクォータやアクセス許可がないためにスクリプトが失敗した場合は、[Azure portal で、Azure Databricks ワークスペースを対話形式で作成](https://learn.microsoft.com/azure/databricks/getting-started/#--create-an-azure-databricks-workspace)してみてください。 + +1. Web ブラウザーで、`https://portal.azure.com` の [Azure portal](https://portal.azure.com) にサインインします。 + +2. ページ上部の検索バーの右側にある **[\>_]** ボタンを使用して、Azure portal に新しい Cloud Shell を作成します。メッセージが表示されたら、***PowerShell*** 環境を選んで、ストレージを作成します。 次に示すように、Azure portal の下部にあるペインに、Cloud Shell のコマンド ライン インターフェイスが表示されます。 + + ![Azure portal と Cloud Shell のペイン](./images/cloud-shell.png) + + > **注**: 前に *Bash* 環境を使ってクラウド シェルを作成している場合は、そのクラウド シェル ペインの左上にあるドロップダウン メニューを使って、***PowerShell*** に変更します。 + +3. ペインの上部にある区分線をドラッグして Cloud Shell のサイズを変更したり、ペインの右上にある **—** 、 **◻** 、**X** アイコンを使用して、ペインを最小化または最大化したり、閉じたりすることができます。 Azure Cloud Shell の使い方について詳しくは、[Azure Cloud Shell のドキュメント](https://docs.microsoft.com/azure/cloud-shell/overview)をご覧ください。 + +4. PowerShell のペインで、次のコマンドを入力して、リポジトリを複製します。 + + ```powershell + rm -r mslearn-databricks -f + git clone https://github.com/MicrosoftLearning/mslearn-databricks + ``` + +5. リポジトリをクローンした後、次のコマンドを入力して **setup.ps1** スクリプトを実行します。これにより、使用可能なリージョンに Azure Databricks ワークスペースがプロビジョニングされます。 + + ```powershell + ./mslearn-databricks/setup.ps1 + ``` + +6. メッセージが表示された場合は、使用するサブスクリプションを選択します (これは、複数の Azure サブスクリプションへのアクセス権を持っている場合にのみ行います)。 + +7. スクリプトが完了するまで待ちます。通常、約 5 分かかりますが、さらに時間がかかる場合もあります。 待っている間に、Azure Databricks ドキュメントの[Delta Lake の概要](https://docs.microsoft.com/azure/databricks/delta/delta-intro)に関する記事をご確認ください。 + +## クラスターの作成 + +Azure Databricks は、Apache Spark "クラスター" を使用して複数のノードでデータを並列に処理する分散処理プラットフォームです。** 各クラスターは、作業を調整するドライバー ノードと、処理タスクを実行するワーカー ノードで構成されています。 この演習では、ラボ環境で使用されるコンピューティング リソース (リソースが制約される場合がある) を最小限に抑えるために、*単一ノード* クラスターを作成します。 運用環境では、通常、複数のワーカー ノードを含むクラスターを作成します。 + +> **ヒント**: Azure Databricks ワークスペースに 13.3 LTS 以降のランタイム バージョンを持つクラスターが既にある場合は、それを使ってこの演習を完了し、この手順をスキップできます。 + +1. Azure portal で、スクリプトによって作成された **msl-*xxxxxxx*** リソース グループ (または既存の Azure Databricks ワークスペースを含むリソース グループ) に移動します + +1. Azure Databricks Service リソース (セットアップ スクリプトを使って作成した場合は、**databricks-*xxxxxxx*** という名前) を選択します。 + +1. Azure Databricks ワークスペースの [**概要**] ページで、[**ワークスペースの起動**] ボタンを使用して、新しいブラウザー タブで Azure Databricks ワークスペースを開きます。サインインを求められた場合はサインインします。 + + > **ヒント**: Databricks ワークスペース ポータルを使用すると、さまざまなヒントと通知が表示される場合があります。 これらは無視し、指示に従ってこの演習のタスクを完了してください。 + +1. 左側のサイドバーで、**[(+) 新規]** タスクを選択し、**[クラスター]** を選択します。 + +1. **[新しいクラスター]** ページで、次の設定を使用して新しいクラスターを作成します。 + - **クラスター名**: "ユーザー名の" クラスター (既定のクラスター名)** + - **ポリシー**:Unrestricted + - **クラスター モード**: 単一ノード + - **アクセス モード**: 単一ユーザー (*自分のユーザー アカウントを選択*) + - **Databricks Runtime のバージョン**: 13.3 LTS (Spark 3.4.1、Scala 2.12) 以降 + - **Photon Acceleration を使用する**: 選択済み + - **ノードの種類**: Standard_DS3_v2 + - **非アクティブ状態が ** *20* ** 分間続いた後終了する** + +1. クラスターが作成されるまで待ちます。 これには 1、2 分かかることがあります。 + + > **注**: クラスターの起動に失敗した場合、Azure Databricks ワークスペースがプロビジョニングされているリージョンでサブスクリプションのクォータが不足していることがあります。 詳細については、「[CPU コアの制限によってクラスターを作成できない](https://docs.microsoft.com/azure/databricks/kb/clusters/azure-core-limit)」を参照してください。 その場合は、ワークスペースを削除し、別のリージョンに新しいワークスペースを作成してみてください。 次のように、セットアップ スクリプトのパラメーターとしてリージョンを指定できます: `./mslearn-databricks/setup.ps1 eastus` + +## ノートブックを作成してデータを取り込む + +次に、Spark ノートブックを作成し、この演習で使用するデータをインポートしましょう。 + +1. サイド バーで **[(+) 新規]** タスクを使用して、**Notebook** を作成します。 + +1. 既定のノートブック名 (**無題のノートブック *[日付]***) を "**差分レイクの探索**" に変更し、**[接続]** ドロップダウン リストでクラスターを選択します (まだ選択されていない場合)。 クラスターが実行されていない場合は、起動に 1 分ほどかかる場合があります。 + +1. ノートブックの最初のセルに次のコードを入力します。このコードは、"シェル" コマンドを使用して、GitHub からクラスターで使用されるファイル システムにデータ ファイルをダウンロードします。** + + ```python + %sh + rm -r /dbfs/delta_lab + mkdir /dbfs/delta_lab + wget -O /dbfs/delta_lab/products.csv https://raw.githubusercontent.com/MicrosoftLearning/mslearn-databricks/main/data/products.csv + ``` + +1. セルの左側にある **[▸ セルの実行]** メニュー オプションを使用して実行を行います。 そして、コードによって実行される Spark ジョブが完了するまで待ちます。 + +1. 既存のコード セルの下で、 **[+]** アイコンを使用して新しいコード セルを追加します。 次に、新しいセルに次のコードを入力して実行し、ファイルからデータを読み込み、最初の 10 行を表示します。 + + ```python + df = spark.read.load('/delta_lab/products.csv', format='csv', header=True) + display(df.limit(10)) + ``` + +## ファイル データをデルタ テーブルに読み込む + +データはデータフレームに読み込まれています。 これを差分テーブルに保持してみましょう。 + +1. 新しいコード セルを追加し、それを使用して次のコードを実行します。 + + ```python + delta_table_path = "/delta/products-delta" + df.write.format("delta").save(delta_table_path) + ``` + + 差分レイク テーブルのデータは Parquet 形式で保存されます。 ログ ファイルも作成され、データに加えられた変更が追跡されます。 + +1. 新しいコード セルを追加し、それを使用して次のシェル コマンドを実行して、差分データが保存されているフォルダーの内容を表示します。 + + ``` + %sh + ls /dbfs/delta/products-delta + ``` + +1. Delta 形式のファイル データは、**DeltaTable** オブジェクトに読み込むことができます。これを使用して、テーブル内のデータを表示および更新できます。 新しいセルで次のコードを実行してデータを更新し、製品 771 の価格を 10% 下げます。 + + ```python + from delta.tables import * + from pyspark.sql.functions import * + + # Create a deltaTable object + deltaTable = DeltaTable.forPath(spark, delta_table_path) + # Update the table (reduce price of product 771 by 10%) + deltaTable.update( + condition = "ProductID == 771", + set = { "ListPrice": "ListPrice * 0.9" }) + # View the updated data as a dataframe + deltaTable.toDF().show(10) + ``` + + 更新は差分フォルダー内のデータに保持され、その場所から読み込まれたすべての新しいデータフレームに反映されます。 + +1. 次のコードを実行して、差分テーブル データから新しいデータフレームを作成します。 + + ```python + new_df = spark.read.format("delta").load(delta_table_path) + new_df.show(10) + ``` + +## ログと *time-travel* を確認する + +データの変更がログされるため、Delta Lake の *time-travel* 機能を使用して、以前のバージョンのデータを表示できます。 + +1. 新しいコード セルで次のコードを使用して、製品データの元のバージョンを表示します。 + + ```python + new_df = spark.read.format("delta").option("versionAsOf", 0).load(delta_table_path) + new_df.show(10) + ``` + +1. ログには、データに対する変更の完全な履歴が含まれています。 次のコードを使用して、過去 10 件の変更のレコードを確認します。 + + ```python + deltaTable.history(10).show(10, False, True) + ``` + +## カタログ テーブルを作成する + +ここまで、テーブルの基になった Parquet ファイルが含まれるフォルダーからデータを読み込むことで、デルタ テーブルを操作しました。 データをカプセル化する "カタログ テーブル" を定義し、SQL コードで参照できる名前付きテーブル エンティティを提供できます。** Spark では、デルタ レイク用に次の 2 種類のカタログ テーブルがサポートされています。 + +- テーブル データを含むファイルへのパスで定義される "外部" テーブル。** +- メタストアに定義される "マネージド" テーブル。** + +### 外部テーブルを作成する + +1. このコードを使用して、**AdventureWorks** という名前の新しいデータベースを作成し、先ほど定義した Dalta ファイルへのパスに基づいて、そのデータベース内に **ProductsExternal** という外部テーブルを作成します。 + + ```python + spark.sql("CREATE DATABASE AdventureWorks") + spark.sql("CREATE TABLE AdventureWorks.ProductsExternal USING DELTA LOCATION '{0}'".format(delta_table_path)) + spark.sql("DESCRIBE EXTENDED AdventureWorks.ProductsExternal").show(truncate=False) + ``` + + 新しいテーブルの **Location** プロパティが、指定したパスであることに注意してください。 + +1. 次のコードを使用してテーブルにクエリを実行します。 + + ```sql + %sql + USE AdventureWorks; + SELECT * FROM ProductsExternal; + ``` + +### マネージド テーブルを作成する + +1. 次のコードを実行して、(製品 771 の価格を更新する前に) 最初に **products.csv** ファイルから読み込んだデータフレームに基づいて、**ProductsManaged** という名前のマネージド テーブルを作成 (および記述) します。 + + ```python + df.write.format("delta").saveAsTable("AdventureWorks.ProductsManaged") + spark.sql("DESCRIBE EXTENDED AdventureWorks.ProductsManaged").show(truncate=False) + ``` + + このテーブルで使用される Parquet ファイルのパスは指定しませんでした。これは Hive メタストアで管理され、テーブルの説明の **Location** プロパティに表示されます。 + +1. 次のコードを使用して、マネージド テーブルにクエリを実行します。構文はマネージド テーブルの場合と同じであることに注意してください。 + + ```sql + %sql + USE AdventureWorks; + SELECT * FROM ProductsManaged; + ``` + +### 外部テーブルとマネージド テーブルを比較する + +1. 次のコードを使用して、**AdventureWorks** データベースのテーブルを一覧表示します。 + + ```sql + %sql + USE AdventureWorks; + SHOW TABLES; + ``` + +1. ここで次のコードを使用して、これらのテーブルが基づくフォルダーを確認します。 + + ```Bash + %sh + echo "External table:" + ls /dbfs/delta/products-delta + echo + echo "Managed table:" + ls /dbfs/user/hive/warehouse/adventureworks.db/productsmanaged + ``` + +1. 次のコードを使用して、データベースから両方のテーブルを削除します。 + + ```sql + %sql + USE AdventureWorks; + DROP TABLE IF EXISTS ProductsExternal; + DROP TABLE IF EXISTS ProductsManaged; + SHOW TABLES; + ``` + +1. ここで次のコードを含むセルを再実行して、差分フォルダーの内容を表示します。 + + ```Bash + %sh + echo "External table:" + ls /dbfs/delta/products-delta + echo + echo "Managed table:" + ls /dbfs/user/hive/warehouse/adventureworks.db/productsmanaged + ``` + + マネージド テーブルのファイルは、テーブルが削除されると自動的に削除されます。 ただし、外部テーブルのファイルは残ります。 外部テーブルを削除すると、データベースからテーブル メタデータのみが削除されます。データ ファイルは削除されません。 + +1. 次のコードを使用して、**products-delta** フォルダー内の差分ファイルに基づく新しいテーブルをデータベースに作成します。 + + ```sql + %sql + USE AdventureWorks; + CREATE TABLE Products + USING DELTA + LOCATION '/delta/products-delta'; + ``` + +1. 次のコードを使用して新しいテーブルにクエリを実行します。 + + ```sql + %sql + USE AdventureWorks; + SELECT * FROM Products; + ``` + + テーブルは既存の差分ファイル (ログされた変更履歴を含む) に基づいているため、これには製品データに以前行った変更が反映されています。 + +## テーブル レイアウトを最適化する + +テーブル データおよび関連するインデックス データの物理ストレージを再編成して、ストレージ スペースを削減し、テーブルにアクセスするときの入出力効率を向上させることができます。 これは、テーブルに対する大量の挿入、更新、または削除操作の後に特に便利です。 + +1. 新しいコード セルで、次のコードを使用してレイアウトを最適化し、デルタ テーブル内の古いバージョンのデータ ファイルをクリーンアップします。 + + ```python + spark.sql("OPTIMIZE Products") + spark.conf.set("spark.databricks.delta.retentionDurationCheck.enabled", "false") + spark.sql("VACUUM Products RETAIN 24 HOURS") + ``` + +Delta Lake には、危険性のある VACUUM コマンドを実行できないようにする安全性チェックが用意されています。 Databricks Runtime では、このテーブルに対して、指定しようとしている保持期間よりも長くかかる操作が実行されていないことが確かな場合は、Spark 構成プロパティ `spark.databricks.delta.retentionDurationCheck.enabled` を `false` に設定することで、この安全性チェックをオフにすることができます。 + +> **注**: デルタ テーブルに対して VACUUM を実行すると、指定されたデータ保有期間よりも古いバージョンにタイム トラベルできなくなります。 + +## クリーンアップ + +Azure Databricks ポータルの **[コンピューティング]** ページでクラスターを選択し、**[■ 終了]** を選択してクラスターをシャットダウンします。 + +Azure Databricks を調べ終わったら、作成したリソースを削除できます。これにより、不要な Azure コストが生じないようになり、サブスクリプションの容量も解放されます。 diff --git a/Instructions/Exercises/LA-05-Build-data-pipeline.md b/Instructions/Exercises/LA-05-Build-data-pipeline.md new file mode 100644 index 0000000..d96be0c --- /dev/null +++ b/Instructions/Exercises/LA-05-Build-data-pipeline.md @@ -0,0 +1,183 @@ +--- +lab: + title: Delta Live Tables を使用してデータ パイプラインを作成する +--- + +# Delta Live Tables を使用してデータ パイプラインを作成する + +Delta Live Tables は、信頼性、保守性、テスト可能性に優れたデータ処理パイプラインを構築するための宣言型フレームワークです。 パイプラインは、Delta Live Tables でデータ処理ワークフローの構成と実行に使用されるメイン ユニットです。 Python または SQL で宣言された有向非巡回グラフ (DAG) を使用して、データ ソースをターゲット データセットにリンクします。 + +このラボは完了するまで、約 **40** 分かかります。 + +## Azure Databricks ワークスペースをプロビジョニングする + +> **ヒント**: 既に Azure Databricks ワークスペースがある場合は、この手順をスキップして、既存のワークスペースを使用できます。 + +この演習には、新しい Azure Databricks ワークスペースをプロビジョニングするスクリプトが含まれています。 このスクリプトは、この演習で必要なコンピューティング コアに対する十分なクォータが Azure サブスクリプションにあるリージョンに、*Premium* レベルの Azure Databricks ワークスペース リソースを作成しようとします。また、使用するユーザー アカウントのサブスクリプションに、Azure Databricks ワークスペース リソースを作成するための十分なアクセス許可があることを前提としています。 十分なクォータやアクセス許可がないためにスクリプトが失敗した場合は、[Azure portal で、Azure Databricks ワークスペースを対話形式で作成](https://learn.microsoft.com/azure/databricks/getting-started/#--create-an-azure-databricks-workspace)してみてください。 + +1. Web ブラウザーで、`https://portal.azure.com` の [Azure portal](https://portal.azure.com) にサインインします。 + +2. ページ上部の検索バーの右側にある **[\>_]** ボタンを使用して、Azure portal に新しい Cloud Shell を作成します。メッセージが表示されたら、***PowerShell*** 環境を選んで、ストレージを作成します。 次に示すように、Azure portal の下部にあるペインに、Cloud Shell のコマンド ライン インターフェイスが表示されます。 + + ![Azure portal と Cloud Shell のペイン](./images/cloud-shell.png) + + > **注**: 前に *Bash* 環境を使ってクラウド シェルを作成している場合は、そのクラウド シェル ペインの左上にあるドロップダウン メニューを使って、***PowerShell*** に変更します。 + +3. ペインの上部にある区分線をドラッグして Cloud Shell のサイズを変更したり、ペインの右上にある **—** 、 **◻** 、**X** アイコンを使用して、ペインを最小化または最大化したり、閉じたりすることができます。 Azure Cloud Shell の使い方について詳しくは、[Azure Cloud Shell のドキュメント](https://docs.microsoft.com/azure/cloud-shell/overview)をご覧ください。 + +4. PowerShell のペインで、次のコマンドを入力して、リポジトリを複製します。 + + ```powershell + rm -r mslearn-databricks -f + git clone https://github.com/MicrosoftLearning/mslearn-databricks + ``` + +5. リポジトリをクローンした後、次のコマンドを入力して **setup.ps1** スクリプトを実行します。これにより、使用可能なリージョンに Azure Databricks ワークスペースがプロビジョニングされます。 + + ```powershell + ./mslearn-databricks/setup.ps1 + ``` + +6. メッセージが表示された場合は、使用するサブスクリプションを選択します (これは、複数の Azure サブスクリプションへのアクセス権を持っている場合にのみ行います)。 + +7. スクリプトが完了するまで待ちます。通常、約 5 分かかりますが、さらに時間がかかる場合もあります。 待っている間に、Azure Databricks ドキュメントの[Delta Lake の概要](https://docs.microsoft.com/azure/databricks/delta/delta-intro)に関する記事をご確認ください。 + +## クラスターの作成 + +Azure Databricks は、Apache Spark "クラスター" を使用して複数のノードでデータを並列に処理する分散処理プラットフォームです。** 各クラスターは、作業を調整するドライバー ノードと、処理タスクを実行するワーカー ノードで構成されています。 この演習では、ラボ環境で使用されるコンピューティング リソース (リソースが制約される場合がある) を最小限に抑えるために、*単一ノード* クラスターを作成します。 運用環境では、通常、複数のワーカー ノードを含むクラスターを作成します。 + +> **ヒント**: Azure Databricks ワークスペースに 13.3 LTS 以降のランタイム バージョンを持つクラスターが既にある場合は、それを使ってこの演習を完了し、この手順をスキップできます。 + +1. Azure portal で、スクリプトによって作成された **msl-*xxxxxxx*** リソース グループ (または既存の Azure Databricks ワークスペースを含むリソース グループ) に移動します + +1. Azure Databricks Service リソース (セットアップ スクリプトを使って作成した場合は、**databricks-*xxxxxxx*** という名前) を選択します。 + +1. Azure Databricks ワークスペースの [**概要**] ページで、[**ワークスペースの起動**] ボタンを使用して、新しいブラウザー タブで Azure Databricks ワークスペースを開きます。サインインを求められた場合はサインインします。 + + > **ヒント**: Databricks ワークスペース ポータルを使用すると、さまざまなヒントと通知が表示される場合があります。 これらは無視し、指示に従ってこの演習のタスクを完了してください。 + +1. 左側のサイドバーで、**[(+) 新規]** タスクを選択し、**[クラスター]** を選択します。 + +1. **[新しいクラスター]** ページで、次の設定を使用して新しいクラスターを作成します。 + - **クラスター名**: "ユーザー名の" クラスター (既定のクラスター名)** + - **ポリシー**:Unrestricted + - **クラスター モード**: 単一ノード + - **アクセス モード**: 単一ユーザー (*自分のユーザー アカウントを選択*) + - **Databricks Runtime のバージョン**: 13.3 LTS (Spark 3.4.1、Scala 2.12) 以降 + - **Photon Acceleration を使用する**: 選択済み + - **ノードの種類**: Standard_DS3_v2 + - **非アクティブ状態が ** *20* ** 分間続いた後終了する** + +1. クラスターが作成されるまで待ちます。 これには 1、2 分かかることがあります。 + + > **注**: クラスターの起動に失敗した場合、Azure Databricks ワークスペースがプロビジョニングされているリージョンでサブスクリプションのクォータが不足していることがあります。 詳細については、「[CPU コアの制限によってクラスターを作成できない](https://docs.microsoft.com/azure/databricks/kb/clusters/azure-core-limit)」を参照してください。 その場合は、ワークスペースを削除し、別のリージョンに新しいワークスペースを作成してみてください。 次のように、セットアップ スクリプトのパラメーターとしてリージョンを指定できます: `./mslearn-databricks/setup.ps1 eastus` + +## ノートブックを作成してデータを取り込む + +1. サイド バーで **[(+) 新規]** タスクを使用して、**Notebook** を作成します。 + +2. 既定のノートブック名 (**無題のノートブック *[日付]***) を「**Delta Live Tables を使用してパイプラインを作成する**」に変更し、**[接続]** ドロップダウン リストでクラスターを選択します (まだ選択されていない場合)。 クラスターが実行されていない場合は、起動に 1 分ほどかかる場合があります。 + +3. ノートブックの最初のセルに次のコードを入力します。このコードは、"シェル" コマンドを使用して、GitHub からクラスターで使用されるファイル システムにデータ ファイルをダウンロードします。** + + ```python + %sh + rm -r /dbfs/delta_lab + mkdir /dbfs/delta_lab + wget -O /dbfs/delta_lab/covid_data.csv https://github.com/MicrosoftLearning/mslearn-databricks/raw/main/data/covid_data.csv + ``` + +4. セルの左側にある **[▸ セルの実行]** メニュー オプションを使用して実行を行います。 そして、コードによって実行される Spark ジョブが完了するまで待ちます。 + +## SQL を使用して Delta Live Tables パイプラインを作成する + +新しい SQL ノートブックを作成し、SQL スクリプトを使用して Delta Live Tables の定義を開始します。 DLT SQL UI が有効になっていることを確認します。 + +1. 最初のセルに次のコードを実行せずに配置します。 すべてのセルは、パイプラインの作成後に実行されます。 このコードでは、以前ダウンロードした生データによって設定される Delta Live Table を定義します。 + + ```sql + CREATE OR REFRESH LIVE TABLE raw_covid_data + COMMENT "COVID sample dataset. This data was ingested from the COVID-19 Data Repository by the Center for Systems Science and Engineering (CSSE) at Johns Hopkins University." + AS + SELECT + Last_Update, + Country_Region, + Confirmed, + Deaths, + Recovered + FROM read_files('dbfs:/delta_lab/covid_data.csv', format => 'csv', header => true) + ``` + +2. 新しいセルを追加し、次のコードを使用して、分析前に前のテーブルのデータのクエリの実行、フィルター処理、書式設定を行います。 + + ```sql + CREATE OR REFRESH LIVE TABLE processed_covid_data( + CONSTRAINT valid_country_region EXPECT (Country_Region IS NOT NULL) ON VIOLATION FAIL UPDATE + ) + COMMENT "Formatted and filtered data for analysis." + AS + SELECT + DATE_FORMAT(Last_Update, 'MM/dd/yyyy') as Report_Date, + Country_Region, + Confirmed, + Deaths, + Recovered + FROM live.raw_covid_data; + ``` + +3. 新しいコード セルに、パイプラインが正常に実行されると、さらに分析するためにエンリッチされたデータ ビューを作成する次のコードを配置します。 + + ```sql + CREATE OR REFRESH LIVE TABLE aggregated_covid_data + COMMENT "Aggregated daily data for the US with total counts." + AS + SELECT + Report_Date, + sum(Confirmed) as Total_Confirmed, + sum(Deaths) as Total_Deaths, + sum(Recovered) as Total_Recovered + FROM live.processed_covid_data + GROUP BY Report_Date; + ``` + +4. 左サイドバーで **[Delta Live Tables]** を選択し、**[パイプラインの作成]** を選択します。 + +5. **[パイプラインの作成**] ページで、次の設定を使用して新しいパイプラインを作成します。 + - **パイプライン名**: パイプラインに名前を付ける + - **製品エディション**: 詳細 + - **パイプライン モード**: トリガー + - **ソース コード**: SQL ノートブックを選択する + - **ストレージ オプション**: Hive メタストア + - **ストレージの場所**: dbfs:/pipelines/delta_lab + +6. **[作成]** を選択して、**[開始]** を選択します。 + +7. パイプラインが正常に実行されたら、最初のノートブックに戻り、次のコードを使用して、指定したストレージの場所に 3 つの新しいテーブルがすべて作成されていることを確認します。 + + ```sql + display(dbutils.fs.ls("dbfs:/pipelines/delta_lab")) + ``` + +## 結果を視覚化として表示する + +テーブルを作成した後、テーブルをデータフレームに読み込み、データを視覚化することができます。 + +1. 最初のノートブックで、新しいコード セルを追加し、次のコードを実行して `aggregated_covid_data` をデータフレームに読み込みます。 + + ```python + df = spark.read.format("delta").load('/pipelines/delta_lab/tables/aggregated_covid_data') + display(df) + ``` + +1. 結果の表の上にある **[+]** 、 **[視覚化]** の順に選択して視覚化エディターを表示し、次のオプションを適用します。 + - **視覚化の種類**: 折れ線 + - **X 列**: Report_Date + - **Y 列**: *新しい列を追加して*、**[Total_Confirmed]** を選択します。 ****合計***集計を適用します*。 + +1. 視覚化を保存し、結果のグラフをノートブックに表示します。 + +## クリーンアップ + +Azure Databricks ポータルの **[コンピューティング]** ページでクラスターを選択し、**[■ 終了]** を選択してクラスターをシャットダウンします。 + +Azure Databricks を調べ終わったら、作成したリソースを削除できます。これにより、不要な Azure コストが生じないようになり、サブスクリプションの容量も解放されます。 diff --git a/Instructions/Exercises/LA-06-Build-workflow.md b/Instructions/Exercises/LA-06-Build-workflow.md new file mode 100644 index 0000000..183fed4 --- /dev/null +++ b/Instructions/Exercises/LA-06-Build-workflow.md @@ -0,0 +1,183 @@ +--- +lab: + title: Azure Databricks ワークフローを使用してワークロードをデプロイする +--- + +# Azure Databricks ワークフローを使用してワークロードをデプロイする + +Azure Databricks ワークフローは、ワークロードを効率的にデプロイするための堅牢なプラットフォームを提供します。 Azure Databricks ジョブや Delta Live Tables などの機能を使用すると、ユーザーは複雑なデータ処理、機械学習、分析パイプラインを調整できます。 + +このラボは完了するまで、約 **40** 分かかります。 + +## Azure Databricks ワークスペースをプロビジョニングする + +> **ヒント**: 既に Azure Databricks ワークスペースがある場合は、この手順をスキップして、既存のワークスペースを使用できます。 + +この演習には、新しい Azure Databricks ワークスペースをプロビジョニングするスクリプトが含まれています。 このスクリプトは、この演習で必要なコンピューティング コアに対する十分なクォータが Azure サブスクリプションにあるリージョンに、*Premium* レベルの Azure Databricks ワークスペース リソースを作成しようとします。また、使用するユーザー アカウントのサブスクリプションに、Azure Databricks ワークスペース リソースを作成するための十分なアクセス許可があることを前提としています。 十分なクォータやアクセス許可がないためにスクリプトが失敗した場合は、[Azure portal で、Azure Databricks ワークスペースを対話形式で作成](https://learn.microsoft.com/azure/databricks/getting-started/#--create-an-azure-databricks-workspace)してみてください。 + +1. Web ブラウザーで、`https://portal.azure.com` の [Azure portal](https://portal.azure.com) にサインインします。 + +2. ページ上部の検索バーの右側にある **[\>_]** ボタンを使用して、Azure portal に新しい Cloud Shell を作成します。メッセージが表示されたら、***PowerShell*** 環境を選んで、ストレージを作成します。 次に示すように、Azure portal の下部にあるペインに、Cloud Shell のコマンド ライン インターフェイスが表示されます。 + + ![Azure portal と Cloud Shell のペイン](./images/cloud-shell.png) + + > **注**: 前に *Bash* 環境を使ってクラウド シェルを作成している場合は、そのクラウド シェル ペインの左上にあるドロップダウン メニューを使って、***PowerShell*** に変更します。 + +3. ペインの上部にある区分線をドラッグして Cloud Shell のサイズを変更したり、ペインの右上にある **—** 、 **◻** 、**X** アイコンを使用して、ペインを最小化または最大化したり、閉じたりすることができます。 Azure Cloud Shell の使い方について詳しくは、[Azure Cloud Shell のドキュメント](https://docs.microsoft.com/azure/cloud-shell/overview)をご覧ください。 + +4. PowerShell のペインで、次のコマンドを入力して、リポジトリを複製します。 + + ```powershell + rm -r mslearn-databricks -f + git clone https://github.com/MicrosoftLearning/mslearn-databricks + ``` + +5. リポジトリをクローンした後、次のコマンドを入力して **setup.ps1** スクリプトを実行します。これにより、使用可能なリージョンに Azure Databricks ワークスペースがプロビジョニングされます。 + + ```powershell + ./mslearn-databricks/setup.ps1 + ``` + +6. メッセージが表示された場合は、使用するサブスクリプションを選択します (これは、複数の Azure サブスクリプションへのアクセス権を持っている場合にのみ行います)。 + +7. スクリプトが完了するまで待ちます。通常、約 5 分かかりますが、さらに時間がかかる場合もあります。 待っている間に、Azure Databricks ドキュメントの[Delta Lake の概要](https://docs.microsoft.com/azure/databricks/delta/delta-intro)に関する記事をご確認ください。 + +## クラスターの作成 + +Azure Databricks は、Apache Spark "クラスター" を使用して複数のノードでデータを並列に処理する分散処理プラットフォームです。** 各クラスターは、作業を調整するドライバー ノードと、処理タスクを実行するワーカー ノードで構成されています。 この演習では、ラボ環境で使用されるコンピューティング リソース (リソースが制約される場合がある) を最小限に抑えるために、*単一ノード* クラスターを作成します。 運用環境では、通常、複数のワーカー ノードを含むクラスターを作成します。 + +> **ヒント**: Azure Databricks ワークスペースに 13.3 LTS 以降のランタイム バージョンを持つクラスターが既にある場合は、それを使ってこの演習を完了し、この手順をスキップできます。 + +1. Azure portal で、スクリプトによって作成された **msl-*xxxxxxx*** リソース グループ (または既存の Azure Databricks ワークスペースを含むリソース グループ) に移動します + +1. Azure Databricks Service リソース (セットアップ スクリプトを使って作成した場合は、**databricks-*xxxxxxx*** という名前) を選択します。 + +1. Azure Databricks ワークスペースの [**概要**] ページで、[**ワークスペースの起動**] ボタンを使用して、新しいブラウザー タブで Azure Databricks ワークスペースを開きます。サインインを求められた場合はサインインします。 + + > **ヒント**: Databricks ワークスペース ポータルを使用すると、さまざまなヒントと通知が表示される場合があります。 これらは無視し、指示に従ってこの演習のタスクを完了してください。 + +1. 左側のサイドバーで、**[(+) 新規]** タスクを選択し、**[クラスター]** を選択します。 + +1. **[新しいクラスター]** ページで、次の設定を使用して新しいクラスターを作成します。 + - **クラスター名**: "ユーザー名の" クラスター (既定のクラスター名)** + - **ポリシー**:Unrestricted + - **クラスター モード**: 単一ノード + - **アクセス モード**: 単一ユーザー (*自分のユーザー アカウントを選択*) + - **Databricks Runtime のバージョン**: 13.3 LTS (Spark 3.4.1、Scala 2.12) 以降 + - **Photon Acceleration を使用する**: 選択済み + - **ノードの種類**: Standard_DS3_v2 + - **非アクティブ状態が ** *20* ** 分間続いた後終了する** + +1. クラスターが作成されるまで待ちます。 これには 1、2 分かかることがあります。 + + > **注**: クラスターの起動に失敗した場合、Azure Databricks ワークスペースがプロビジョニングされているリージョンでサブスクリプションのクォータが不足していることがあります。 詳細については、「[CPU コアの制限によってクラスターを作成できない](https://docs.microsoft.com/azure/databricks/kb/clusters/azure-core-limit)」を参照してください。 その場合は、ワークスペースを削除し、別のリージョンに新しいワークスペースを作成してみてください。 次のように、セットアップ スクリプトのパラメーターとしてリージョンを指定できます: `./mslearn-databricks/setup.ps1 eastus` + +## ノートブックを作成してデータを取り込む + +1. サイド バーで **[(+) 新規]** タスクを使用して、**Notebook** を作成します。 + +2. **[接続]** ドロップダウン リストで、まだ選択されていない場合はクラスターを選択します。 クラスターが実行されていない場合は、起動に 1 分ほどかかる場合があります。 + +3. ノートブックの最初のセルに次のコードを入力します。このコードは、"シェル" コマンドを使用して、GitHub からクラスターで使用されるファイル システムにデータ ファイルをダウンロードします。** + + ```python + %sh + rm -r /dbfs/workflow_lab + mkdir /dbfs/workflow_lab + wget -O /dbfs/workflow_lab/2019.csv https://github.com/MicrosoftLearning/mslearn-databricks/raw/main/data/2019_edited.csv + wget -O /dbfs/workflow_lab/2020.csv https://github.com/MicrosoftLearning/mslearn-databricks/raw/main/data/2020_edited.csv + wget -O /dbfs/workflow_lab/2021.csv https://github.com/MicrosoftLearning/mslearn-databricks/raw/main/data/2021_edited.csv + ``` + +4. セルの左側にある **[▸ セルの実行]** メニュー オプションを使用して実行を行います。 そして、コードによって実行される Spark ジョブが完了するまで待ちます。 + +## ジョブ タスクを作成する + +タスクを使用して、データ処理および分析ワークフローを実装します。 ジョブは、1 つ以上のタスクで構成されます。 ノートブック、JARS、Delta Live Tables パイプライン、または Python、Scala、Spark submit、および Java アプリケーションを実行するジョブ タスクを作成できます。 この演習では、視覚化グラフにデータの抽出、変換、読み込みを行うノートブックとしてタスクを作成します。 + +1. サイド バーで **[(+) 新規]** タスクを使用して、**Notebook** を作成します。 + +2. 既定のノートブック名 (**無題のノートブック *[日付]***) を「**ETL タスク**」に変更し、**[接続]** ドロップダウン リストでクラスターを選択します (まだ選択されていない場合)。 クラスターが実行されていない場合は、起動に 1 分ほどかかる場合があります。 + +3. ノートブックの最初のセルに、データのスキーマを定義し、データセットをデータフレームに読み込む次のコードを入力します。 + + ```python + from pyspark.sql.types import * + from pyspark.sql.functions import * + orderSchema = StructType([ + StructField("SalesOrderNumber", StringType()), + StructField("SalesOrderLineNumber", IntegerType()), + StructField("OrderDate", DateType()), + StructField("CustomerName", StringType()), + StructField("Email", StringType()), + StructField("Item", StringType()), + StructField("Quantity", IntegerType()), + StructField("UnitPrice", FloatType()), + StructField("Tax", FloatType()) + ]) + df = spark.read.load('/workflow_lab/*.csv', format='csv', schema=orderSchema) + display(df.limit(100)) + ``` + +4. 既存のコード セルの下で、 **[+]** アイコンを使用して新しいコード セルを追加します。 次に、新しいセルに次のコードを入力して実行し、重複する行を削除し、`null` エントリを正しい値に置き換えます。 + + ```python + from pyspark.sql.functions import col + df = df.dropDuplicates() + df = df.withColumn('Tax', col('UnitPrice') * 0.08) + df = df.withColumn('Tax', col('Tax').cast("float")) + ``` +> 注: **[税]** 列の値を更新すると、そのデータ型は再び `float` に設定されます。 これは、計算の実行後にデータ型が `double` に変更されるためです。 `double` は `float` よりもメモリ使用量が多いため、列を型キャストして `float` に戻す方がパフォーマンスに優れています。 + +5. 新しいコード セルで次のコードを実行して、注文データを集計およびグループ化します。 + + ```python + yearlySales = df.select(year("OrderDate").alias("Year")).groupBy("Year").count().orderBy("Year") + display(yearlySales) + ``` + +6. 結果の表の上にある **[+]** 、 **[視覚化]** の順に選択して視覚化エディターを表示し、次のオプションを適用します。 + + **一般**タブ: + - **視覚化の種類**: 横棒 + - **X 列**: 年 + - **Y 列**: *新しい列を追加して*、**[数量]** を選択します。 ****合計***集計を適用します*。 + + **[X 軸]** タブ: + - **スケール**: カテゴリ + +8. **[保存]** を選択します。 + +## ワークフローを構築する + +Azure Databricks が、すべてのジョブのタスク オーケストレーション、クラスター管理、監視、およびエラー レポートを管理します。 ジョブは、すぐに、または使いやすいスケジュール システムを使用して定期的に、または新しいファイルが外部の場所に到着するたびに、またはジョブのインスタンスが常に実行されているように継続的に実行できます。 + +1. 左サイドバーで、**[ワークフロー]** を選択します。 + +2. [ワークフロー] ウィンドウで、**[ジョブの作成]** を選択します。 + +3. 既定のジョブ名 (**[新しいジョブ *[日付]***) を「**ETL ジョブ**」に変更します。 + +4. **[タスク名]** フィールドに、タスクの名前を入力します。 + +5. **[種類]** ドロップダウン メニューで、**[ノートブック]** を選択します。 + +6. **[パス]** フィールドで、**ETL タスク** ノートブックを選択します。 + +7. **[タスクの作成]** を選択します。 + +8. **[今すぐ実行]** を選択します。 + +9. ジョブの実行が開始されたら、左サイドバーで **[ジョブ実行]** を選択することで、ジョブの実行を監視できます。 + +10. ジョブの実行が成功したら、ジョブを選択して出力を確認できます。 + +さらに、スケジュールに基づくワークフローの実行など、トリガー ベースでジョブを実行することもできます。 定期的なジョブの実行をスケジュールするには、ジョブ タスクを開き、右側のパネルで **[トリガーの追加]** を選択します。 + + ![[ワークフロー] 作業ウィンドウ](./images/workflow-schedule.png) + +## クリーンアップ + +Azure Databricks ポータルの **[コンピューティング]** ページでクラスターを選択し、**[■ 停止]** を選択してクラスターをシャットダウンします。 + +Azure Databricks を調べ終わったら、作成したリソースを削除できます。これにより、不要な Azure コストが生じないようになり、サブスクリプションの容量も解放されます。