Gerir uma aplicação .NET do Azure Data Lake Analytics

Importante

O Azure Data Lake Analytics descontinuado a 29 de fevereiro de 2024. Saiba mais com este anúncio.

Para análise de dados, a sua organização pode utilizar o Azure Synapse Analytics ou o Microsoft Fabric.

Este artigo descreve como gerir contas, origens de dados, utilizadores e tarefas do Azure Data Lake Analytics com uma aplicação escrita com o SDK .NET do Azure.

Pré-requisitos

  • Visual Studio 2015, Visual Studio 2013 atualização 4 ou Visual Studio 2012 com Visual C++ instalado.
  • SDK do Microsoft Azure para .NET versão 2.5 ou superior. Instale-lo através do Instalador de Plataforma Web.
  • Pacotes NuGet Necessários

Instalar pacotes NuGet

Pacote Versão
Microsoft.Rest.ClientRuntime.Azure.Authentication 2.3.1
Microsoft.Azure.Management.DataLake.Analytics 3.0.0
Microsoft.Azure.Management.DataLake.Store 2.2.0
Microsoft.Azure.Management.ResourceManager 1.6.0-preview
Microsoft.Azure.Graph.RBAC 3.4.0-preview

Pode instalar estes pacotes através da linha de comandos NuGet com os seguintes comandos:

Install-Package -Id Microsoft.Rest.ClientRuntime.Azure.Authentication  -Version 2.3.1
Install-Package -Id Microsoft.Azure.Management.DataLake.Analytics  -Version 3.0.0
Install-Package -Id Microsoft.Azure.Management.DataLake.Store  -Version 2.2.0
Install-Package -Id Microsoft.Azure.Management.ResourceManager  -Version 1.6.0-preview
Install-Package -Id Microsoft.Azure.Graph.RBAC -Version 3.4.0-preview

Variáveis comuns

string subid = "<Subscription ID>"; // Subscription ID (a GUID)
string tenantid = "<Tenant ID>"; // AAD tenant ID or domain. For example, "contoso.onmicrosoft.com"
string rg == "<value>"; // Resource  group name
string clientid = "abcdef01-2345-6789-0abc-def012345678"; // Sample client ID

Autenticação

Tem várias opções para iniciar sessão no Azure Data Lake Analytics. O fragmento seguinte mostra um exemplo de autenticação com autenticação interativa de utilizador com um pop-up.

Para ClientID, pode utilizar o ID de um utilizador ou o ID de Aplicação (Cliente) de um principal de serviço.

using System;
using System.IO;
using System.Threading;
using System.Security.Cryptography.X509Certificates;

using Microsoft.Rest;
using Microsoft.Rest.Azure.Authentication;
using Microsoft.Azure.Management.DataLake.Analytics;
using Microsoft.Azure.Management.DataLake.Analytics.Models;
using Microsoft.Azure.Management.DataLake.Store;
using Microsoft.Azure.Management.DataLake.Store.Models;
using Microsoft.IdentityModel.Clients.ActiveDirectory;
using Microsoft.Azure.Graph.RBAC;

public static Program
{
   public static string TENANT = "microsoft.onmicrosoft.com";
   public static string CLIENTID = "abcdef01-2345-6789-0abc-def012345678";
   public static System.Uri ARM_TOKEN_AUDIENCE = new System.Uri( @"https://management.core.windows.net/");
   public static System.Uri ADL_TOKEN_AUDIENCE = new System.Uri( @"https://datalake.azure.net/" );
   public static System.Uri GRAPH_TOKEN_AUDIENCE = new System.Uri( @"https://graph.windows.net/" );

   static void Main(string[] args)
   {
      string MY_DOCUMENTS= System.Environment.GetFolderPath( System.Environment.SpecialFolder.MyDocuments);
      string TOKEN_CACHE_PATH = System.IO.Path.Combine(MY_DOCUMENTS, "my.tokencache");

      var tokenCache = GetTokenCache(TOKEN_CACHE_PATH);
      var armCreds = GetCreds_User_Popup(TENANT, ARM_TOKEN_AUDIENCE, CLIENTID, tokenCache);
      var adlCreds = GetCreds_User_Popup(TENANT, ADL_TOKEN_AUDIENCE, CLIENTID, tokenCache);
      var graphCreds = GetCreds_User_Popup(TENANT, GRAPH_TOKEN_AUDIENCE, CLIENTID, tokenCache);
   }
}

O código fonte para GetCreds_User_Popup e o código para outras opções de autenticação são abrangidos nas opções de autenticação .NET Data Lake Analytics

Criar os objetos de gestão de cliente

var resourceManagementClient = new ResourceManagementClient(armCreds) { SubscriptionId = subid };

var adlaAccountClient = new DataLakeAnalyticsAccountManagementClient(armCreds);
adlaAccountClient.SubscriptionId = subid;

var adlsAccountClient = new DataLakeStoreAccountManagementClient(armCreds);
adlsAccountClient.SubscriptionId = subid;

var adlaCatalogClient = new DataLakeAnalyticsCatalogManagementClient(adlCreds);
var adlaJobClient = new DataLakeAnalyticsJobManagementClient(adlCreds);

var adlsFileSystemClient = new DataLakeStoreFileSystemManagementClient(adlCreds);

var  graphClient = new GraphRbacManagementClient(graphCreds);
graphClient.TenantID = domain;

Gerir contas

Criar um Grupo de Recursos do Azure

Se ainda não criou um, tem de ter um Grupo de Recursos do Azure para criar os componentes Data Lake Analytics. Precisa das credenciais de autenticação, do ID da subscrição e de uma localização. O código seguinte mostra como criar um grupo de recursos:

var resourceGroup = new ResourceGroup { Location = location };
resourceManagementClient.ResourceGroups.CreateOrUpdate(groupName, rg);

Para obter mais informações, veja Grupos de Recursos do Azure e Data Lake Analytics.

Criar uma conta do Data Lake Store

Sempre que a conta do ADLA requer uma conta do ADLS. Se ainda não tiver um para utilizar, pode criar um com o seguinte código:

var new_adls_params = new DataLakeStoreAccount(location: _location);
adlsAccountClient.Account.Create(rg, adls, new_adls_params);

Criar uma conta de Data Lake Analytics

O código seguinte cria uma conta do ADLS

var new_adla_params = new DataLakeAnalyticsAccount()
{
   DefaultDataLakeStoreAccount = adls,
   Location = location
};

adlaClient.Account.Create(rg, adla, new_adla_params);

Listar contas do Data Lake Store

var adlsAccounts = adlsAccountClient.Account.List().ToList();
foreach (var adls in adlsAccounts)
{
   Console.WriteLine($"ADLS: {0}", adls.Name);
}

Listar contas Data Lake Analytics

var adlaAccounts = adlaClient.Account.List().ToList();

for (var adla in AdlaAccounts)
{
   Console.WriteLine($"ADLA: {0}, adla.Name");
}

Verificar se existe uma conta

bool exists = adlaClient.Account.Exists(rg, adla));

Obter informações sobre uma conta

bool exists = adlaClient.Account.Exists(rg, adla));
if (exists)
{
   var adla_accnt = adlaClient.Account.Get(rg, adla);
}

Eliminar uma conta

if (adlaClient.Account.Exists(rg, adla))
{
   adlaClient.Account.Delete(rg, adla);
}

Obter a conta predefinida do Data Lake Store

Cada conta Data Lake Analytics requer uma conta predefinida do Data Lake Store. Utilize este código para determinar a conta de Loja predefinida para uma conta de Análise.

if (adlaClient.Account.Exists(rg, adla))
{
  var adla_accnt = adlaClient.Account.Get(rg, adla);
  string def_adls_account = adla_accnt.DefaultDataLakeStoreAccount;
}

Gerir origens de dados

Data Lake Analytics atualmente suporta as seguintes origens de dados:

Pode criar ligações para contas de Armazenamento do Azure.

string storage_key = "xxxxxxxxxxxxxxxxxxxx";
string storage_account = "mystorageaccount";
var addParams = new AddStorageAccountParameters(storage_key);            
adlaClient.StorageAccounts.Add(rg, adla, storage_account, addParams);

Listar origens de dados do Armazenamento do Azure

var stg_accounts = adlaAccountClient.StorageAccounts.ListByAccount(rg, adla);

if (stg_accounts != null)
{
  foreach (var stg_account in stg_accounts)
  {
      Console.WriteLine($"Storage account: {0}", stg_account.Name);
  }
}

Listar origens de dados do Data Lake Store

var adls_accounts = adlsClient.Account.List();

if (adls_accounts != null)
{
  foreach (var adls_accnt in adls_accounts)
  {
      Console.WriteLine($"ADLS account: {0}", adls_accnt.Name);
  }
}

Carregar e transferir pastas e ficheiros

Pode utilizar o objeto de gestão de cliente do sistema de ficheiros do Data Lake Store para carregar e transferir ficheiros ou pastas individuais do Azure para o seu computador local com os seguintes métodos:

  • UploadFolder
  • UploadFile
  • TransferirPasta
  • DownloadFile

O primeiro parâmetro para estes métodos é o nome da Conta do Data Lake Store, seguido de parâmetros para o caminho de origem e o caminho de destino.

O exemplo seguinte mostra como transferir uma pasta no Data Lake Store.

adlsFileSystemClient.FileSystem.DownloadFolder(adls, sourcePath, destinationPath);

Criar um ficheiro numa conta do Data Lake Store

using (var memstream = new MemoryStream())
{
   using (var sw = new StreamWriter(memstream, UTF8Encoding.UTF8))
   {
      sw.WriteLine("Hello World");
      sw.Flush();
      
      memstream.Position = 0;

      adlsFileSystemClient.FileSystem.Create(adls, "/Samples/Output/randombytes.csv", memstream);
   }
}

Verificar os caminhos da conta de Armazenamento do Azure

O código seguinte verifica se existe uma conta de Armazenamento do Azure (storageAccntName) numa conta de Data Lake Analytics (analyticsAccountName) e se existe um contentor (containerName) na conta de Armazenamento do Azure.

string storage_account = "mystorageaccount";
string storage_container = "mycontainer";
bool accountExists = adlaClient.Account.StorageAccountExists(rg, adla, storage_account));
bool containerExists = adlaClient.Account.StorageContainerExists(rg, adla, storage_account, storage_container));

Gerir catálogo e tarefas

O objeto DataLakeAnalyticsCatalogManagementClient fornece métodos para gerir a base de dados SQL fornecida para cada conta do Azure Data Lake Analytics. O DataLakeAnalyticsJobManagementClient fornece métodos para submeter e gerir tarefas executadas na base de dados com scripts U-SQL.

Listar bases de dados e esquemas

Entre as várias coisas que pode listar, as mais comuns são as bases de dados e o respetivo esquema. O código seguinte obtém uma coleção de bases de dados e, em seguida, enumera o esquema para cada base de dados.

var databases = adlaCatalogClient.Catalog.ListDatabases(adla);
foreach (var db in databases)
{
  Console.WriteLine($"Database: {db.Name}");
  Console.WriteLine(" - Schemas:");
  var schemas = adlaCatalogClient.Catalog.ListSchemas(adla, db.Name);
  foreach (var schm in schemas)
  {
      Console.WriteLine($"\t{schm.Name}");
  }
}

Listar colunas de tabela

O código seguinte mostra como aceder à base de dados com um cliente de gestão do Catálogo Data Lake Analytics para listar as colunas numa tabela especificada.

var tbl = adlaCatalogClient.Catalog.GetTable(adla, "master", "dbo", "MyTableName");
IEnumerable<USqlTableColumn> columns = tbl.ColumnList;

foreach (USqlTableColumn utc in columns)
{
  Console.WriteLine($"\t{utc.Name}");
}

Submeter uma tarefa de U-SQL

O código seguinte mostra como utilizar um cliente de gestão de tarefas Data Lake Analytics para submeter uma tarefa.

string scriptPath = "/Samples/Scripts/SearchResults_Wikipedia_Script.txt";
Stream scriptStrm = adlsFileSystemClient.FileSystem.Open(_adlsAccountName, scriptPath);
string scriptTxt = string.Empty;
using (StreamReader sr = new StreamReader(scriptStrm))
{
    scriptTxt = sr.ReadToEnd();
}

var jobName = "SR_Wikipedia";
var jobId = Guid.NewGuid();
var properties = new USqlJobProperties(scriptTxt);
var parameters = new JobInformation(jobName, JobType.USql, properties, priority: 1, degreeOfParallelism: 1, jobId: jobId);
var jobInfo = adlaJobClient.Job.Create(adla, jobId, parameters);
Console.WriteLine($"Job {jobName} submitted.");

Lista de tarefas falhadas

O código seguinte lista informações sobre tarefas que falharam.

var odq = new ODataQuery<JobInformation> { Filter = "result eq 'Failed'" };
var jobs = adlaJobClient.Job.List(adla, odq);
foreach (var j in jobs)
{
   Console.WriteLine($"{j.Name}\t{j.JobId}\t{j.Type}\t{j.StartTime}\t{j.EndTime}");
}

Listar pipelines

O código seguinte lista informações sobre cada pipeline de tarefas submetidas para a conta.

var pipelines = adlaJobClient.Pipeline.List(adla);
foreach (var p in pipelines)
{
   Console.WriteLine($"Pipeline: {p.Name}\t{p.PipelineId}\t{p.LastSubmitTime}");
}

Listar periodicidades

O código seguinte lista informações sobre cada periodicidade das tarefas submetidas para a conta.

var recurrences = adlaJobClient.Recurrence.List(adla);
foreach (var r in recurrences)
{
   Console.WriteLine($"Recurrence: {r.Name}\t{r.RecurrenceId}\t{r.LastSubmitTime}");
}

Cenários de gráficos comuns

Procurar utilizador no diretório Microsoft Entra ID

var userinfo = graphClient.Users.Get( "bill@contoso.com" );

Obter o ObjectId de um utilizador no diretório Microsoft Entra ID

var userinfo = graphClient.Users.Get( "bill@contoso.com" );
Console.WriteLine( userinfo.ObjectId )

Gerir políticas de computação

O objeto DataLakeAnalyticsAccountManagementClient fornece métodos para gerir as políticas de computação de uma conta Data Lake Analytics.

Listar políticas de computação

O código seguinte obtém uma lista de políticas de computação para uma conta Data Lake Analytics.

var policies = adlaAccountClient.ComputePolicies.ListByAccount(rg, adla);
foreach (var p in policies)
{
   Console.WriteLine($"Name: {p.Name}\tType: {p.ObjectType}\tMax AUs / job: {p.MaxDegreeOfParallelismPerJob}\tMin priority / job: {p.MinPriorityPerJob}");
}

Criar uma nova política de computação

O código seguinte cria uma nova política de computação para uma conta de Data Lake Analytics, definindo as AUs máximas disponíveis para o utilizador especificado como 50 e a prioridade mínima da tarefa para 250.

var userAadObjectId = "3b097601-4912-4d41-b9d2-78672fc2acde";
var newPolicyParams = new ComputePolicyCreateOrUpdateParameters(userAadObjectId, "User", 50, 250);
adlaAccountClient.ComputePolicies.CreateOrUpdate(rg, adla, "GaryMcDaniel", newPolicyParams);

Passos seguintes