Azure Data Lake Storage Gen2 は、Azure Blob Storage を基盤としたビッグデータ分析に特化したストレージサービスです。Gen1 および Blob Storage の機能に加え、大量のデータを効率的に管理・分析するための機能が強化されています。本稿では、.NET Core コンソールアプリケーションから Data Lake Storage Gen2 を操作する方法を解説します。
Azure Data Lake Storage Gen2 の概要
Azure Data Lake Storage Gen2 は、Azure 上でのエンタープライズ向けデータレイク構築の基盤となります。数ペタバイト規模の情報を保存し、毎秒数百ギガビットのスループットを実現するように設計されており、膨大なデータセットの管理を容易にします。
Blob Storage をベースに、以下の点で強化されています。
- パフォーマンスの最適化: 分析のためにデータの複製や変換が不要になり、階層型名前空間によりディレクトリ操作のパフォーマンスが向上し、ジョブ全体の実行速度が改善されます。
- 管理の容易性: ディレクトリとサブディレクトリ構造でファイルを整理・操作できます。
- セキュリティの強化: ディレクトリや個々のファイルに対して POSIX 権限を適用できます。
これらの概念を踏まえ、具体的なコード操作を通じて Data Lake Storage Gen2 へのアクセス方法を学びます。
Data Lake Storage Gen2 のセットアップ
Azure Portal からのストレージアカウント作成
- Azure Portal で「リソースの作成」をクリックし、「ストレージアカウント」を選択して「作成」をクリックします。
- 以下のパラメータを入力します:
- リソース グループ:
Web_Test_AC_RG - ストレージ アカウント名:
cnbatedatalake - 場所:
East Asia - パフォーマンス:
Standard - 冗長性:
ローカル冗長ストレージ (LRS)
- リソース グループ:
- 「次へ: 高度」をクリックして次に進みます。
- 「階層型名前空間」の有効化設定を確認し、「レビュー + 作成」をクリックします。
- 検証が完了したら、「作成」をクリックしてアカウントを作成します。
.NET Core コンソールアプリケーションからの操作
必要な NuGet パッケージの追加
.NET Core コンソールプロジェクトを作成し、以下の NuGet パッケージを追加します。
Azure Data Lake Storage Gen2 へのアクセス用:
Install-Package Azure.Storage.Files.DataLake -Version 12.8.0
認証用:
Install-Package Azure.Identity -Version 1.5.0
コード実装 (Program.cs)
Azure で登録したサービスプリンシパルの Azure Client ID、Azure Client Secret、Azure Tenant ID をコード内の変数に設定します。
以下のコードは、指定されたストレージアカウントのコンテナ (存在しない場合は cdl コンテナを作成) 内に、my-directory という親ディレクトリと、その中の my-subdirectory という子ディレクトリを作成します。
using Azure.Identity;
using Azure.Storage.Files.DataLake;
using Azure.Storage.Files.DataLake.Models;
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
// ストレージアカウント名
var accountName = "cnbatedatalake";
// サービスプリンシパルの認証情報
var clientId = "YOUR_CLIENT_ID"; // 実際の Client ID に置き換えてください
var clientSecret = "YOUR_CLIENT_SECRET"; // 実際の Client Secret に置き換えてください
var tenantId = "YOUR_TENANT_ID"; // 実際の Tenant ID に置き換えてください
// コンテナ名
var fileSystemName = "cdl";
DataLakeServiceClient dataLakeServiceClient;
// DataLakeServiceClient の初期化
InitializeDataLakeServiceClient(out dataLakeServiceClient, accountName, clientId, clientSecret, tenantId);
// ディレクトリの作成
await CreateDirectoryStructure(dataLakeServiceClient, fileSystemName);
Console.WriteLine("ディレクトリ構造の作成が完了しました。");
Console.ReadLine();
}
/// <summary>
/// 指定されたコンテナ内にディレクトリ構造を作成します。
/// </summary>
/// <param name="serviceClient">DataLakeServiceClient インスタンス</param>
/// <param name="fileSystemName">コンテナ名</param>
/// <returns>作成された子ディレクトリのクライアント</returns>
public static async Task<DataLakeDirectoryClient> CreateDirectoryStructure(DataLakeServiceClient serviceClient, string fileSystemName)
{
// コンテナクライアントを取得
DataLakeFileSystemClient fileSystemClient = serviceClient.GetFileSystemClient(fileSystemName);
// コンテナが存在しない場合は作成
if (!await fileSystemClient.ExistsAsync())
{
await serviceClient.CreateFileSystemAsync(fileSystemName);
Console.WriteLine($"コンテナ '{fileSystemName}' を作成しました。");
}
// 親ディレクトリを作成
DataLakeDirectoryClient parentDirectoryClient = fileSystemClient.GetDirectoryClient("my-directory");
await parentDirectoryClient.CreateIfNotExistsAsync();
Console.WriteLine("親ディレクトリ 'my-directory' を作成または取得しました。");
// 子ディレクトリを作成
DataLakeDirectoryClient subDirectoryClient = parentDirectoryClient.GetSubdirectoryClient("my-subdirectory");
await subDirectoryClient.CreateIfNotExistsAsync();
Console.WriteLine("子ディレクトリ 'my-subdirectory' を作成または取得しました。");
return subDirectoryClient;
}
/// <summary>
/// DataLakeServiceClient を初期化します。
/// </summary>
/// <param name="dataLakeServiceClient">初期化される DataLakeServiceClient</param>
/// <param name="accountName">ストレージアカウント名</param>
/// <param name="clientId">クライアント ID</param>
/// <param name="clientSecret">クライアント シークレット</param>
/// <param name="tenantId">テナント ID</param>
public static void InitializeDataLakeServiceClient(out DataLakeServiceClient dataLakeServiceClient,
string accountName, string clientId, string clientSecret, string tenantId)
{
// Service Principal 認証情報を作成
TokenCredential credential = new ClientSecretCredential(tenantId, clientId, clientSecret);
// Data Lake Storage Gen2 のエンドポイント URI を構築
string dfsUri = $"https://{accountName}.dfs.core.windows.net/";
// DataLakeServiceClient をインスタンス化
dataLakeServiceClient = new DataLakeServiceClient(new Uri(dfsUri), credential);
Console.WriteLine("DataLakeServiceClient を初期化しました。");
}
}
実行と確認
コードを実行すると、Azure Data Lake Storage Gen2 の cnbatedatalake アカウント内に、cdl コンテナ、その中の my-directory 親ディレクトリ、さらにその中の my-subdirectory 子ディレクトリが作成されます。
Azure Portal でこれらのディレクトリが正常に作成されていることを確認できます。
まとめ
本稿では、.NET Core コンソールアプリケーションと Service Principal を使用して Azure Data Lake Storage Gen2 のコンテナおよびディレクトリを作成する方法を解説しました。実際のプロジェクトでは、多様なデータを Azure Data Lake に書き込む必要があり、機密情報をハードコーディングしないように注意が必要です。