Microsoft ADO.NET-drivrutin för Microsoft Fabric Data Engineering

ADO.NET är en allmänt antagen dataåtkomstteknik i .NET-ekosystemet som gör det möjligt för program att ansluta till och arbeta med data från databaser och stordataplattformar.

Microsoft ADO.NET Driver för Fabric Data Engineering låter dig koppla samman, fråga och hantera Spark-arbetsbelastningar i Fabric med samma tillförlitlighet och enkelhet som standard ADO.NET-mönster. Byggd på Fabric:s Livy-API:er erbjuder drivrutinen säker och flexibel Spark SQL-anslutning till dina .NET-applikationer med hjälp av bekanta DbConnection, DbCommand, och DbDataReader abstraktioner.

Viktiga funktioner

  • ADO.NET-API:er: Bekanta DbConnection, DbCommand, DbDataReader, DbParameter, och DbProviderFactory abstraktioner för Spark SQL-anslutning
  • Microsoft Entra-ID-autentisering: Flera autentiseringsflöden, inklusive Azure CLI, interaktiv webbläsare, klientautentiseringsuppgifter, certifikatbaserad och åtkomsttokenautentisering
  • Stöd för Spark SQL Native Query: Direktkörning av Spark SQL-instruktioner med parametriserade frågor
  • Omfattande stöd för datatyper: Stöd för alla Spark SQL-datatyper, inklusive komplexa typer (ARRAY, MAP, STRUCT)
  • Anslutningspooler: Inbyggd hantering av anslutningspooler för bättre prestanda
  • Återanvändning av session: Effektiv Spark-sessionshantering för att minska startfördröjningen
  • Sessioner med hög samtidighet: Välj att dela Fabric Livy-kapacitet med separata REPL:ar för samtidigt hyrda HC-sessioner
  • Async Prefetch: Inläsning av bakgrundsdata för bättre prestanda med stora resultatuppsättningar
  • Auto-återanslutning: Klassisk sessionsåterställning efter anslutningsfel; HC-fel upptäcks vid applikationsstyrda återförsök

Anmärkning

I Apache Spark med öppen källkod används databas och schema synonymt. Till exempel, att köra SHOW SCHEMAS eller SHOW DATABASES i en Fabric-anteckningsbok ger samma resultat — en lista över alla scheman i sjöhuset.

Förutsättningar

Innan du använder Microsoft ADO.NET Driver för Fabric Data Engineering, se till att du har:

  • .NET Runtime: .NET 8.0 eller senare
  • Fabric Access: Tillgång till en Fabric-arbetsyta med Data Engineering-funktioner
  • Autentiseringsuppgifter för Azure Entra-ID: Lämpliga autentiseringsuppgifter för autentisering
  • Workspace- och Lakehouse-ID: GUID-identifierare för din Fabric-arbetsyta och lakehouse
  • Azure CLI (valfritt): Krävs för Azure CLI-autentiseringsmetod

Ladda ned, inkludera, referera till och verifiera

Ladda ned NuGet-paket

Viktigt!

Den citerade multivärdesyntaxen HcConfOverrides som dokumenteras i denna artikel kräver 2.0.1 NuGet-paketet eller senare.

Referera till NuGet-paketet i projektet

Inkludera det nedladdade NuGet-paketet i projektet och lägg till en referens för paketet i projektfilen:

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

Verifiera installationen

Efter inkludering och referens kontrollerar du att paketet är tillgängligt i projektet:

using Microsoft.Spark.Livy.AdoNet;

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

Snabbstartsexempel

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));
}

Format för anslutningssträng

Grundläggande format

Microsoft ADO.NET-drivrutinen använder standardformatet för ADO.NET-anslutningssträngar:

Parameter1=Value1;Parameter2=Value2;...

Obligatoriska parametrar

Parameter Beskrivning Exempel
Server API-slutpunkt för Microsoft Fabric. Ange värden utan suffix för API-version. https://api.fabric.microsoft.com
SparkServerType Identifierare för servertyp Fabric
FabricWorkspaceID Microsoft Fabric-arbetsyteidentifierare (GUID) 4bbf89a8-66bb-443f-91af-df31e6a7560b
FabricLakehouseID Microsoft Fabric Lakehouse-identifierare (GUID) d8faa650-1343-496b-b9cc-d4168a676f90
AuthFlow Autentiseringsmetod AzureCli, BrowserBased, ClientSecretCredential, ClientCertificateCredential, , AuthAccessToken, FileToken

Valfria parametrar

Anslutningsinställningar

Parameter Type Standardinställning Beskrivning
LivyStatementTimeoutSeconds Heltal 600 Tid i sekunder som ska väntas för exekvering av ett kommando
HttpConnectionTimeoutInSeconds Heltal 30 Tid att vänta på en HTTP-anslutning och, när klientpoolen är uttömd, på en berättigad poolad anslutning.
SessionName String (automatiskt) Anpassat namn för Spark-sessionen
EnvironmentID universellt unik identifierare (UUID) (ingen) Valfri Fabric-miljöidentifierare för klassiska och HC-sessioner.
AutoReconnect Boolean false Aktivera återställning av klassiska sessioner. I HC-läget returneras ett stale-session-fel till applikationen och spelas inte upp transparent.

Inställningar för anslutningspool

Parameter Type Standardinställning Beskrivning
ConnectionPoolEnabled Boolean true Aktivera anslutningspooler
MinPoolSize Heltal 1 Accepteras för kompatibilitet men är för närvarande inte upprätthållet som ett förallokerat eller underhållet poolminimum.
MaxPoolSize Heltal 50 Maximalt antal sammanlagda Livy-sessioner per poolnyckel.
ValidateConnections Boolean true Fjärrvalidera poolade sessioner när de har checkats ut.
ValidationTimeoutMs Heltal 5000 Maximal valideringstid i millisekunder.

Inställningar för hög parallellism

Parameter Type Standardinställning Beskrivning
HcEnabled Boolean false Aktivera Fabric Livy High Concurrency-läge. Kräver SparkServerType=Fabric och dirigerar sessions-, instruktions-, avbrotts- och rensningsoperationer via HC-slutpunkter.
HcSessionTag String (ingen) Valfritt packningstips för delad session. Om du utelämnar värdet eller anger ett tomt värde eller ett värde som bara består av blanktecken skickar drivrutinen ingen tagg.
HcConfOverrides String (ingen) Semikolon-avgränsade tillåtna Spark-konfigurationsöverskrivningar för skapandet av HC-sessioner. Ange det fullständiga värdet när det innehåller flera överskrivningar.
hcAcquireTimeoutSeconds Heltal 300 Tidsgräns i sekunder för HC-anskaffning/sessionsklar (120..3600).
hcAcquirePollingIntervalMs Heltal 1000 HC får pollingintervall i millisekunder (50,30000 accepterat, körtidsgräns 100,5000).

Loggningsinställningar

Parameter Type Standardinställning Beskrivning
LogLevel String Information Loggnivå: Trace, Debug, Information, , WarningError
LogFilePath String %LOCALAPPDATA%\FabricSparkAdoNet\Logs på Windows Sökväg för filbaserad loggning.

Alias för flera drivrutiner: Drivrutinen accepterar JDBC- och ODBC-egenskapsnamn utöver interna ADO.NET namn (t.ex. WorkspaceId mappar till FabricWorkspaceID, LakehouseId mappar till FabricLakehouseID). Alla egenskapsnamn är skiftlägesokänsliga.

Exempel på anslutningssträngar

Grundläggande anslutning (Azure CLI-autentisering)

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

Anslutning med hög samtidighet

Hög samtidighet är tillgänglig för Microsoft Fabric-anslutningar. Sätt HcEnabled=true; de standardiserade ADO.NET-anslutnings- och kommando-API:erna förblir oförändrade. Använd den versionslösa Fabric API-värdadressen för Server; drivrutinen använder FabricVersion=v1 och LivyApiVersion=2023-12-01 som standard när den bygger HC-slutpunkten.

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}");

Fullständig vägledning för konfiguration finns i avsnittet High-Concurrency (HC) Mode.

Med alternativ för anslutningspooler

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

Med automatisk återanslutning och loggning

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

Authentication

Microsoft ADO.NET Driver stöder flera autentiseringsmetoder via Microsoft Entra-ID (tidigare Azure Active Directory). Autentisering konfigureras med hjälp av parametern AuthFlow i anslutningssträngen.

Autentiseringsmetoder

AuthFlow-värde Beskrivning Bäst för
AzureCli Använder Azure CLI-cachelagrade autentiseringsuppgifter Utveckling och testning
BrowserBased Interaktiv webbläsarbaserad autentisering Användarinriktade program
ClientSecretCredential Tjänstens huvudnamn med klienthemlighet Automatiserade tjänster, bakgrundsjobb
ClientCertificateCredential Tjänsthuvudman med certifikat Företagsprogram
AuthAccessToken Fördefinierad ägaråtkomsttoken Scenarier för anpassad autentisering

Azure CLI-autentisering

Bäst för: Utveckling och testning

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:

  • Azure CLI installerat: az --version
  • Inloggad: az login

Interaktiv webbläsarautentisering

Bäst för: Användarinriktade program

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

Beteende:

  • Öppnar ett webbläsarfönster för användarautentisering
  • Autentiseringsuppgifter cachelagras för efterföljande anslutningar

Klientautentisering (Tjänstehuvudperson)

Bäst för: Automatiserade tjänster och bakgrundsjobb

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();

Obligatoriska parametrar:

  • AuthTenantID: Azure-klientorganisations-ID
  • AuthClientID: Program-ID (klient) från Microsoft Entra-ID
  • AuthClientSecret: Klienthemlighet från Microsoft Entra-ID

Certifikatbaserad autentisering

Bäst för: Företagsprogram som kräver certifikatbaserad autentisering

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();

Obligatoriska parametrar:

  • AuthTenantID: Azure-klientorganisations-ID
  • AuthClientID: Program-ID (klient)-ID
  • AuthCertificatePath: Sökväg till PFX/PKCS12-certifikatfilen
  • AuthCertificatePassword: Certifikatlösenord

Åtkomsttokenautentisering

Bäst för: Scenarier för anpassad autentisering

// 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();

Exempel på användning

Grundläggande anslutning och fråga

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();
}

Parametriserade frågor

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 för enkla värden

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

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

ExecuteNonQuery för DML-åtgärder

// 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.");

Arbeta med stora resultatuppsättningar

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}");

Upptäckt av schema

// 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)}");
}

Använda 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();

Använda 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...

Läge för hög samtidighet (HC)

Högkonkurrensläge (HC) hjälper .NET-applikationer att köra samtidiga Spark SQL-arbetsbelastningar utan att upprätta en separat klassisk Spark-session för varje ADO.NET-anslutning. Fabric kan placera kompatibla anslutningar i samma serverhanterade Livy-session samtidigt som varje anslutning får en isolerad Read-Eval-Print Loop (REPL) för satsexekvering.

Denna modell kan minska anslutningsstarttiden, undvika upprepad Spark-sessionsprovisionering och använda Fabric Spark-kapacitet mer effektivt. Din applikation fortsätter att använda standard-ADO.NET-API:er, inklusive DbConnection, DbCommand, DbDataReader, , OpenAsyncoch Close.

HC-läget är frivilligt. Om du inte aktiverar det använder drivrutinen den klassiska Livy-sessionsvägen.

Välj mellan HC och klassiskt läge

Använd HC-läge när:

  • En ASP.NET-tjänst hanterar samtidiga förfrågningar som öppnar anslutningar och kör Spark SQL.
  • En arbetstjänst, schemalagt jobb eller parallell datapipeline skapar burstar av ADO.NET-anslutningar.
  • Flera anslutningar riktar sig mot samma Fabric-arbetsområde och lakehouse och använder kompatibla Spark-konfigurationer.
  • Att minska anslutningsstarttiden och upprepad Spark-sessionsprovisionering är viktigt.
  • Din arbetsbelastning kan använda delad, serverhanterad Spark-kapacitet samtidigt som satsexekveringen hålls isolerad av REPL.

Använd klassiskt läge när:

  • Din applikation använder bara en eller några långlivade anslutningar.
  • Varje anslutning kräver en dedikerad Spark-session för strikt arbetsbelastning eller resursisolering.
  • Anslutningar kräver väsentligt olika Spark-konfigurationer som inte borde dela en underliggande session.
  • Fabric Livy-endpointen för målarbetsytan och lakehouse stöder inte HC-läge.

Hur HC-anslutningar fungerar

När din applikation anropar Open eller OpenAsync och ingen kompatibel poolanslutning finns tillgänglig, följer drivrutinen:

  1. Begär en HC-session från Fabric.
  2. Väntar tills sessionen är klar, fram till den konfigurerade anskaffningstimeouten.
  3. Kopplar ADO.NET-anslutningen till den tilldelade HC-sessionen och REPL.
  4. Dirigerar kommandon, frågor, begäranden om avbrott och rensningsåtgärder via HC-slutpunkterna.

Separata, samtidigt hyrda HC-sessioner använder separata REPL:er. Kommandon på en anslutning delar den anslutningens HC-session och REPL.

Klientpooling är aktiverad som standard. Att stänga eller kassera en kvalificerad anslutning återför normalt dess fysiska HC-session och REPL till den processlokala poolen för återanvändning; det frigör inte nödvändigtvis tilldelningen på fjärrsidan. När poolning är inaktiverad innebär stängning av den fysiska anslutningen att rensning av HC utförs. Fortsätt använda using satser så att logiska kopplingar återkommer snabbt.

Aktivera HC-läge

HC-läget är frivilligt. Om du utelämnar hcEnabled eller sätter det till falskt, använder drivrutinen den klassiska Livy-sessionsvägen.

Ange egenskapen hcEnabled till true för att upprätta en HC-session:

hcEnabled=true;

Viktigt!

  1. För HC-anslutningar använder du den versionslösa värdadressen för Fabric API för Server. Drivrutinen tillämpar standardversionerna av Fabric och Livy API när den bygger HC-endpointen.
  2. Fastighetsnamn är inte kasuskänsliga.

Konfigurera packning av sessioner

HcSessionTag ger en anvisning på serversidan för att samla kompatibla HC-sessioner i en underliggande session i Livy. En matchande tagg garanterar inte placering i samma underliggande session.

Om du utelämnar taggen eller anger ett tomt eller endast whitespace-värde, skickar drivrutinen det inte i acquire-förfrågan. Att utelämna taggen inaktiverar inte HC-läge eller service-side packing. Sätt en explicit tagg när relaterade applikationsinstanser eller arbetsbelastningar ska beaktas för delad kapacitet. Använd en stabil, icke-känslig operativ etikett, såsom reporting-service eller nightly-etl. Inkludera inte hemligheter, åtkomsttokens, personuppgifter, kundidentifierare eller förfrågningstext.

Spark-konfigurationen påverkar också sessionskompatibiliteten. Använd HcConfOverrides för att tillhandahålla tillåtna Spark-inställningar för skapande av HC-sessioner:

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

Vid flera åsidosättningar, sätt hela HcConfOverrides-värdet inom citationstecken. Ett semikolon utan citattecken startar en annan egenskap i den yttre anslutningssträngen; det utökar inte HcConfOverrides. Parsern accepterar enkla eller dubbelciterade värden, bevarar semikolon och likvärdiga tecken inom citerade värden, och avkodar dubbla matchande citattecken ('' eller ""). Blankutrymme runt egendomsnamn och vid ytterkanterna av icke-citerade värden ignoreras. Blanktecken i ociterade värden och alla blanktecken i citerade värden bibehålls. Tomma värden åsidosätter standardvärden för miljön, och den sista dubblerade egenskapen gäller.

Du kan också låta LivyConnectionStringBuilder dig hantera offert:

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;

Dessa exempel kräver Microsoft ADO.NET Driver version 2.0.1 eller senare. Lägg till dina workspace- och lakehouse-identifierare innan du öppnar en anslutning. Båda åsidosättningarna skickas i begäran om att skapa en session i HC som separata conf-poster. Varje överskrivning måste använda en av dessa kasuskänsliga nycklar:

  • 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

Felaktigt formulerade citat avvisas utan att inkludera anslutningssträngsinnehåll i parsefelet.

Använd konsekventa taggar och konfigurationsvärden över anslutningar som är avsedda att dela kapacitet. Fabric avgör om en förfrågan kan använda en befintlig session eller om den kräver en annan session.

Konfigurera inhämtningstidpunkt

Använd följande inställningar för att styra hur länge föraren väntar på en HC-session:

Parameter Standardinställning Giltiga indata Behavior
hcAcquireTimeoutSeconds 300 120 till 3 600 sekunder Maximal tid att vänta på att HC-sessionen ska bli klar.
hcAcquirePollingIntervalMs 1000 50 till 30 000 millisekunder Intervall mellan statuskontroller. Vid körning begränsar drivrutinen värdet till mellan 100 och 5 000 millisekunder.

För de flesta arbetsbelastningar, behåll standardvärdena. Öka anskaffningstiden endast när kapacitetsstart regelbundet tar längre än fem minuter.

Använd HC-läge med anslutningspoolning

HC-läge och ADONET-anslutningspoolning adresserar olika lager:

  • HC-läget hanterar delad Fabric Spark-kapacitet och Livy-sessioner på servern.
  • ADO.NET-anslutningspoolning återanvänder drivrutinshanterade anslutningsresurser i klientapplikationen.

Du kan aktivera båda funktionerna. Anslutningspoolning minskar den upprepade etableringen av anslutningar på klientsidan, medan HC-läge minskar den upprepade etableringen av Spark-sessioner på serversidan. Anpassa anslutningspoolens storlek efter programmets förväntade samtidighet i stället för att använda en stor pool som skapar onödigt parallellt arbete.

I HC-läget AutoReconnect=true spelas inte ett misslyckat kommando upp igen transparent efter ett stale-session-fel. Applikationen får undantaget och måste avgöra om det är säkert att försöka om operationen.

Inaktivera HC-läget

För att använda klassiskt läge för nya anslutningar, ta bort HcEnabled från reťazec pripojenia eller ställ in den till false:

HcEnabled=false

Förändringen påverkar nya anslutningar och rensar inte befintliga poolade HC-sessioner. Stäng eller avsluta logiska anslutningar på vanligt sätt. Kvalificerade fysiska sessioner kan ligga kvar i klientpoolen tills de tas ur bruk.

ADO.NET begränsningar

  • Transaktioner stöds inte.
  • Kommandon stöder endast textkommandoläge. Kommandolägena lagrad procedur och direkt tabellåtkomst stöds inte.
  • Prepare gör ingenting.
  • Ett kommando måste innehålla en sats; kommandotext med flera satser avvisas.
  • Använd separata, samtidigt öppna anslutningar för samtidiga arbetsbelastningar. Kommandon på en anslutning delar dess session och REPL.

Datatypkartläggning

Drivrutinen mappar Spark SQL-datatyper till .NET-typer:

Spark SQL-typ .NET-typ DbType
Boolean bool Boolean
tinyint sbyte SByte
SMALLINT short Int16
INT int Int32
BIGINT long Int64
FLOAT float Single
Dubbel double Double
DECIMAL(p,s) decimal Decimal
STRING string String
VARCHAR(n) string String
CHAR(n) string String
BINARY byte[] Binary
DATE DateTime Datum
TIMESTAMP DateTime Datum och tid
ARRAY<T> string Objekt
MAP<K,V> string Objekt
STRUCT string Objekt

Arbeta med komplexa typer

HC-resultatsökvägen serialiserar inte pålitligt nativa nästlade ARRAY-, MAP- eller STRUCT-värden som JSON. Omvandla komplexa värden till JSON-strängar i Spark SQL innan du avserialiserar dem:

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);
}

Felsökning

Detta avsnitt ger vägledning för att lösa vanliga problem du kan stöta på när du använder Microsoft ADO.NET Driver for Fabric Data Engineering.

Vanliga problem

I följande avsnitt beskrivs vanliga problem och deras lösningar:

Anslutningsfel

Problem: Kan inte ansluta till Fabric

Lösningar:

  1. Verifiera FabricWorkspaceID och FabricLakehouseID är korrekta GUID:er
  2. Kontrollera Azure CLI-autentisering: az account show
  3. Se till att du har rätt behörigheter för Fabric-arbetsyta
  4. Verifiera nätverksanslutningen till api.fabric.microsoft.com

Autentiseringsfel

Problem: Autentiseringen misslyckas med Azure CLI

Lösningar:

  • Kör az login för att uppdatera autentiseringsuppgifter
  • Verifiera rätt klient: az account set --subscription <subscription-id>
  • Kontrollera tokens giltighet: az account get-access-token --resource https://api.fabric.microsoft.com

Timeout för frågor

Problem: Frågor som överskrider tidsgränsen för stora tabeller

Lösningar:

  • Öka timeout för instruktion: LivyStatementTimeoutSeconds=1200.
  • Använd LIMIT -sats för att begränsa resultatstorleken under utvecklingen
  • Se till att Spark-klustret har tillräckliga resurser

Anslutning eller HC-förvärvstidsavbrott

Problem: En anslutning går ut på tiden medan man väntar på en poolad anslutning eller en HC-session

Lösningar:

  • För väntetid i klientpoolen och upprättande av HTTP-anslutning, se HttpConnectionTimeoutInSeconds.
  • För HC-insamling, öka hcAcquireTimeoutSeconds inom det stödda intervallet 120 till 3 600 sekunder.
  • Kontrollera Fabric-kapacitetstillgänglighet
  • Kontrollera att arbetsytan inte har nått sessionsgränser

Aktivera loggning

När du felsöker problem kan detaljerad loggning hjälpa dig att identifiera grundorsaken. Konfigurera loggning genom anslutningssträngen:

Så här aktiverar du detaljerad loggning via anslutningssträng:

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

Om du inte ställer in LogFilePath eller en global loggkonfiguration skriver drivrutinen loggar i %LOCALAPPDATA%\FabricSparkAdoNet\Logs på Windows.

Loggnivåer:

  • Trace: Mest utförliga, innehåller alla API-anrop
  • Debug: Detaljerad felsökningsinformation
  • Information: Allmän information (standard)
  • Warning: Endast varningar
  • Error: Endast fel