Driver Microsoft ADO.NET para Microsoft Fabric Data Engineering

ADO.NET é uma tecnologia de acesso a dados amplamente adotada no ecossistema .NET que permite às aplicações conectar-se e trabalhar com dados provenientes de bases de dados e plataformas de big data.

O Microsoft ADO.NET Driver for Fabric Data Engineering permite-lhe ligar, consultar e gerir cargas de trabalho Spark no Fabric com a fiabilidade e simplicidade dos padrões padrão ADO.NET. Baseado nas APIs Livy da Fabric, o driver fornece conectividade segura e flexível ao Spark SQL às suas aplicações .NET, utilizando as abstrações familiares DbConnection, DbCommand e DbDataReader.

Principais características

  • APIs de ADO.NET: Conhecidas DbConnection, DbCommand, DbDataReader, DbParameter e DbProviderFactory abstrações para conectividade com o Spark SQL
  • Autenticação Microsoft Entra ID: Múltiplos fluxos de autenticação, incluindo CLI do Azure, navegador interativo, credenciais de clientes, autenticação baseada em certificados e token de acesso
  • Suporte Nativo de Consultas SQL Spark: Execução direta de instruções SQL Spark com consultas parametrizadas
  • Suporte Abrangente de Tipos de Dados: Suporte para todos os tipos de dados SQL Spark, incluindo tipos complexos (ARRAY, MAP, STRUCT)
  • Pool de Conexões: Gestão integrada de pools de ligações para melhorar o desempenho
  • Reutilização de Sessões: Gestão eficiente das sessões Spark para reduzir a latência de arranque
  • Sessões de alta concorrência: Opte por partilhar a capacidade Fabric Livy com REPLs separados para sessões HC alugadas simultaneamente
  • Pré-busca Assíncrona: Carregamento de dados em segundo plano para melhorar o desempenho com grandes conjuntos de resultados
  • Reconexão automática: Recuperação da sessão clássica após falhas de conexão; as falhas de HC são comunicadas para nova tentativa controlada pela aplicação

Observação

No Apache Spark de código aberto, base de dados e esquema são usados como sinónimos. Por exemplo, executar SHOW SCHEMAS ou SHOW DATABASES num notebook do Fabric devolve o mesmo resultado — uma lista de todos os esquemas no lakehouse.

Pré-requisitos

Antes de usar o driver Microsoft ADO.NET para Engenharia de Dados Fabric, certifique-se de que tem:

  • .NET Runtime: .NET 8.0 ou posterior
  • Fabric Access: Acesso a um espaço de trabalho Fabric com capacidades de Engenharia de Dados
  • Azure Entra ID Credentials: Credenciais apropriadas para autenticação
  • IDs de espaço de trabalho e casa do lago: identificadores GUID para o seu espaço de trabalho Fabric e casa do lago
  • CLI do Azure (opcional): Necessário para o método de autenticação CLI do Azure

Descarregar, incluir, referenciar e verificar

Descarregar o pacote NuGet

Importante

A sintaxe multi-valor HcConfOverrides citada documentada neste artigo requer o pacote NuGet 2.0.1 ou posterior.

Pacote NuGet de referência no seu projeto

Inclua o pacote NuGet descarregado no seu projeto e adicione uma referência do pacote ao ficheiro do projeto:

<ItemGroup>
    <PackageReference Include="Microsoft.Spark.Livy.AdoNet" Version="2.0.1" />
</ItemGroup>

Verificar a instalação

Após inclusão e referência, verifique se o pacote está disponível no seu projeto:

using Microsoft.Spark.Livy.AdoNet;

// Verify the provider is registered
var factory = LivyProviderFactory.Instance;
Console.WriteLine($"Provider: {factory.GetType().Name}");

Exemplo de início rápido

using Microsoft.Spark.Livy.AdoNet;

// Connection string with required parameters
string connectionString =
    "Server=https://api.fabric.microsoft.com;" +
    "SparkServerType=Fabric;" +
    "FabricWorkspaceID=<workspace-id>;" +
    "FabricLakehouseID=<lakehouse-id>;" +
    "AuthFlow=AzureCli;";

// Create and open connection
using var connection = new LivyConnection(connectionString);
await connection.OpenAsync();

Console.WriteLine("Connected successfully!");

// Execute a query
using var command = connection.CreateCommand();
command.CommandText = "SELECT 'Hello from Fabric!' as message";

using var reader = await command.ExecuteReaderAsync();
if (await reader.ReadAsync())
{
    Console.WriteLine(reader.GetString(0));
}

Formato da cadeia de conexão

Formato básico

O Driver ADO.NET da Microsoft utiliza o formato padrão de cadeia de conexão ADO.NET.

Parameter1=Value1;Parameter2=Value2;...

Parâmetros necessários

Parâmetro Descrição Exemplo
Server Endpoint da API do Microsoft Fabric. Especifique o host sem um sufixo de versão da API. https://api.fabric.microsoft.com
SparkServerType Identificador de tipo de servidor Fabric
FabricWorkspaceID Identificador de espaço de trabalho Microsoft Fabric (GUID) 4bbf89a8-66bb-443f-91af-df31e6a7560b
FabricLakehouseID Identificador de casa de lago Microsoft Fabric (GUID) d8faa650-1343-496b-b9cc-d4168a676f90
AuthFlow Método de autenticação AzureCli, BrowserBased, ClientSecretCredential, ClientCertificateCredential, AuthAccessToken, FileToken

Parâmetros opcionais

Definições de ligação

Parâmetro Tipo Predefinição Descrição
LivyStatementTimeoutSeconds Número inteiro 600 Tempo em segundos para esperar pela execução de uma instrução
HttpConnectionTimeoutInSeconds Número inteiro 30 Tempo para esperar por uma ligação HTTP e, quando o pool de clientes estiver esgotado, por uma ligação em pool elegível.
SessionName String (automático) Nome personalizado para a sessão Spark
EnvironmentID Identificador Único Universal (UUID) (nenhum) Identificador opcional de ambiente Fabric para sessões clássicas e HC.
AutoReconnect booleano false Ative a recuperação da sessão clássica. No modo HC, uma falha de sessão obsoleta é devolvida à aplicação e não é reproduzida de forma transparente.

Definições do pool de conexão

Parâmetro Tipo Predefinição Descrição
ConnectionPoolEnabled booleano true Permitir o agrupamento de ligações
MinPoolSize Número inteiro 1 Aceite para compatibilidade, mas atualmente não é imposto como mínimo de um conjunto pré-alocado ou mantido.
MaxPoolSize Número inteiro 50 Número máximo de sessões Livy agrupadas por chave de pool.
ValidateConnections booleano true Valida as sessões agrupadas remotamente quando forem requisitadas.
ValidationTimeoutMs Número inteiro 5000 Duração máxima de validação em milissegundos.

Configurações de concorrência elevada

Parâmetro Tipo Predefinição Descrição
HcEnabled booleano false Ativar o modo de alta simultaneidade do Fabric Livy. Requer SparkServerType=Fabric e encaminha operações de sessão, declaração, cancelamento e limpeza através dos endpoints HC.
HcSessionTag String (nenhum) Sugestão opcional de empacotamento para sessão partilhada. Se omitir o valor ou introduzir um valor vazio ou composto apenas por espaços em branco, o controlador não envia uma tag.
HcConfOverrides String (nenhum) Overrides de configuração permitidos do Spark delimitados por ponto e vírgula para criação de sessões HC. Cite o valor total quando contiver múltiplos overrides.
hcAcquireTimeoutSeconds Número inteiro 300 Tempo limite do HC para aquisição/sessão pronta, em segundos (120..3600).
hcAcquirePollingIntervalMs Número inteiro 1000 HC obtém o intervalo de sondagem em milissegundos (50..30000 são aceites, limitação em tempo de execução 100..5000).

Configurações de registo

Parâmetro Tipo Predefinição Descrição
LogLevel String Information Nível de log: Trace, Debug, Information, Warning, Error
LogFilePath String %LOCALAPPDATA%\FabricSparkAdoNet\Logs no Windows Caminho para registo baseado em ficheiros.

Aliases entre drivers: O driver aceita nomes de propriedades JDBC e ODBC além dos nomes nativos de ADO.NET (por exemplo, WorkspaceId mapeia para FabricWorkspaceID, LakehouseId mapeia para FabricLakehouseID). Todos os nomes de propriedades são insensíveis a maiúsculas e minúsculas.

Exemplo de cadeias de conexão

Conexão básica (autenticação CLI do Azure)

Server=https://api.fabric.microsoft.com;SparkServerType=Fabric;FabricWorkspaceID=<workspace-id>;FabricLakehouseID=<lakehouse-id>;AuthFlow=AzureCli

Ligação de alta concorrência

Está disponível uma elevada concorrência para ligações Microsoft Fabric. Defina HcEnabled=true; as APIs padrão de ligação e comandos ADO.NET permanecem inalteradas. Utilize o host não versionado da API Fabric para Server; o controlador utiliza FabricVersion=v1 e LivyApiVersion=2023-12-01 por defeito quando constrói o endpoint HC.

using Microsoft.Spark.Livy.AdoNet;

string connectionString =
    "Server=https://api.fabric.microsoft.com;" +
    "SparkServerType=Fabric;" +
    "FabricWorkspaceID=<workspace-id>;" +
    "FabricLakehouseID=<lakehouse-id>;" +
    "AuthFlow=AzureCli;" +
    "HcEnabled=true;";

using var connection = new LivyConnection(connectionString);
await connection.OpenAsync();

using var command = connection.CreateCommand();
command.CommandText = "SELECT 1 AS value";

object? result = await command.ExecuteScalarAsync();
Console.WriteLine($"Result: {result}");

Para obter orientações completas sobre a configuração, consulte a secção Modo de Alta Concorrência (HC).

Com opções de pool de conexões

Server=https://api.fabric.microsoft.com;SparkServerType=Fabric;FabricWorkspaceID=<workspace-id>;FabricLakehouseID=<lakehouse-id>;AuthFlow=AzureCli;ConnectionPoolEnabled=true;MaxPoolSize=10

Com reconexão automática e registo

Server=https://api.fabric.microsoft.com;SparkServerType=Fabric;FabricWorkspaceID=<workspace-id>;FabricLakehouseID=<lakehouse-id>;AuthFlow=AzureCli;AutoReconnect=true;LogLevel=Debug

Authentication

O Microsoft ADO.NET Driver suporta múltiplos métodos de autenticação através do Microsoft Entra ID (anteriormente Azure Active Directory). A autenticação é configurada usando o AuthFlow parâmetro na cadeia de ligação.

Métodos de autenticação

Valor AuthFlow Descrição Melhor Para
AzureCli Usa credenciais em cache do CLI do Azure Desenvolvimento e testes
BrowserBased Autenticação interativa baseada em navegador Aplicações voltadas para o utilizador
ClientSecretCredential Principal de serviço com segredo de cliente Serviços automatizados, empregos secundários
ClientCertificateCredential Entidade de serviço com certificado Aplicações empresariais
AuthAccessToken Token de acesso pré-adquirido ao portador Cenários de autenticação personalizados

Autenticação da CLI do Azure

Melhor para: Desenvolvimento e testes

string connectionString =
    "Server=https://api.fabric.microsoft.com;" +
    "SparkServerType=Fabric;" +
    "FabricWorkspaceID=<workspace-id>;" +
    "FabricLakehouseID=<lakehouse-id>;" +
    "AuthFlow=AzureCli;";

using var connection = new LivyConnection(connectionString);
await connection.OpenAsync();

Prerequisites:

  • CLI do Azure instalado: az --version
  • Sessão iniciada: az login

Autenticação interativa do navegador

Melhor para: Aplicações voltadas para utilizadores

string connectionString =
    "Server=https://api.fabric.microsoft.com;" +
    "SparkServerType=Fabric;" +
    "FabricWorkspaceID=<workspace-id>;" +
    "FabricLakehouseID=<lakehouse-id>;" +
    "AuthFlow=BrowserBased;" +
    "AuthTenantID=<tenant-id>;";

using var connection = new LivyConnection(connectionString);
await connection.OpenAsync(); // Opens browser for authentication

Comportamento:

  • Abre uma janela do navegador para autenticação do utilizador
  • As credenciais são armazenadas em cache para ligações subsequentes

Autenticação de Credenciais do Cliente (Service Principal)

Ideal para: Serviços automatizados e tarefas em segundo plano

string connectionString =
    "Server=https://api.fabric.microsoft.com;" +
    "SparkServerType=Fabric;" +
    "FabricWorkspaceID=<workspace-id>;" +
    "FabricLakehouseID=<lakehouse-id>;" +
    "AuthFlow=ClientSecretCredential;" +
    "AuthTenantID=<tenant-id>;" +
    "AuthClientID=<client-id>;" +
    "AuthClientSecret=<client-secret>;";

using var connection = new LivyConnection(connectionString);
await connection.OpenAsync();

Parâmetros Exigidos:

  • AuthTenantID: ID de inquilino Azure
  • AuthClientID: ID da aplicação (cliente) a partir do ID Microsoft Entra
  • AuthClientSecret: Segredo do cliente do Microsoft Entra ID

Autenticação baseada em certificado

Ideal para: aplicações empresariais que requerem autenticação baseada em certificado

string connectionString =
    "Server=https://api.fabric.microsoft.com;" +
    "SparkServerType=Fabric;" +
    "FabricWorkspaceID=<workspace-id>;" +
    "FabricLakehouseID=<lakehouse-id>;" +
    "AuthFlow=ClientCertificateCredential;" +
    "AuthTenantID=<tenant-id>;" +
    "AuthClientID=<client-id>;" +
    "AuthCertificatePath=C:\\certs\\mycert.pfx;" +
    "AuthCertificatePassword=<password>;";

using var connection = new LivyConnection(connectionString);
await connection.OpenAsync();

Parâmetros Exigidos:

  • AuthTenantID: ID de inquilino Azure
  • AuthClientID: ID da aplicação (cliente)
  • AuthCertificatePath: Caminho para o ficheiro de certificado PFX/PKCS12
  • AuthCertificatePassword: Palavra-passe do certificado

Autenticação de token de acesso

Melhor para: cenários de autenticação personalizados

// Acquire token through your custom mechanism
string accessToken = await AcquireTokenFromCustomSourceAsync();

string connectionString =
    "Server=https://api.fabric.microsoft.com;" +
    "SparkServerType=Fabric;" +
    "FabricWorkspaceID=<workspace-id>;" +
    "FabricLakehouseID=<lakehouse-id>;" +
    "AuthFlow=AuthAccessToken;" +
    $"AuthAccessToken={accessToken};";

using var connection = new LivyConnection(connectionString);
await connection.OpenAsync();

Exemplos de utilização

Ligação básica e consulta

using Microsoft.Spark.Livy.AdoNet;

string connectionString =
    "Server=https://api.fabric.microsoft.com;" +
    "SparkServerType=Fabric;" +
    "FabricWorkspaceID=<workspace-id>;" +
    "FabricLakehouseID=<lakehouse-id>;" +
    "AuthFlow=AzureCli;";

using var connection = new LivyConnection(connectionString);
await connection.OpenAsync();

Console.WriteLine($"Connected! Server version: {connection.ServerVersion}");

// Execute a query
using var command = connection.CreateCommand();
command.CommandText = "SELECT * FROM employees LIMIT 10";

using var reader = await command.ExecuteReaderAsync();

// Print column names
for (int i = 0; i < reader.FieldCount; i++)
{
    Console.Write($"{reader.GetName(i)}\t");
}
Console.WriteLine();

// Print rows
while (await reader.ReadAsync())
{
    for (int i = 0; i < reader.FieldCount; i++)
    {
        Console.Write($"{reader.GetValue(i)}\t");
    }
    Console.WriteLine();
}

Consultas parametrizadas

using var command = connection.CreateCommand();
command.CommandText = "SELECT * FROM orders WHERE order_date >= @startDate AND status = @status";

// Add parameters
command.Parameters.AddWithValue("@startDate", new DateTime(2024, 1, 1));
command.Parameters.AddWithValue("@status", "completed");

using var reader = await command.ExecuteReaderAsync();
while (await reader.ReadAsync())
{
    Console.WriteLine($"Order: {reader["order_id"]}, Total: {reader["total"]:C}");
}

ExecuteScalar para um único valor

using var command = connection.CreateCommand();
command.CommandText = "SELECT COUNT(*) FROM customers";

var count = await command.ExecuteScalarAsync();
Console.WriteLine($"Total customers: {count}");

ExecuteNonQuery para operações DML

// INSERT
using var insertCommand = connection.CreateCommand();
insertCommand.CommandText = @"
    INSERT INTO employees (id, name, department, salary)
    VALUES (100, 'John Doe', 'Engineering', 85000)";

int rowsAffected = await insertCommand.ExecuteNonQueryAsync();
Console.WriteLine(rowsAffected >= 0
    ? $"Inserted {rowsAffected} row(s)"
    : "The insert completed, but the driver didn't return an update count.");

// UPDATE
using var updateCommand = connection.CreateCommand();
updateCommand.CommandText = "UPDATE employees SET salary = 90000 WHERE id = 100";

rowsAffected = await updateCommand.ExecuteNonQueryAsync();
Console.WriteLine(rowsAffected >= 0
    ? $"Updated {rowsAffected} row(s)"
    : "The update completed, but the driver didn't return an update count.");

// DELETE
using var deleteCommand = connection.CreateCommand();
deleteCommand.CommandText = "DELETE FROM employees WHERE id = 100";

rowsAffected = await deleteCommand.ExecuteNonQueryAsync();
Console.WriteLine(rowsAffected >= 0
    ? $"Deleted {rowsAffected} row(s)"
    : "The delete completed, but the driver didn't return an update count.");

Trabalhar com grandes conjuntos de resultados

using var command = connection.CreateCommand();
command.CommandText = "SELECT * FROM large_table";

using var reader = await command.ExecuteReaderAsync();

int rowCount = 0;
while (await reader.ReadAsync())
{
    // Process each row
    ProcessRow(reader);
    rowCount++;

    if (rowCount % 10000 == 0)
    {
        Console.WriteLine($"Processed {rowCount} rows...");
    }
}

Console.WriteLine($"Total rows processed: {rowCount}");

Descoberta de esquema

// List all tables
using var showTablesCommand = connection.CreateCommand();
showTablesCommand.CommandText = "SHOW TABLES";

using var tablesReader = await showTablesCommand.ExecuteReaderAsync();
Console.WriteLine("Available tables:");
while (await tablesReader.ReadAsync())
{
    int tableNameOrdinal = tablesReader.GetOrdinal("tableName");
    Console.WriteLine($"  {tablesReader.GetString(tableNameOrdinal)}");
}

// Describe table structure
using var describeCommand = connection.CreateCommand();
describeCommand.CommandText = "DESCRIBE employees";

using var schemaReader = await describeCommand.ExecuteReaderAsync();
Console.WriteLine("\nTable structure for 'employees':");
while (await schemaReader.ReadAsync())
{
    Console.WriteLine($"  {schemaReader["col_name"]}: {schemaReader["data_type"]}");
}

// Show databases
using var dbCommand = connection.CreateCommand();
dbCommand.CommandText = "SHOW DATABASES";

using var dbReader = await dbCommand.ExecuteReaderAsync();
Console.WriteLine("\nAvailable databases:");
while (await dbReader.ReadAsync())
{
    Console.WriteLine($"  {dbReader.GetString(0)}");
}

Usando LivyConnectionStringBuilder

using Microsoft.Spark.Livy.AdoNet;

var builder = new LivyConnectionStringBuilder
{
    Server = "https://api.fabric.microsoft.com",
    SparkServerType = "Fabric",
    FabricWorkspaceID = "<workspace-id>",
    FabricLakehouseID = "<lakehouse-id>",
    AuthFlow = "AzureCli",
    ConnectionPoolingEnabled = true,
    MaxPoolSize = 10
};

using var connection = new LivyConnection(builder.ConnectionString);
await connection.OpenAsync();

Usando o DbProviderFactory

using System.Data.Common;
using Microsoft.Spark.Livy.AdoNet;

// Register the provider factory (typically done at application startup)
DbProviderFactories.RegisterFactory("Microsoft.Spark.Livy.AdoNet", LivyProviderFactory.Instance);

// Create connection using factory
var factory = DbProviderFactories.GetFactory("Microsoft.Spark.Livy.AdoNet");

using var connection = factory.CreateConnection();
connection.ConnectionString = connectionString;

await connection.OpenAsync();

using var command = factory.CreateCommand();
command.Connection = connection;
command.CommandText = "SELECT * FROM employees LIMIT 5";

using var reader = await command.ExecuteReaderAsync();
// Process results...

Modo de alta concorrência (HC)

O modo de alta concorrência (HC) ajuda as aplicações .NET a executar cargas de trabalho SQL Spark simultâneas sem provisionar uma sessão clássica Spark separada para cada ligação ADO.NET. O Fabric pode colocar ligações compatíveis na mesma sessão Livy gerida pelo servidor, fornecendo a cada ligação um ciclo Ler-Avaliar-Imprimir (REPL) isolado para a execução de instruções.

Este modelo pode reduzir o tempo de arranque da ligação, evitar o provisionamento repetido das sessões Spark e utilizar a capacidade do Fabric Spark de forma mais eficiente. A sua aplicação continua a usar APIs padrão ADO.NET, incluindo DbConnection, DbCommand, DbDataReader, OpenAsync, e Close.

O modo HC é de adesão voluntária. Se não o ativares, o driver usa o caminho de sessão clássico do Livy.

Escolha entre o modo HC e o modo clássico

Use o modo HC quando:

  • Um serviço ASP.NET processa pedidos simultâneos que abrem ligações e executam consultas Spark SQL.
  • Um serviço de processamento em segundo plano, uma tarefa agendada ou um pipeline de dados paralelo cria picos de ligações ADO.NET.
  • Várias conexões apontam para o mesmo espaço de trabalho do Fabric e o mesmo lakehouse e utilizam configurações do Spark compatíveis.
  • Reduzir o tempo de arranque da ligação e o provisionamento repetido das sessões Spark é importante.
  • A sua carga de trabalho pode usar capacidade Spark partilhada e gerida pelo servidor, mantendo a execução de instruções isolada pelo REPL.

Use o modo clássico quando:

  • A sua aplicação utiliza apenas uma ou algumas ligações duradouras.
  • Cada ligação requer uma sessão Spark dedicada para carga de trabalho rigorosa ou isolamento de recursos.
  • As ligações requerem configurações Spark substancialmente diferentes que não deveriam partilhar uma sessão subjacente.
  • O ponto final do Fabric Livy para o espaço de trabalho de destino e o armazém de dados não é compatível com o modo HC.

Como funcionam as conexões HC

Quando a sua aplicação chama Open ou OpenAsync e não está disponível nenhuma ligação em pool compatível, o controlador:

  1. Solicita uma sessão HC ao Fabric.
  2. Espera que a sessão fique pronta, até ao tempo limite de aquisição configurado.
  3. Liga a ligação ADO.NET à sessão HC atribuída e ao REPL.
  4. Encaminha comandos, consultas, pedidos de cancelamento e operações de limpeza através dos endpoints HC.

Sessões HC separadas alugadas em simultâneo usam REPLs separados. Os comandos na mesma ligação partilham a sessão HC e o REPL dessa ligação.

O agrupamento no cliente está ativado por predefinição. Fechar ou eliminar uma ligação elegível normalmente devolve a sua sessão HC física e o REPL ao pool local do processo para reutilização; não liberta necessariamente a atribuição remotamente. Com o agrupamento de ligações desativado, o fecho da ligação física efetua a limpeza de HC. Continue a utilizar instruções using para que as ligações lógicas sejam devolvidas prontamente.

Ativar o modo HC

O modo HC é de adesão voluntária. Se omitir hcEnabled ou o definir como false, o controlador utiliza o caminho clássico da sessão Livy.

Defina a propriedade hcEnabled como verdadeira para obter uma sessão HC:

hcEnabled=true;

Importante

  1. Para conexões HC, utilize o anfitrião da API do Fabric sem versão para Server. O driver aplica as versões padrão da API Fabric e Livy quando constrói o endpoint HC.
  2. Os nomes das propriedades não são sensíveis a maiúsculas e minúsculas.

Configurar agrupamento de sessões

HcSessionTag fornece uma dica do lado do servidor para agrupar sessões HC compatíveis numa sessão Livy subjacente. Uma etiqueta correspondente não garante a colocação na mesma sessão subjacente.

Se omitir a etiqueta ou fornecer um valor vazio ou composto apenas por espaços em branco, o controlador não a inclui no pedido de aquisição. Omitir a etiqueta não desativa o modo HC nem o empacotamento no lado do serviço. Defina uma etiqueta explícita quando instâncias ou cargas de trabalho relacionadas devem ser consideradas para capacidade partilhada. Use um rótulo operacional estável e não sensível, como reporting-service ou nightly-etl. Não inclua segredos, tokens de acesso, dados pessoais, identificadores de clientes ou texto de consulta.

A configuração do Spark também afeta a compatibilidade da sessão. Use HcConfOverrides para fornecer as definições do Spark incluídas na lista de permissões para a criação de sessões do HC:

Server=https://api.fabric.microsoft.com;SparkServerType=Fabric;AuthFlow=AzureCli;HcEnabled=true;HcConfOverrides="spark.executor.memory=8g;spark.executor.cores=4";

Para múltiplas substituições, coloque o valor completo HcConfOverrides entre aspas. Um ponto e vírgula sem aspas inicia outra propriedade da cadeia de ligação externa; não faz parte de HcConfOverrides. O analisador aceita valores entre aspas simples ou duplas, preserva pontos e vírgulas e sinais iguais dentro dos valores entre aspas, e decodifica aspas duplicadas correspondentes ('' ou ""). Os espaços em branco em torno dos nomes das propriedades e nas extremidades dos valores sem aspas são ignorados. Os espaços em branco dentro dos valores não entre aspas e todos os espaços em branco dentro dos valores entre aspas são preservados. Valores vazios sobrepõem-se aos predeterminados do ambiente, e a última propriedade duplicada vence.

Também pode deixar que LivyConnectionStringBuilder trate das aspas:

var builder = new Microsoft.Spark.Livy.AdoNet.LivyConnectionStringBuilder
{
    Server = "https://api.fabric.microsoft.com",
    SparkServerType = "Fabric",
    FabricWorkspaceID = "<workspace-id>",
    FabricLakehouseID = "<lakehouse-id>",
    AuthFlow = "AzureCli",
    HcEnabled = true,
    HcConfOverrides = "spark.executor.memory=8g;spark.executor.cores=4"
};

string connectionString = builder.ConnectionString;

Estes exemplos requerem o Microsoft ADO.NET Driver versão 2.0.1 ou posterior. Adicione os identificadores do seu espaço de trabalho e do lago antes de abrir uma ligação. Ambos os overrides são enviados no pedido de criação de sessão HC como entradas separadas conf . Cada substituição deve usar uma destas chaves que distinguem maiúsculas de minúsculas:

  • spark.sql.shuffle.partitions
  • spark.executor.memory
  • spark.executor.cores
  • spark.driver.memory
  • spark.sql.ansi.enabled
  • spark.sql.legacy.timeParserPolicy
  • spark.sql.session.timeZone
  • livy.rsc.client.connect.timeout
  • livy.rsc.server.idle-timeout

As citações mal formadas são rejeitadas sem incluir o conteúdo da cadeia de ligação no erro de análise sintática.

Use etiquetas e valores de configuração consistentes entre ligações que pretendam partilhar capacidade. O Fabric determina se um pedido pode usar uma sessão existente ou se requer outra sessão.

Configurar a temporização da aquisição

Utilize as seguintes definições para controlar quanto tempo o controlador aguarda por uma sessão HC:

Parâmetro Predefinição Entrada válida Comportamento
hcAcquireTimeoutSeconds 300 120 a 3.600 segundos Tempo máximo para esperar que a sessão de HC esteja pronta.
hcAcquirePollingIntervalMs 1000 50 a 30.000 milissegundos Intervalo entre verificações de estado. Em tempo de execução, o controlador limita o valor ao intervalo de 100 a 5 000 milissegundos.

Para a maioria das cargas de trabalho, mantém os valores padrão. Aumente o tempo limite de aquisição apenas quando a inicialização da capacidade demorar regularmente mais de cinco minutos.

Use o modo HC com agrupamento de ligações

O modo HC e o agrupamento de ligações do ADO.NET atuam em camadas diferentes:

  • O modo HC gere a capacidade partilhada do Fabric Spark e as sessões Livy no servidor.
  • O pooling de ligações ADO.NET reutiliza recursos de ligação geridos pelo driver na aplicação cliente.

Podes ativar ambas as funcionalidades. O agrupamento de ligações reduz o estabelecimento repetido de ligações no lado do cliente, enquanto o modo HC reduz a criação repetida de sessões Spark no lado do servidor. Dimensione o pool de ligação para a concorrência esperada da aplicação em vez de usar um pool grande para criar trabalho paralelo desnecessário.

No modo HC, AutoReconnect=true não repete transparentemente um comando falhado após um erro de sessão estagnada. A aplicação recebe a exceção e deve decidir se é seguro repetir a operação.

Desativar o modo HC

Para usar o modo clássico para novas ligações, remova HcEnabled da cadeia de ligação ou defina-a parafalse:

HcEnabled=false

A alteração afeta novas ligações e não descarrega as sessões HC acumuladas existentes. Encerrar ou eliminar ligações lógicas normalmente; as sessões físicas elegíveis podem permanecer no pool de clientes até serem desativadas.

ADO.NET limitações

  • As transações não são suportadas.
  • Os comandos suportam apenas o modo de comando por texto. Os modos de comando de procedimento armazenado e de tabela direta não são suportados.
  • Prepare Não faz nada.
  • Um comando deve conter uma instrução; o texto do comando com múltiplas instruções é rejeitado.
  • Use ligações separadas e simultaneamente abertas para cargas de trabalho concorrentes. Os comandos numa mesma ligação partilham a mesma sessão e REPL.

Mapeamento de tipos de dados

O driver mapeia os tipos de dados SQL do Spark para tipos .NET:

Tipo SQL Spark Tipo .NET DbType
BOOLEANO bool booleano
TINYINT sbyte SByte
SMALLINT short Int16
INT int Int32
BIGINT long Int64
FLOAT float Solteiro
DUPLO double Double
DECIMAL(p,s) decimal Decimal
STRING string String
VARCHAR(n) string String
CHAR(n) string String
BINARY byte[] Binário
DATE DateTime Date
DATA E HORA DateTime DateTime
ARRAY<T> string Objeto
MAP<K,V> string Objeto
STRUCT string Objeto

Trabalhar com tipos complexos

O caminho de resultados HC não serializa de forma fiável valores nativos aninhados de ARRAY, MAP ou STRUCT como JSON. Converter valores complexos em strings JSON no Spark SQL antes de os desserializar:

using System.Text.Json;
using System.Collections.Generic;

using var command = connection.CreateCommand();
command.CommandText = """
    SELECT
        to_json(array_column) AS array_json,
        to_json(map_column) AS map_json,
        to_json(struct_column) AS struct_json
    FROM complex_table
    LIMIT 1
    """;

using var reader = await command.ExecuteReaderAsync();
if (await reader.ReadAsync())
{
    string arrayJson = reader.GetString(0);
    string mapJson = reader.GetString(1);
    string structJson = reader.GetString(2);

    var array = JsonSerializer.Deserialize<int[]>(arrayJson);
    var map = JsonSerializer.Deserialize<Dictionary<string, string>>(mapJson);
}

Troubleshooting

Esta secção fornece orientações para resolver problemas comuns que possa encontrar ao utilizar o Microsoft ADO.NET Driver for Fabric Data Engineering.

Problemas comuns

As secções seguintes descrevem problemas comuns e as suas soluções:

Falhas de ligação

Problema: Não consigo ligar ao Fabric

Soluções:

  1. Verifique se FabricWorkspaceID e FabricLakehouseID são GUIDs corretos
  2. Verificar a autenticação do CLI do Azure: az account show
  3. Garante que tens as permissões adequadas para o espaço de trabalho do Fabric
  4. Verificar a conectividade de rede a api.fabric.microsoft.com

Erros de autenticação

Problema: A autenticação falha com o CLI do Azure

Soluções:

  • Executar az login para atualizar as credenciais
  • Verifique o inquilino correto: az account set --subscription <subscription-id>
  • Verificar a validade do token: az account get-access-token --resource https://api.fabric.microsoft.com

Tempos limite da consulta

Problema: Consultas a exceder o tempo limite em tabelas muito grandes

Soluções:

  • Aumentar o tempo limite da instrução: LivyStatementTimeoutSeconds=1200.
  • Usar a cláusula LIMIT para restringir o tamanho do resultado durante o desenvolvimento.
  • Garantir que o cluster Spark dispõe de recursos adequados

Tempo de espera excedido na conexão ou na aquisição de HC

Problema: Uma ligação expira enquanto espera por uma ligação em pool ou uma sessão HC

Soluções:

  • Para o tempo de espera do conjunto de clientes e o estabelecimento da ligação HTTP, consulte HttpConnectionTimeoutInSeconds.
  • Para aquisição de HC, aumentar hcAcquireTimeoutSeconds dentro do intervalo suportado de 120 a 3.600 segundos.
  • Verifique a disponibilidade de capacidade da rede Fabric
  • Verificar se o workspace ainda não atingiu os limites de sessão

Ativar log

Ao resolver problemas, registos detalhados podem ajudar a identificar a causa raiz. Configurar o registo através da cadeia de ligação:

Para permitir registos detalhados através da cadeia de ligação:

LogLevel=Debug;LogFilePath=<path-to-log-file>

Se não definir LogFilePath ou uma configuração global de registo, o controlador grava os registos em %LOCALAPPDATA%\FabricSparkAdoNet\Logs no Windows.

Níveis de log:

  • Trace: O mais verboso, inclui todas as chamadas de API
  • Debug: Informação detalhada de depuração
  • Information: Informação geral (predefinição)
  • Warning: Apenas avisos
  • Error: Apenas erros