Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
ADO.NET jest powszechnie przyjętą technologią dostępu do danych w ekosystemie platformy .NET, która umożliwia aplikacjom łączenie się z danymi i pracę z danymi z baz danych i platform danych big data.
Sterownik Microsoft ADO.NET dla Fabric Data Engineering pozwala łączyć się, zapytywać i zarządzać obciążeniami Spark w Fabric z niezawodnością i prostotą standardowych wzorców ADO.NET. Sterownik, oparty na interfejsach API Livy platformy Fabric, zapewnia bezpieczną i elastyczną łączność Spark SQL dla aplikacji .NET przy użyciu znanych abstrakcji DbConnection, DbCommand i DbDataReader.
Kluczowe funkcje
-
API ADO.NET: Znane
DbConnection,DbCommand,DbDataReader,DbParameter, iDbProviderFactoryabstrakcje dla łączności Spark SQL - Microsoft Entra ID Authentication: wiele przepływów uwierzytelniania, w tym Azure CLI, przeglądarka interaktywna, poświadczenia klienta, uwierzytelnianie oparte na certyfikatach i uwierzytelnianie za pomocą tokenu dostępu
- Obsługa zapytań natywnych spark SQL: bezpośrednie wykonywanie instrukcji Spark SQL z zapytaniami sparametryzowanymi
- Kompleksowa obsługa typów danych: obsługa wszystkich typów danych Spark SQL, w tym typów złożonych (ARRAY, MAP, STRUCT)
- Buforowanie połączeń: wbudowane zarządzanie pulą połączeń dla lepszej wydajności
- Ponowne użycie sesji: wydajne zarządzanie sesjami platformy Spark w celu zmniejszenia opóźnienia uruchamiania
- Sesje o wysokiej współbieżności: Włącz współdzielone zasoby Fabric Livy z oddzielnymi środowiskami REPL dla jednocześnie przydzielanych sesji HC
- Asynchroniczne ładowanie wstępne: Ładowanie danych w tle w celu zwiększenia wydajności przy większych zestawach wyników
- Automatyczne ponowne łączenie: Przywracanie sesji klasycznej po awariach połączenia; błędy HC są zgłaszane na potrzeby ponowienia kontrolowanego przez aplikację
Uwaga / Notatka
W przypadku platformy Apache Spark typu open source baza danych i schemat są używane synonimowo. Na przykład uruchamianie SHOW SCHEMAS lub SHOW DATABASES w notatniku Fabric daje ten sam wynik — listę wszystkich schematów w domku nad jeziorem.
Wymagania wstępne
Przed użyciem sterownika Microsoft ADO.NET dla Fabric Data Engineering, upewnij się, że masz:
- Środowisko uruchomieniowe platformy .NET: .NET 8.0 lub nowszy
- Fabric Access: Dostęp do przestrzeni roboczej Fabric z możliwościami inżynierii danych
- Poświadczenia Azure Entra ID: odpowiednie poświadczenia do uwierzytelniania
- Identyfikatory obszaru roboczego i lakehouse: identyfikatory GUID dla obszaru roboczego Fabric i lakehouse
- Interfejs wiersza polecenia platformy Azure (opcjonalnie): wymagany dla metody uwierzytelniania interfejsu wiersza polecenia platformy Azure
Pobieranie, dołączanie, odwołanie i weryfikowanie
Pobieranie pakietu NuGet
- Pobierz sterownik Microsoft ADO.NET for Fabric Data Engineering (zip)
- Pobierz sterownik Microsoft ADO.NET for Fabric Data Engineering (tar)
Ważna
Cytowana składnia wielowartościowa HcConfOverrides opisana w tym artykule wymaga pakietu NuGet 2.0.1 lub nowszego.
Uwzględnij pakiet NuGet w projekcie
Dołącz pobrany pakiet NuGet do projektu i dodaj odwołanie do pakietu do pliku projektu:
<ItemGroup>
<PackageReference Include="Microsoft.Spark.Livy.AdoNet" Version="2.0.1" />
</ItemGroup>
Weryfikowanie instalacji
Po dodaniu pakietu i odwołaniu się do niego, sprawdź, czy jest on dostępny w projekcie:
using Microsoft.Spark.Livy.AdoNet;
// Verify the provider is registered
var factory = LivyProviderFactory.Instance;
Console.WriteLine($"Provider: {factory.GetType().Name}");
Przykład szybkiego startu
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 ciągu połączenia
Format podstawowy
Sterownik microsoft ADO.NET używa standardowego formatu parametrów połączenia ADO.NET:
Parameter1=Value1;Parameter2=Value2;...
Wymagane parametry
| Parametr | Opis | Przykład |
|---|---|---|
Server |
Punkt końcowy interfejsu API Microsoft Fabric. Określ host bez sufiksu wersji interfejsu API. | https://api.fabric.microsoft.com |
SparkServerType |
Identyfikator typu serwera | Fabric |
FabricWorkspaceID |
Identyfikator obszaru roboczego usługi Microsoft Fabric (GUID) | 4bbf89a8-66bb-443f-91af-df31e6a7560b |
FabricLakehouseID |
Identyfikator usługi Microsoft Fabric lakehouse (GUID) | d8faa650-1343-496b-b9cc-d4168a676f90 |
AuthFlow |
Metoda uwierzytelniania |
AzureCli, , BrowserBased, ClientSecretCredential, ClientCertificateCredential, , AuthAccessTokenFileToken |
Parametry opcjonalne
Ustawienia połączenia
| Parametr | Typ | Wartość domyślna | Opis |
|---|---|---|---|
LivyStatementTimeoutSeconds |
Integer | 600 |
Czas w sekundach oczekiwania na wykonanie instrukcji |
HttpConnectionTimeoutInSeconds |
Integer | 30 |
Czas oczekiwania na połączenie HTTP oraz, gdy pula klientów zostanie wyczerpana, na kwalifikujące się połączenie z puli. |
SessionName |
Sznurek | (automatycznie) | Nazwa niestandardowa sesji platformy Spark |
EnvironmentID |
UUID | (brak) | Opcjonalny identyfikator środowiska Fabric dla sesji klasycznych i HC. |
AutoReconnect |
logiczny | false |
Włącz odzyskiwanie sesji w trybie klasycznym. W trybie HC do aplikacji zwracany jest błąd nieaktualnej sesji i nie jest on automatycznie ponawiany w sposób niewidoczny dla aplikacji. |
Ustawienia puli połączeń
| Parametr | Typ | Wartość domyślna | Opis |
|---|---|---|---|
ConnectionPoolEnabled |
logiczny | true |
Włącz buforowanie połączeń |
MinPoolSize |
Integer | 1 |
Akceptowane ze względu na kompatybilność, ale obecnie nie jest wymagane jako minimalna wielkość puli prealokowanej lub utrzymywanej. |
MaxPoolSize |
Integer | 50 |
Maksymalna liczba sesji Livy w puli dla każdego klucza puli. |
ValidateConnections |
logiczny | true |
Weryfikuj zdalnie sesje z puli po ich pobraniu. |
ValidationTimeoutMs |
Integer | 5000 |
Maksymalny czas walidacji w milisekundach. |
Ustawienia wysokiej współbieżności
| Parametr | Typ | Wartość domyślna | Opis |
|---|---|---|---|
HcEnabled |
logiczny | false |
Włącz tryb wysokiej współbieżności Fabric Livy. Wymaga SparkServerType=Fabric i kieruje operacje sesji, instrukcji, anulowania i czyszczenia za pośrednictwem punktów końcowych HC. |
HcSessionTag |
Sznurek | (brak) | Opcjonalna wskazówka dotycząca pakowania na wspólne sesje. Jeśli pominiesz wartość lub wprowadzisz pustą wartość albo wartość składającą się wyłącznie z białych znaków, sterownik nie wyśle tagu. |
HcConfOverrides |
Sznurek | (brak) | Nadpisania konfiguracji Spark umieszczone na liście dozwolonych, rozdzielane średnikami, na potrzeby tworzenia sesji HC. Podaj pełną wartość, gdy zawiera wiele nadpisań. |
hcAcquireTimeoutSeconds |
Integer | 300 |
HC zdobywa/przygotowuje czas na sesję w kilka sekund (120..3600). |
hcAcquirePollingIntervalMs |
Integer | 1000 |
HC pobiera interwał odpytywania w milisekundach (dozwolone 50..30000, ograniczenie w czasie działania do 100..5000). |
Ustawienia rejestrowania
| Parametr | Typ | Wartość domyślna | Opis |
|---|---|---|---|
LogLevel |
Sznurek | Information |
Poziom dziennika: Trace, Debug, Information, Warning, Error |
LogFilePath |
Sznurek |
%LOCALAPPDATA%\FabricSparkAdoNet\Logs w systemie Windows |
Ścieżka do logowania opartego na plikach. |
Aliasy między sterownikami: Sterownik akceptuje nazwy właściwości JDBC i ODBC oprócz natywnych nazw ADO.NET (np.
WorkspaceIdmapuje naFabricWorkspaceID,LakehouseIdmapuje naFabricLakehouseID). Wszystkie nazwy właściwości są niewrażliwe na wielkość liter.
Przykładowe parametry połączenia
Połączenie podstawowe (uwierzytelnianie Azure CLI)
Server=https://api.fabric.microsoft.com;SparkServerType=Fabric;FabricWorkspaceID=<workspace-id>;FabricLakehouseID=<lakehouse-id>;AuthFlow=AzureCli
Połączenie o wysokiej współbieżności
Wysoka równocześność jest dostępna dla połączeń Microsoft Fabric. ustaw HcEnabled=true; standardowe API połączenia i poleceń ADO.NET pozostają bez zmian. Używaj niewersjonowanego hosta interfejsu Fabric API w przypadku Server; sterownik podczas tworzenia punktu końcowego HC domyślnie używa FabricVersion=v1 i LivyApiVersion=2023-12-01.
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}");
Pełne wskazówki dotyczące konfiguracji można znaleźć w sekcji High-Concurrency (HC) Mode .
Z opcjami buforowania połączeń
Server=https://api.fabric.microsoft.com;SparkServerType=Fabric;FabricWorkspaceID=<workspace-id>;FabricLakehouseID=<lakehouse-id>;AuthFlow=AzureCli;ConnectionPoolEnabled=true;MaxPoolSize=10
Wraz z automatycznym ponownym nawiązywaniem połączenia i rejestrowaniem
Server=https://api.fabric.microsoft.com;SparkServerType=Fabric;FabricWorkspaceID=<workspace-id>;FabricLakehouseID=<lakehouse-id>;AuthFlow=AzureCli;AutoReconnect=true;LogLevel=Debug
Uwierzytelnianie
Sterownik microsoft ADO.NET obsługuje wiele metod uwierzytelniania za pomocą identyfikatora Entra firmy Microsoft (dawniej Azure Active Directory). Uwierzytelnianie jest konfigurowane przy użyciu parametru AuthFlow w parametrach połączenia.
Metody uwierzytelniania
| Wartość AuthFlow | Opis | Najlepsze dla |
|---|---|---|
AzureCli |
Używa buforowanych poświadczeń Azure CLI | Programowanie i testowanie |
BrowserBased |
Interakcyjne uwierzytelnianie oparte na przeglądarce | Aplikacje dostępne dla użytkowników |
ClientSecretCredential |
Podmiot usługi z kluczem tajnym klienta | Zautomatyzowane usługi, zadania w tle |
ClientCertificateCredential |
Jednostka usługi z certyfikatem | Aplikacje dla przedsiębiorstw |
AuthAccessToken |
Wstępnie uzyskany token dostępu nosiciela | Scenariusze uwierzytelniania niestandardowego |
Uwierzytelnianie CLI platformy Azure
Najlepsze dla: Programowanie i testowanie
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:
- Zainstalowany interfejs wiersza polecenia platformy Azure:
az --version - Zalogowano:
az login
Uwierzytelnianie za pomocą przeglądarki interakcyjnej
Najlepsze dla: aplikacje przeznaczone dla użytkowników
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
Zachowanie:
- Otwiera okno przeglądarki na potrzeby uwierzytelniania użytkownika
- Poświadczenia są buforowane dla kolejnych połączeń
Uwierzytelnianie poświadczeń klienta (jednostki usługi)
Najlepsze dla: Zautomatyzowane usługi i zadania w tle
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();
Wymagane parametry:
-
AuthTenantID: Identyfikator dzierżawy platformy Azure -
AuthClientID: Identyfikator aplikacji (klienta) z Microsoft Entra ID -
AuthClientSecret: Tajny klucz klienta od Microsoft Entra ID
Uwierzytelnianie oparte na certyfikatach
Najlepsze rozwiązanie: Aplikacje dla przedsiębiorstw wymagające uwierzytelniania opartego na certyfikatach
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();
Wymagane parametry:
-
AuthTenantID: Identyfikator dzierżawy platformy Azure -
AuthClientID: Identyfikator aplikacji (klienta) -
AuthCertificatePath: Ścieżka do pliku certyfikatu PFX/PKCS12 -
AuthCertificatePassword: Hasło certyfikatu
Uwierzytelnianie tokenu dostępu
Najlepszy dla: niestandardowe scenariusze uwierzytelniania
// 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();
Przykłady użycia
Podstawowe połączenie i zapytanie
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();
}
Zapytania sparametryzowane
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 dla pojedynczych wartości
using var command = connection.CreateCommand();
command.CommandText = "SELECT COUNT(*) FROM customers";
var count = await command.ExecuteScalarAsync();
Console.WriteLine($"Total customers: {count}");
ExecuteNonQuery dla operacji 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.");
Praca z dużymi zestawami wyników
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}");
Odnajdywanie schematów
// 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)}");
}
Korzystanie z 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();
Korzystanie z 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...
Tryb wysokiej współbieżności (HC)
Tryb wysokiej współbieżności (HC) pomaga aplikacjom .NET uruchamiać równoczesne obciążenia Spark SQL bez konieczności przydzielania osobnej klasycznej sesji Spark dla każdego połączenia ADO.NET. Fabric może umieszczać zgodne połączenia w tej samej sesji Livy zarządzanej przez serwer, zapewniając każdemu połączeniu izolowaną pętlę odczytu, ewaluacji i wyświetlania (REPL) do wykonywania poleceń.
Model ten może skrócić czas uruchomienia połączenia, uniknąć powtarzającego się aranżowania sesji Spark oraz efektywniej wykorzystać pojemność Fabric Spark. Twoja aplikacja nadal korzysta ze standardowych API ADO.NET, w tym DbConnection, DbCommand, DbDataReader, OpenAsync, oraz Close.
Tryb HC wymaga włączenia. Jeśli go nie włączysz, sterownik korzysta z klasycznej ścieżki sesji Livy.
Wybierz między trybem HC a klasycznym
Używaj trybu HC, gdy:
- Usługa ASP.NET obsługuje jednoczesne żądania otwierające połączenia i uruchamiające Spark SQL.
- Usługa pracownicza, zaplanowane zadanie lub równoległy potok danych generuje serie połączeń ADO.NET.
- Wiele połączeń jest skierowanych do tej samej przestrzeni roboczej Fabric i domku nad jeziorem oraz wykorzystuje kompatybilne konfiguracje Spark.
- Skrócenie czasu uruchamiania połączenia i powtarzającego się udostępniania sesji w Spark jest ważne.
- Twoje obciążenie robocze może korzystać ze współdzielonej pojemności platformy Spark zarządzanej przez serwer, przy jednoczesnym zachowaniu izolacji wykonywania instrukcji przez REPL.
Użyj trybu klasycznego, gdy:
- Twoja aplikacja korzysta tylko z jednego lub kilku długotrwałych połączeń.
- Każde połączenie wymaga dedykowanej sesji Spark do ścisłej izolacji obciążenia lub zasobów.
- Połączenia wymagają znacznie innych konfiguracji Sparka, które nie powinny współdzielić bazowej sesji.
- Punkt końcowy usługi Fabric Livy dla docelowego obszaru roboczego i lakehouse nie obsługuje trybu HC.
Jak działają połączenia HC
Gdy aplikacja wywołuje Open lub OpenAsync, a żadne zgodne połączenie z puli nie jest dostępne, sterownik:
- Żąda sesji HC od Fabric.
- Czeka, aż sesja będzie gotowa, maksymalnie do skonfigurowanego limitu czasu uzyskania.
- Łączy połączenie ADO.NET z przypisaną sesją HC i REPL.
- Kieruje komendy, zapytania, żądania anulowania oraz operacje czyszczenia za pośrednictwem punktów końcowych HC.
Oddzielne, jednocześnie dzierżawione sesje HC używają oddzielnych REPL-ów. Polecenia w ramach jednego połączenia współdzielą sesję HC i REPL danego połączenia.
Pulowanie po stronie klienta jest domyślnie włączone. Zamknięcie lub usunięcie kwalifikującego się połączenia zwykle powoduje zwrócenie jego fizycznej sesji HC i REPL do puli lokalnej dla procesu w celu ponownego użycia; nie musi jednak zwalniać tego przypisania po stronie zdalnej. Po wyłączeniu puli połączeń zamknięcie fizycznego połączenia powoduje wyczyszczenie HC. Kontynuuj używanie using instrukcji, aby logiczne połączenia wracały szybko.
Włącz tryb HC
Tryb HC wymaga włączenia. Jeśli pominiesz hcEnabled lub ustawisz false, sterownik używa klasycznej ścieżki sesji Livy.
Ustaw właściwość hcEnabled na true, aby uzyskać sesję HC:
hcEnabled=true;
Ważna
- Dla połączeń HC użyj niezwersowanego hosta Fabric API dla
Server. Sterownik stosuje domyślne wersje API Fabric i Livy podczas budowania endpointu HC. - Nazwy nieruchomości nie są rozróżniane na wielka literę.
Konfiguruj pakowanie sesji
HcSessionTag udostępnia wskazówkę po stronie serwera dotyczącą grupowania zgodnych sesji HC w bazowej sesji Livy. Pasujący tag nie gwarantuje przypisania do tej samej sesji bazowej.
Jeśli pominiesz znacznik lub podasz pustą wartość albo wartość składającą się wyłącznie z białych znaków, sterownik nie wyśle jej w żądaniu uzyskania. Pominięcie tagu nie wyłącza trybu HC ani pakowania po stronie serwisowej. Ustaw jawny tag, gdy powiązane instancje aplikacji lub obciążenia mają być traktowane jako korzystające ze współdzielonej pojemności. Użyj stabilnej, niewrażliwej etykiety operacyjnej, takiej jak reporting-service lub nightly-etl. Nie zawieraj sekretów, tokenów dostępu, danych osobowych, identyfikatorów klientów ani tekstów zapytań.
Konfiguracja Spark wpływa także na zgodność sesji. Użyj HcConfOverrides, aby określić ustawienia Spark z listy dozwolonych na potrzeby tworzenia sesji HC:
Server=https://api.fabric.microsoft.com;SparkServerType=Fabric;AuthFlow=AzureCli;HcEnabled=true;HcConfOverrides="spark.executor.memory=8g;spark.executor.cores=4";
Dla wielu przejęć podaj całą HcConfOverrides wartość. Niecytowany średnik rozpoczyna kolejną właściwość zewnętrznego ciągu połączeń; nie przedłuża HcConfOverrides. Parser akceptuje wartości ujęte w pojedynczy lub podwójny cudzysłów, zachowuje średniki i znaki równości wewnątrz wartości ujętych w cudzysłów oraz dekoduje podwojone cudzysłowy tego samego typu ('' lub ""). Białe znaki wokół nazw właściwości oraz na początku i na końcu wartości nieujętych w cudzysłowy są ignorowane. Białe przestrzenie w niecytowanych wartościach oraz wszystkie odstępy wewnątrz cytowanych wartości są zachowane. Wartości puste nadpisują domyślne ustawienia środowiska, a ostatnia zduplikowana właściwość wygrywa.
Możesz też powierzyć LivyConnectionStringBuilder wycenę:
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;
Te przykłady wymagają sterownika Microsoft ADO.NET w wersji 2.0.1 lub nowszej. Dodaj identyfikatory swojego miejsca pracy i domów nad jeziorem przed otwarciem połączenia. Oba nadpisania są wysyłane w żądaniu HC create-session jako oddzielne elementy conf. Każde nadpisanie musi używać jednego z następujących kluczy z rozróżnieniem wielkości liter:
spark.sql.shuffle.partitionsspark.executor.memoryspark.executor.coresspark.driver.memoryspark.sql.ansi.enabledspark.sql.legacy.timeParserPolicyspark.sql.session.timeZonelivy.rsc.client.connect.timeoutlivy.rsc.server.idle-timeout
Nieprawidłowe cudzysłowy są odrzucane bez dołączania zawartości parametrów połączenia do komunikatu błędu analizy składniowej.
Używaj spójnych tagów i wartości konfiguracyjnych między połączeniami, które mają współdzielić pojemność. Fabric określa, czy żądanie może korzystać z istniejącej sesji, czy wymaga innej sesji.
Konfiguruj czas akwizycji
Użyj następujących ustawień, aby kontrolować, jak długo sterownik czeka na sesję HC:
| Parametr | Wartość domyślna | Prawidłowe dane wejściowe | Behavior |
|---|---|---|---|
hcAcquireTimeoutSeconds |
300 |
120 do 3600 sekund | Maksymalny czas oczekiwania na przygotowanie sesji HC. |
hcAcquirePollingIntervalMs |
1000 |
50 do 30 000 milisekund | Przerwa między kontrolami statusu. W czasie wykonywania sterownik ogranicza wartość do przedziału od 100 do 5000 milisekund. |
Dla większości obciążeń zachowaj wartości domyślne. Czas na przejęcie wydłużaj tylko wtedy, gdy uruchomienie mocy regularnie trwa dłużej niż pięć minut.
Użyj trybu HC z pulą połączeń
Tryb HC i pula połączeń ADO.NET dotyczą różnych warstw:
- Tryb HC zarządza współdzieloną pojemnością usługi Fabric Spark oraz sesjami Livy na serwerze.
- Pula połączeń w ADO.NET umożliwia ponowne wykorzystywanie zasobów połączeń zarządzanych przez sterownik w aplikacji klienckiej.
Możesz włączyć obie funkcje. Pula połączeń zmniejsza powtarzające się konfiguracje połączeń po stronie klienta, podczas gdy tryb HC ogranicza powtarzające się aprowizowanie sesji Spark po stronie serwera. Dostosuj rozmiar puli połączeń do oczekiwanego poziomu współbieżności aplikacji, zamiast używać dużej puli, co prowadzi do zbędnej pracy równoległej.
W trybie HC AutoReconnect=true nie odtwarza automatycznie nieudanego polecenia po błędzie nieaktualnej sesji. Aplikacja otrzymuje wyjątek i musi zdecydować, czy ponowne wykonanie operacji jest bezpieczne.
Wyłącz tryb HC
Aby użyć trybu klasycznego dla nowych połączeń, usuń HcEnabled z parametry połączenia lub ustaw go na:false
HcEnabled=false
Zmiana dotyczy nowych połączeń i nie usuwa istniejących połączonych sesji HC. Zamykaj lub usuwaj połączenia logiczne w normalny sposób; odpowiednie sesje fizyczne mogą pozostać w puli klienta do czasu ich wycofania.
ograniczenia ADO.NET
- Transakcje nie są obsługiwane.
- Polecenia obsługują wyłącznie tryb poleceń tekstowych. Tryby poleceń „procedura składowana” i „bezpośredni dostęp do tabeli” nie są obsługiwane.
-
PrepareNic nie robi. - Polecenie musi zawierać jedno zdanie; tekst polecenia wieloinstrukcyjny jest odrzucany.
- Używaj oddzielnych, jednocześnie otwartych połączeń dla równoczesnych obciążeń. Polecenia w ramach jednego połączenia współdzielą sesję i REPL.
Mapowanie typu danych
Sterownik mapuje typy danych Spark SQL na typy platformy .NET:
| Typ Spark SQL | typ .NET | DbType |
|---|---|---|
| BOOLEAN | bool |
logiczny |
| TINYINT | sbyte |
SByte |
| SMALLINT | short |
Int16 |
| INT | int |
Int32 |
| BIGINT | long |
Int64 |
| FLOAT | float |
Single |
| PODWÓJNY | double |
Double |
| DZIESIĘTNE (p, s) | decimal |
Decimal |
| STRING | string |
Sznurek |
| VARCHAR(n) | string |
Sznurek |
| CHAR(n) | string |
Sznurek |
| BINARY | byte[] |
Binary |
| DATE | DateTime |
Termin |
| TIMESTAMP | DateTime |
Data i czas |
| TABLICA<T> | string |
Obiekt |
| MAP<K,V> | string |
Obiekt |
| STRUCT | string |
Obiekt |
Praca z typami złożonymi
Ścieżka wynikowa HC nie serializuje w sposób niezawodny natywnych zagnieżdżonych wartości typu ARRAY, MAP ani STRUCT do formatu JSON. Konwertuj wartości złożone na ciągi JSON w Spark SQL przed deserializacją:
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
Ta sekcja dostarcza wskazówek dotyczących rozwiązania typowych problemów, na które możesz się spotkać podczas korzystania ze sterownika Microsoft ADO.NET for Fabric Data Engineering.
Typowe problemy
W poniższych sekcjach opisano typowe problemy i ich rozwiązania:
Awarie połączenia
Problem: Nie można połączyć się z Fabric
Rozwiązania:
- Sprawdź, czy
FabricWorkspaceIDiFabricLakehouseIDsą prawidłowymi identyfikatorami GUID - Sprawdź uwierzytelnianie Azure CLI:
az account show - Upewnij się, że masz odpowiednie uprawnienia obszaru roboczego usługi Fabric
- Zweryfikuj łączność sieciową z
api.fabric.microsoft.com
Błędy uwierzytelniania
Problem: Uwierzytelnianie kończy się niepowodzeniem za pomocą Azure CLI
Rozwiązania:
- Uruchom
az loginaby odświeżyć poświadczenia - Sprawdź poprawnego dzierżawcę:
az account set --subscription <subscription-id> - Sprawdź ważność tokenu:
az account get-access-token --resource https://api.fabric.microsoft.com
Limit czasu zapytania
Problem: Limit czasu zapytań w dużych tabelach
Rozwiązania:
- Zwiększ limit czasu wykonywania instrukcji:
LivyStatementTimeoutSeconds=1200. - Użyj klauzuli
LIMITdo ograniczenia rozmiaru wyniku podczas rozwoju. - Upewnij się, że klaster Spark ma odpowiednie zasoby
Limit czasu połączenia lub akwizycji HC
Problem: Upływa limit czasu połączenia podczas oczekiwania na połączenie z puli lub sesję HC
Rozwiązania:
- W przypadku oczekiwania na połączenie z puli klientów i ustanawiania połączenia HTTP zapoznaj się z
HttpConnectionTimeoutInSeconds. - Aby uzyskać HC, zwiększ wartość
hcAcquireTimeoutSecondsdo wartości z obsługiwanego zakresu od 120 do 3600 sekund. - Sprawdzanie dostępności pojemności sieci szkieletowej
- Sprawdź, czy obszar roboczy nie osiągnął limitów sesji
Włącz rejestrowanie
Podczas rozwiązywania problemów szczegółowe logowanie może pomóc zidentyfikować przyczynę źródłową. Skonfiguruj rejestrowanie za pomocą parametrów połączenia:
Aby włączyć szczegółowe rejestrowanie za pośrednictwem parametrów połączenia:
LogLevel=Debug;LogFilePath=<path-to-log-file>
Jeśli nie ustawisz LogFilePath ani globalnej konfiguracji rejestrowania, sterownik zapisuje dzienniki w lokalizacji %LOCALAPPDATA%\FabricSparkAdoNet\Logs w systemie Windows.
Poziomy logów:
-
Trace: Najbardziej szczegółowy, obejmuje wszystkie wywołania interfejsu API -
Debug: Szczegółowe informacje o debugowaniu -
Information: Ogólne informacje (ustawienie domyślne) -
Warning: Tylko ostrzeżenia -
Error: Tylko błędy