Σημείωμα
Η πρόσβαση σε αυτήν τη σελίδα απαιτεί εξουσιοδότηση. Μπορείτε να δοκιμάσετε να εισέλθετε ή να αλλάξετε καταλόγους.
Η πρόσβαση σε αυτήν τη σελίδα απαιτεί εξουσιοδότηση. Μπορείτε να δοκιμάσετε να αλλάξετε καταλόγους.
ADO.NET είναι μια ευρέως διαδεδομένη τεχνολογία πρόσβασης δεδομένων στο οικοσύστημα .NET που επιτρέπει στις εφαρμογές να συνδέονται και να εργάζονται με δεδομένα από βάσεις δεδομένων και πλατφόρμες μεγάλων δεδομένων.
Το πρόγραμμα οδήγησης Microsoft ADO.NET για Fabric Data Engineering σάς επιτρέπει να συνδέετε, να υποβάλλετε ερωτήματα και να διαχειρίζεστε φόρτους εργασίας Spark στο Fabric με την αξιοπιστία και την απλότητα των τυπικών μοτίβων ADO.NET. Χτισμένο στα API Livy του Fabric, το πρόγραμμα οδήγησης παρέχει ασφαλή και ευέλικτη συνδεσιμότητα Spark SQL στις εφαρμογές σας .NET χρησιμοποιώντας γνώριμες DbConnection, DbCommandκαι DbDataReader αφαιρέσεις.
Δυνατότητες κλειδιά
-
API ADO.NET: Γνώριμα
DbConnection,DbCommand, ,DbParameterDbDataReader, καιDbProviderFactoryαφαιρέσεις για συνδεσιμότητα Spark SQL - Έλεγχος ταυτότητας Microsoft Entra ID: Πολλαπλές ροές ελέγχου ταυτότητας, συμπεριλαμβανομένου του Azure CLI, του αλληλεπιδραστικού προγράμματος περιήγησης, των διαπιστευτηρίων προγράμματος-πελάτη, του ελέγχου ταυτότητας βάσει πιστοποιητικών και του διακριτικού πρόσβασης
- Υποστήριξη εγγενών ερωτημάτων Spark SQL: Άμεση εκτέλεση προτάσεων Spark SQL με παραμετροποιημένα ερωτήματα
- Ολοκληρωμένη υποστήριξη τύπου δεδομένων: Υποστήριξη για όλους τους τύπους δεδομένων Spark SQL, συμπεριλαμβανομένων των πολύπλοκων τύπων (ARRAY, MAP, STRUCT)
- Connection Pooling: Ενσωματωμένη διαχείριση πισίνας συνδέσεων για βελτιωμένη απόδοση
- Επαναχρησιμοποίηση περιόδου λειτουργίας: Αποτελεσματική διαχείριση περιόδων λειτουργίας Spark για μείωση του λανθάνοντος χρόνου εκκίνησης
- Περίοδοι λειτουργίας υψηλής ταυτόχρονης εκτέλεσης: Συμμετοχή σε κοινόχρηστους εκχωρημένους πόρους Fabric Livy με ξεχωριστά REPL για ταυτόχρονα μισθωμένες περιόδους λειτουργίας HC
- Async Prefetch: Φόρτωση δεδομένων παρασκηνίου για βελτιωμένη απόδοση με μεγάλα σύνολα αποτελεσμάτων
- Αυτόματη επανασύνδεση: Ανάκτηση κλασικής συνεδρίας μετά από αποτυχίες σύνδεσης. Οι αποτυχίες HC εμφανίζονται για επανάληψη ελεγχόμενη από την εφαρμογή
Σημείωμα
Στο Apache Spark ανοιχτού κώδικα, η βάση δεδομένων και το σχήμα χρησιμοποιούνται συνώνυμα. Για παράδειγμα, η εκτέλεση SHOW SCHEMAS ή SHOW DATABASES σε ένα σημειωματάριο Fabric επιστρέφει το ίδιο αποτέλεσμα — μια λίστα με όλα τα σχήματα στο lakehouse.
Προϋποθέσεις
Πριν χρησιμοποιήσετε το πρόγραμμα οδήγησης Microsoft ADO.NET για Fabric Data Engineering, βεβαιωθείτε ότι έχετε:
- .NET Runtime: .NET 8.0 ή νεότερη έκδοση
- Fabric Access: Πρόσβαση σε χώρο εργασίας Fabric με δυνατότητες Data Engineering
- Azure Entra ID Credentials: Κατάλληλα διαπιστευτήρια για έλεγχο ταυτότητας
- Αναγνωριστικά χώρου εργασίας και lakehouse: Αναγνωριστικά GUID για τον χώρο εργασίας Fabric και το lakehouse
- Azure CLI (προαιρετικό): Απαιτείται για τη μέθοδο ελέγχου ταυτότητας Azure CLI
Λήψη, συμπερίληψη, αναφορά και επαλήθευση
Κατεβάστε το πακέτο NuGet
- Λήψη του προγράμματος οδήγησης Microsoft ADO.NET για Fabric Data Engineering (zip)
- Λήψη του προγράμματος οδήγησης Microsoft ADO.NET για Fabric Data Engineering (tar)
Σημαντικό
Η σύνταξη πολλαπλών τιμών HcConfOverrides που αναφέρεται σε αυτό το άρθρο απαιτεί το πακέτο NuGet 2.0.1 ή νεότερη έκδοση.
Αναφορά πακέτου NuGet στο έργο σας
Συμπεριλάβετε το πακέτο NuGet που κατεβάσατε στο έργο σας και προσθέστε μια αναφορά του πακέτου στο αρχείο του έργου σας:
<ItemGroup>
<PackageReference Include="Microsoft.Spark.Livy.AdoNet" Version="2.0.1" />
</ItemGroup>
Επαλήθευση εγκατάστασης
Μετά τη συμπερίληψη και την αναφορά, βεβαιωθείτε ότι το πακέτο είναι διαθέσιμο στο έργο σας:
using Microsoft.Spark.Livy.AdoNet;
// Verify the provider is registered
var factory = LivyProviderFactory.Instance;
Console.WriteLine($"Provider: {factory.GetType().Name}");
Παράδειγμα γρήγορης εκκίνησης
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));
}
Μορφή συμβολοσειράς σύνδεσης
Βασική μορφή
Το πρόγραμμα οδήγησης Microsoft ADO.NET χρησιμοποιεί τυπική μορφή συμβολοσειράς ADO.NET σύνδεσης:
Parameter1=Value1;Parameter2=Value2;...
Απαιτούμενες παράμετροι
| Παράμετρος | Περιγραφή | Παράδειγμα |
|---|---|---|
Server |
Τελικό σημείο Microsoft Fabric API. Καθορίστε τον κεντρικό υπολογιστή χωρίς επίθημα έκδοσης API. | https://api.fabric.microsoft.com |
SparkServerType |
Αναγνωριστικό τύπου διακομιστή | Fabric |
FabricWorkspaceID |
Αναγνωριστικό χώρου εργασίας Microsoft Fabric (GUID) | 4bbf89a8-66bb-443f-91af-df31e6a7560b |
FabricLakehouseID |
Αναγνωριστικό λίμνης Microsoft Fabric (GUID) | d8faa650-1343-496b-b9cc-d4168a676f90 |
AuthFlow |
Μέθοδο ελέγχου ταυτότητας |
AzureCli, BrowserBased, ClientSecretCredential, , ClientCertificateCredential, AuthAccessTokenFileToken |
Προαιρετικές παράμετροι
Ρυθμίσεις σύνδεσης
| Παράμετρος | Τύπος | Προεπιλεγμένος | Περιγραφή |
|---|---|---|---|
LivyStatementTimeoutSeconds |
Integer | 600 |
Χρόνος σε δευτερόλεπτα για την αναμονή για την εκτέλεση της δήλωσης |
HttpConnectionTimeoutInSeconds |
Integer | 30 |
Χρόνος αναμονής για μια σύνδεση HTTP και, όταν εξαντληθεί η ομάδα πελατών, για μια κατάλληλη συγκεντρωτική σύνδεση. |
SessionName |
Συμβλοσειρά | (αυτόματο) | Προσαρμοσμένο όνομα για την περίοδο λειτουργίας Spark |
EnvironmentID |
UUID | (καθόλου) | Προαιρετικό αναγνωριστικό περιβάλλοντος Fabric για κλασικές συνεδρίες και συνεδρίες HC. |
AutoReconnect |
Boolean | false |
Ενεργοποιήστε την ανάκτηση κλασικής συνεδρίας. Στη λειτουργία HC, μια αποτυχία μη ενημερωμένης συνεδρίας επιστρέφεται στην εφαρμογή και δεν αναπαράγεται με διαφάνεια. |
Ρυθμίσεις χώρου συγκέντρωσης συνδέσεων
| Παράμετρος | Τύπος | Προεπιλεγμένος | Περιγραφή |
|---|---|---|---|
ConnectionPoolEnabled |
Boolean | true |
Ενεργοποίηση ομαδοποίησης συνδέσεων |
MinPoolSize |
Integer | 1 |
Αποδεκτό για συμβατότητα, αλλά δεν επιβάλλεται επί του παρόντος ως ελάχιστο προκαθορισμένο ή διατηρημένο χώρο συγκέντρωσης. |
MaxPoolSize |
Integer | 50 |
Μέγιστος αριθμός συγκεντρωτικών συνεδριών Livy ανά κλειδί πισίνας. |
ValidateConnections |
Boolean | true |
Επικυρώστε τις συγκεντρωτικές συνεδρίες εξ αποστάσεως κατά την ανάληψη ελέγχου. |
ValidationTimeoutMs |
Integer | 5000 |
Μέγιστη διάρκεια επικύρωσης σε χιλιοστά του δευτερολέπτου. |
Υψηλές ρυθμίσεις ταυτοχρονισμού
| Παράμετρος | Τύπος | Προεπιλεγμένος | Περιγραφή |
|---|---|---|---|
HcEnabled |
Boolean | false |
Ενεργοποιήστε τη λειτουργία Fabric Livy High Concurrent. Απαιτεί SparkServerType=Fabric και δρομολογεί λειτουργίες περιόδου λειτουργίας, δήλωσης, ακύρωσης και εκκαθάρισης μέσω τελικών σημείων HC. |
HcSessionTag |
Συμβλοσειρά | (καθόλου) | Προαιρετική υπόδειξη συσκευασίας κοινόχρηστης περιόδου λειτουργίας. Εάν παραλείψετε την τιμή ή εισαγάγετε μια κενή τιμή ή μια τιμή μόνο με κενά διαστήματα, το πρόγραμμα οδήγησης δεν αποστέλλει ετικέτα. |
HcConfOverrides |
Συμβλοσειρά | (καθόλου) | Παρακάμψεις ρύθμισης παραμέτρων Spark οριοθετημένη με ερωτηματικό για τη δημιουργία περιόδων λειτουργίας HC. Αναφέρετε την πλήρη τιμή όταν περιέχει πολλές παρακάμψεις. |
hcAcquireTimeoutSeconds |
Integer | 300 |
Χρονικό όριο απόκτησης/ετοιμότητας συνεδρίας HC σε δευτερόλεπτα (120..3600). |
hcAcquirePollingIntervalMs |
Integer | 1000 |
Το HC αποκτά διάστημα ψηφοφορίας σε χιλιοστά του δευτερολέπτου (50..30000 αποδεκτό, σφιγκτήρας χρόνου εκτέλεσης 100..5000). |
Ρυθμίσεις καταγραφής
| Παράμετρος | Τύπος | Προεπιλεγμένος | Περιγραφή |
|---|---|---|---|
LogLevel |
Συμβλοσειρά | Information |
Επίπεδο κορμού: Trace, Debug, Information, Warning, Error |
LogFilePath |
Συμβλοσειρά |
%LOCALAPPDATA%\FabricSparkAdoNet\Logsστα Windows |
Διαδρομή για καταγραφή βάσει αρχείων. |
Ψευδώνυμα cross-driver: Το πρόγραμμα οδήγησης δέχεται ονόματα ιδιοτήτων JDBC και ODBC εκτός από τα εγγενή ονόματα ADO.NET (π.χ.
WorkspaceIdχάρτες σεFabricWorkspaceID,LakehouseIdχάρτες σεFabricLakehouseID). Όλα τα ονόματα ιδιοτήτων δεν κάνουν διάκριση πεζών-κεφαλαίων.
Παράδειγμα συμβολοσειρών σύνδεσης
Βασική σύνδεση (έλεγχος ταυτότητας Azure CLI)
Server=https://api.fabric.microsoft.com;SparkServerType=Fabric;FabricWorkspaceID=<workspace-id>;FabricLakehouseID=<lakehouse-id>;AuthFlow=AzureCli
Υψηλή ταυτόχρονη σύνδεση
Η υψηλή ταυτόχρονη εκτέλεση είναι διαθέσιμη για συνδέσεις Microsoft Fabric. Ορισμός HcEnabled=true; η τυπική σύνδεση ADO.NET και τα API εντολών παραμένουν αμετάβλητα. Χρησιμοποιήστε τον κεντρικό υπολογιστή Fabric API χωρίς έκδοση για Server; χρησιμοποιεί το πρόγραμμα οδήγησης FabricVersion=v1 και LivyApiVersion=2023-12-01 από προεπιλογή όταν δημιουργεί το τελικό σημείο 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}");
Για πλήρεις οδηγίες διαμόρφωσης, ανατρέξτε στην ενότητα ΛειτουργίαHigh-Concurrency (HC).
Με επιλογές συγκέντρωσης συνδέσεων
Server=https://api.fabric.microsoft.com;SparkServerType=Fabric;FabricWorkspaceID=<workspace-id>;FabricLakehouseID=<lakehouse-id>;AuthFlow=AzureCli;ConnectionPoolEnabled=true;MaxPoolSize=10
Με αυτόματη επανασύνδεση και καταγραφή
Server=https://api.fabric.microsoft.com;SparkServerType=Fabric;FabricWorkspaceID=<workspace-id>;FabricLakehouseID=<lakehouse-id>;AuthFlow=AzureCli;AutoReconnect=true;LogLevel=Debug
Έλεγχος ταυτότητας
Το πρόγραμμα οδήγησης Microsoft ADO.NET υποστηρίζει πολλαπλές μεθόδους ελέγχου ταυτότητας μέσω του Microsoft Entra ID (πρώην Azure Active Directory). Ο έλεγχος ταυτότητας διαμορφώνεται χρησιμοποιώντας την AuthFlow παράμετρο στη συμβολοσειρά σύνδεσης.
Μέθοδοι ελέγχου ταυτότητας
| Τιμή AuthFlow | Περιγραφή | Καλύτερο για |
|---|---|---|
AzureCli |
Χρησιμοποιεί διαπιστευτήρια στο cache του Azure CLI | Ανάπτυξη και δοκιμές |
BrowserBased |
Αλληλεπιδραστικός έλεγχος ταυτότητας μέσω προγράμματος περιήγησης | Εφαρμογές που απευθύνονται στον χρήστη |
ClientSecretCredential |
Κύρια υπηρεσία με μυστικό πελάτη | Αυτοματοποιημένες υπηρεσίες, εργασίες παρασκηνίου |
ClientCertificateCredential |
Υπεύθυνος υπηρεσίας με πιστοποιητικό | Εταιρικές εφαρμογές |
AuthAccessToken |
Προαποκτηθέν διακριτικό πρόσβασης κομιστή | Προσαρμοσμένα σενάρια ελέγχου ταυτότητας |
Έλεγχος ταυτότητας Azure CLI
Καλύτερο για: Ανάπτυξη και δοκιμή
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();
Προαπαιτούμενα:
- Εγκατεστημένο Azure CLI:
az --version - Συνδεδεμένος:
az login
Αλληλεπιδραστικός έλεγχος ταυτότητας προγράμματος περιήγησης
Καλύτερα για: Εφαρμογές που απευθύνονται στον χρήστη
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
Συμπεριφορά:
- Ανοίγει ένα παράθυρο του προγράμματος περιήγησης για έλεγχο ταυτότητας χρήστη
- Τα διαπιστευτήρια αποθηκεύονται προσωρινά για τις επόμενες συνδέσεις
Έλεγχος ταυτότητας διαπιστευτηρίων προγράμματος-πελάτη (κύρια υπηρεσία)
Καλύτερα για: Αυτοματοποιημένες υπηρεσίες και εργασίες παρασκηνίου
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();
Απαιτούμενες παράμετροι:
-
AuthTenantID: Αναγνωριστικό μισθωτή Azure -
AuthClientID: Αναγνωριστικό εφαρμογής (προγράμματος-πελάτη) από το Microsoft Entra ID -
AuthClientSecret: Μυστικός κωδικός προγράμματος-πελάτη από το Microsoft Entra ID
Έλεγχος ταυτότητας βασισμένος σε πιστοποιητικό
Ιδανικό για: Εταιρικές εφαρμογές που απαιτούν έλεγχο ταυτότητας βάσει πιστοποιητικών
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();
Απαιτούμενες παράμετροι:
-
AuthTenantID: Αναγνωριστικό μισθωτή Azure -
AuthClientID: Αναγνωριστικό εφαρμογής (προγράμματος-πελάτη) -
AuthCertificatePath: Διαδρομή προς το αρχείο πιστοποιητικού PFX/PKCS12 -
AuthCertificatePassword: Κωδικός πρόσβασης πιστοποιητικού
Έλεγχος ταυτότητας διακριτικού πρόσβασης
Ιδανικό για: Προσαρμοσμένα σενάρια ελέγχου ταυτότητας
// 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();
Παραδείγματα χρήσης
Βασική σύνδεση και ερώτημα
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();
}
Παραμετροποιημένα ερωτήματα
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 για μεμονωμένες τιμές
using var command = connection.CreateCommand();
command.CommandText = "SELECT COUNT(*) FROM customers";
var count = await command.ExecuteScalarAsync();
Console.WriteLine($"Total customers: {count}");
ExecuteNonQuery για λειτουργίες 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.");
Εργασία με μεγάλα σύνολα αποτελεσμάτων
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}");
Ανακάλυψη σχήματος
// 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)}");
}
Χρησιμοποιώντας το 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();
Χρήση του 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...
Λειτουργία υψηλής ταυτοχρονισμού (HC).
Η λειτουργία υψηλής ταυτόχρονης εκτέλεσης (HC) βοηθά τις εφαρμογές .NET να εκτελούν ταυτόχρονους φόρτους εργασίας Spark SQL χωρίς να παρέχουν ξεχωριστή κλασική περίοδο λειτουργίας Spark για κάθε σύνδεση ADO.NET. Fabric μπορεί να τοποθετήσει συμβατές συνδέσεις στην ίδια συνεδρία Livy που διαχειρίζεται ο διακομιστής, ενώ παρέχει σε κάθε σύνδεση έναν απομονωμένο βρόχοEval-Print ανάγνωσης (REPL) για την εκτέλεση εντολών.
Αυτό το μοντέλο μπορεί να μειώσει τον χρόνο εκκίνησης της σύνδεσης, να αποφύγει την επαναλαμβανόμενη παροχή περιόδων λειτουργίας Spark και να χρησιμοποιήσει τη χωρητικότητα του Fabric Spark πιο αποτελεσματικά. Η εφαρμογή σας εξακολουθεί να χρησιμοποιεί τυπικά API ADO.NET, συμπεριλαμβανομένων των DbConnection, DbCommand, DbDataReader, OpenAsyncκαι Close.
Η λειτουργία HC είναι προαιρετική. Εάν δεν το ενεργοποιήσετε, το πρόγραμμα οδήγησης χρησιμοποιεί την κλασική διαδρομή συνεδρίας Livy.
Επιλέξτε μεταξύ HC και κλασικής λειτουργίας
Χρησιμοποιήστε τη λειτουργία HC όταν:
- Μια υπηρεσία ASP.NET χειρίζεται ταυτόχρονες αιτήσεις που ανοίγουν συνδέσεις και εκτελούν το Spark SQL.
- Μια υπηρεσία εργασίας, μια προγραμματισμένη εργασία ή μια παράλληλη διοχέτευση δεδομένων δημιουργεί ριπές συνδέσεων ADO.NET.
- Πολλές συνδέσεις στοχεύουν τον ίδιο χώρο εργασίας Fabric και lakehouse και χρησιμοποιούν συμβατές ρυθμίσεις παραμέτρων Spark.
- Η μείωση του χρόνου εκκίνησης της σύνδεσης και της επαναλαμβανόμενης παροχής περιόδων λειτουργίας Spark είναι σημαντική.
- Ο φόρτος εργασίας σας μπορεί να χρησιμοποιεί κοινόχρηστη χωρητικότητα Spark διαχειριζόμενη από διακομιστή, διατηρώντας παράλληλα την εκτέλεση της πρότασης απομονωμένη από το REPL.
Χρησιμοποιήστε την κλασική λειτουργία όταν:
- Η εφαρμογή σας χρησιμοποιεί μόνο μία ή λίγες συνδέσεις μεγάλης διάρκειας.
- Κάθε σύνδεση απαιτεί μια αποκλειστική περίοδο λειτουργίας Spark για αυστηρό φόρτο εργασίας ή απομόνωση πόρων.
- Οι συνδέσεις απαιτούν ουσιαστικά διαφορετικές ρυθμίσεις παραμέτρων Spark που δεν θα πρέπει να μοιράζονται μια υποκείμενη περίοδο λειτουργίας.
- Το τελικό σημείο Fabric Livy για τον χώρο εργασίας προορισμού και το lakehouse δεν υποστηρίζει τη λειτουργία HC.
Πώς λειτουργούν οι συνδέσεις HC
Όταν η εφαρμογή σας καλεί Open ή OpenAsync δεν υπάρχει διαθέσιμη συμβατή συγκεντρωτική σύνδεση, το πρόγραμμα οδήγησης:
- Ζητά μια συνεδρία HC από το Fabric.
- Περιμένει να είναι έτοιμη η συνεδρία, μέχρι το ρυθμισμένο χρονικό όριο απόκτησης.
- Συνδέει τη σύνδεση ADO.NET με την εκχωρημένη περίοδο λειτουργίας HC και το REPL.
- Δρομολογεί εντολές, ερωτήματα, αιτήματα ακύρωσης και λειτουργίες εκκαθάρισης μέσω των τελικών σημείων HC.
Οι ξεχωριστές ταυτόχρονα μισθωμένες συνεδρίες HC χρησιμοποιούν ξεχωριστά REPL. Οι εντολές σε μία σύνδεση μοιράζονται την περίοδο λειτουργίας HC και το REPL αυτής της σύνδεσης.
Η ομαδοποίηση από την πλευρά του πελάτη είναι ενεργοποιημένη από προεπιλογή. Το κλείσιμο ή η απόρριψη μιας επιλέξιμης σύνδεσης συνήθως επιστρέφει τη φυσική περίοδο λειτουργίας HC και το REPL στον χώρο συγκέντρωσης τοπικής διεργασίας για επαναχρησιμοποίηση. Δεν αποδεσμεύει απαραίτητα την ανάθεση εξ αποστάσεως. Με τη συγκέντρωση απενεργοποιημένη, το κλείσιμο της φυσικής σύνδεσης εκτελεί εκκαθάριση HC. Συνεχίστε να χρησιμοποιείτε using προτάσεις, ώστε οι λογικές συνδέσεις να επιστρέφουν αμέσως.
Ενεργοποίηση λειτουργίας HC
Η λειτουργία HC είναι προαιρετική. Εάν το παραλείψετε hcEnabled ή το ορίσετε σε false, το πρόγραμμα οδήγησης χρησιμοποιεί την κλασική διαδρομή συνεδρίας Livy.
Ορίστε την ιδιότητα hcEnabled σε true για να αποκτήσετε μια περίοδο λειτουργίας HC:
hcEnabled=true;
Σημαντικό
- Για συνδέσεις HC, χρησιμοποιήστε τον κεντρικό υπολογιστή Fabric API χωρίς έκδοση για
Server. Το πρόγραμμα οδήγησης εφαρμόζει τις προεπιλεγμένες εκδόσεις Fabric και Livy API κατά τη δημιουργία του τελικού σημείου HC. - Τα ονόματα ιδιοτήτων δεν κάνουν διάκριση πεζών-κεφαλαίων.
Ρύθμιση συσκευασίας περιόδου λειτουργίας
HcSessionTag παρέχει μια υπόδειξη από την πλευρά του διακομιστή για τη συσκευασία συμβατών συνεδριών HC σε μια υποκείμενη συνεδρία Livy. Μια ετικέτα αντιστοίχισης δεν εγγυάται την τοποθέτηση στην ίδια υποκείμενη περίοδο σύνδεσης.
Εάν παραλείψετε την ετικέτα ή δώσετε μια κενή τιμή ή μια τιμή μόνο κενού διαστήματος, το πρόγραμμα οδήγησης δεν την στέλνει στην αίτηση απόκτησης. Η παράλειψη της ετικέτας δεν απενεργοποιεί τη λειτουργία HC ή τη συσκευασία από την πλευρά της υπηρεσίας. Ορίστε μια ρητή ετικέτα όταν θα πρέπει να ληφθούν υπόψη σχετικές παρουσίες εφαρμογών ή φόρτοι εργασίας για κοινόχρηστους εκχωρημένους πόρους. Χρησιμοποιήστε μια σταθερή, μη ευαίσθητη ετικέτα λειτουργίας, όπως reporting-service ή nightly-etl. Μην συμπεριλάβετε μυστικά, διακριτικά πρόσβασης, προσωπικά δεδομένα, αναγνωριστικά πελατών ή κείμενο ερωτήματος.
Η ρύθμιση παραμέτρων Spark επηρεάζει επίσης τη συμβατότητα περιόδων λειτουργίας. Χρησιμοποιήστε το HcConfOverrides για να παρέχετε ρυθμίσεις Spark στη λίστα επιτρεπόμενων για τη δημιουργία περιόδου λειτουργίας HC:
Server=https://api.fabric.microsoft.com;SparkServerType=Fabric;AuthFlow=AzureCli;HcEnabled=true;HcConfOverrides="spark.executor.memory=8g;spark.executor.cores=4";
Για πολλές παρακάμψεις, αναφέρετε ολόκληρη HcConfOverrides την τιμή. Ένα ερωτηματικό χωρίς εισαγωγικά ξεκινά μια άλλη ιδιότητα εξωτερικής συμβολοσειράς σύνδεσης. Δεν επεκτείνεται HcConfOverrides. Ο αναλυτής δέχεται τιμές μονών ή διπλών εισαγωγικών, διατηρεί ερωτηματικά και σύμβολα ίσον μέσα σε τιμές σε εισαγωγικά και αποκωδικοποιεί διπλά αντίστοιχα εισαγωγικά ('' ή ""). Τα κενά διαστήματα γύρω από τα ονόματα ιδιοτήτων και στα εξωτερικά άκρα των τιμών χωρίς εισαγωγικά παραβλέπονται. Τα κενά διαστήματα μέσα σε τιμές χωρίς εισαγωγικά και όλα τα κενά διαστήματα μέσα σε τιμές σε εισαγωγικά διατηρούνται. Οι κενές τιμές παρακάμπτουν τις προεπιλογές περιβάλλοντος και η τελευταία διπλότυπη ιδιότητα κερδίζει.
Μπορείτε επίσης να αφήσετε να LivyConnectionStringBuilder χειριστείτε την παράθεση:
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;
Αυτά τα παραδείγματα απαιτούν το πρόγραμμα οδήγησης Microsoft ADO.NET έκδοση 2.0.1 ή νεότερη. Προσθέστε τα αναγνωριστικά χώρου εργασίας και lakehouse πριν ανοίξετε μια σύνδεση. Και οι δύο παρακάμψεις αποστέλλονται στην αίτηση δημιουργίας-συνεδρίας HC ως ξεχωριστές conf καταχωρήσεις. Κάθε παράκαμψη πρέπει να χρησιμοποιεί ένα από αυτά τα πλήκτρα με διάκριση πεζών-κεφαλαίων:
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
Τα ακατάλληλα εισαγωγικά απορρίπτονται χωρίς να συμπεριλαμβάνονται τα περιεχόμενα της συμβολοσειράς σύνδεσης στο σφάλμα ανάλυσης.
Χρησιμοποιήστε συνεπείς ετικέτες και τιμές ρύθμισης παραμέτρων σε συνδέσεις που προορίζονται για κοινή χρήση χωρητικότητας. Fabric καθορίζει εάν μια αίτηση μπορεί να χρησιμοποιήσει μια υπάρχουσα περίοδο λειτουργίας ή απαιτεί άλλη περίοδο λειτουργίας.
Ρύθμιση παραμέτρων χρονισμού απόκτησης
Χρησιμοποιήστε τις ακόλουθες ρυθμίσεις για να ελέγξετε το χρονικό διάστημα αναμονής του προγράμματος οδήγησης για μια περίοδο λειτουργίας HC:
| Παράμετρος | Προεπιλεγμένος | Έγκυρη εισαγωγή | Συμπεριφορά |
|---|---|---|---|
hcAcquireTimeoutSeconds |
300 |
120 έως 3.600 δευτερόλεπτα | Μέγιστος χρόνος αναμονής για να είναι έτοιμη η συνεδρία HC. |
hcAcquirePollingIntervalMs |
1000 |
50 έως 30.000 χιλιοστά του δευτερολέπτου | Διάστημα μεταξύ των ελέγχων κατάστασης. Κατά το χρόνο εκτέλεσης, το πρόγραμμα οδήγησης συσφίγγει την τιμή στα 100 έως 5.000 χιλιοστά του δευτερολέπτου. |
Για τους περισσότερους φόρτους εργασίας, διατηρήστε τις προεπιλεγμένες τιμές. Αυξήστε το χρονικό όριο απόκτησης μόνο όταν η εκκίνηση των εκχωρημένων πόρων διαρκεί τακτικά περισσότερο από πέντε λεπτά.
Χρησιμοποιήστε τη λειτουργία HC με συγκέντρωση συνδέσεων
Η λειτουργία HC και η ομαδοποίηση συνδέσεων ADO.NET απευθύνονται σε διαφορετικά επίπεδα:
- Η λειτουργία HC διαχειρίζεται την κοινόχρηστη χωρητικότητα του Fabric Spark και τις περιόδους λειτουργίας Livy στον διακομιστή.
- Η ομαδοποίηση συνδέσεων ADO.NET επαναχρησιμοποιεί πόρους σύνδεσης διαχειριζόμενους από το πρόγραμμα οδήγησης στην εφαρμογή-πελάτη.
Μπορείτε να ενεργοποιήσετε και τις δύο λειτουργίες. Η ομαδοποίηση συνδέσεων μειώνει την επαναλαμβανόμενη ρύθμιση συνδέσεων από την πλευρά του υπολογιστή-πελάτη, ενώ η λειτουργία HC μειώνει την επαναλαμβανόμενη παροχή περιόδων λειτουργίας Spark από την πλευρά του διακομιστή. Διαστασιολογήστε το χώρο συγκέντρωσης συνδέσεων για την αναμενόμενη ταυτόχρονη χρήση της εφαρμογής αντί να χρησιμοποιήσετε έναν μεγάλο χώρο συγκέντρωσης για να δημιουργήσετε περιττή παράλληλη εργασία.
Στη λειτουργία HC, AutoReconnect=true το δεν αναπαράγει με διαφάνεια μια αποτυχημένη εντολή μετά από ένα σφάλμα περιόδου λειτουργίας. Η εφαρμογή λαμβάνει την εξαίρεση και πρέπει να αποφασίσει εάν η επανάληψη της λειτουργίας είναι ασφαλής.
Απενεργοποιήστε τη λειτουργία HC
Για να χρησιμοποιήσετε την κλασική λειτουργία για νέες συνδέσεις, καταργήστε HcEnabled την από τη συμβολοσειρά σύνδεσης ή ορίστε την σε false:
HcEnabled=false
Η αλλαγή επηρεάζει τις νέες συνδέσεις και δεν ξεπλένει τις υπάρχουσες συγκεντρωτικές συνεδρίες HC. Κλείστε ή απορρίψτε τις λογικές συνδέσεις κανονικά. Οι επιλέξιμες φυσικές συνεδρίες μπορούν να παραμείνουν στη δεξαμενή πελατών μέχρι να αποσυρθούν.
Περιορισμοί ADO.NET
- Οι συναλλαγές δεν υποστηρίζονται.
- Οι εντολές υποστηρίζουν μόνο τη λειτουργία εντολών κειμένου. Οι λειτουργίες εντολών αποθηκευμένης διαδικασίας και άμεσης εντολής πίνακα δεν υποστηρίζονται.
-
Prepareδεν κάνει τίποτα. - Μια εντολή πρέπει να περιέχει μία δήλωση. Το κείμενο εντολής πολλαπλών δηλώσεων απορρίπτεται.
- Χρησιμοποιήστε ξεχωριστές, ταυτόχρονα ανοιχτές συνδέσεις για ταυτόχρονους φόρτους εργασίας. Οι εντολές σε μία σύνδεση μοιράζονται τη συνεδρία και το REPL.
Αντιστοίχιση τύπου δεδομένων
Το πρόγραμμα οδήγησης αντιστοιχίζει τους τύπους δεδομένων Spark SQL σε τύπους .NET:
| Τύπος SQL Spark | Τύπος .NET | DbΤύπος |
|---|---|---|
| ΔΥΑΔΙΚΉ ΤΙΜΉ | bool |
Boolean |
| ΜΙΚΡΟΣΚΟΠΙΚΟ | sbyte |
SByte |
| SMALLINT | short |
Int16 |
| INT | int |
Ιντ32 |
| BIGINT | long |
Int64 |
| ΕΠΙΠΛΈΩ | float |
Μεμονωμένη |
| ΔΙΠΛΌΣ | double |
Διπλό |
| ΔΕΚΑΔΙΚΟΣ(p,s) | decimal |
Δεκαδικός αριθμός |
| ΣΕΙΡΆ | string |
Συμβλοσειρά |
| ΒΑΡΤΣΑΡ(ν) | string |
Συμβλοσειρά |
| CHAR(n) | string |
Συμβλοσειρά |
| ΔΥΑΔΙΚΌΣ | byte[] |
Binary |
| ΗΜΕΡΟΜΗΝΊΑ | DateTime |
Ημερομηνία |
| ΧΡΟΝΙΚΉ ΣΉΜΑΝΣΗ | DateTime |
Ημερομηνία/ώρα |
| ΣΥΣΤΟΙΧΙΑ<Τ> | string |
Αντικείμενο |
| ΧΑΡΤΗΣ<K,V> | string |
Αντικείμενο |
| ΔΟΜΗ | string |
Αντικείμενο |
Εργασία με σύνθετους τύπους
Η διαδρομή αποτελέσματος HC δεν σειριοποιεί αξιόπιστα τις εγγενείς ένθετες τιμές ARRAY, MAP ή STRUCT ως JSON. Project σύνθετες τιμές σε συμβολοσειρές JSON στο Spark SQL πριν τις αποσειριοποιήσετε:
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);
}
Αντιμετώπιση προβλημάτων
Αυτή η ενότητα παρέχει οδηγίες για την επίλυση συνηθισμένων προβλημάτων που ενδέχεται να αντιμετωπίσετε κατά τη χρήση του προγράμματος οδήγησης Microsoft ADO.NET για Fabric Data Engineering.
Συνήθη ζητήματα
Οι ακόλουθες ενότητες περιγράφουν κοινά προβλήματα και τις λύσεις τους:
Αποτυχίες σύνδεσης
Πρόβλημα: Δεν είναι δυνατή η σύνδεση στο Fabric
Λύσεις:
- Επαληθεύστε
FabricWorkspaceIDκαιFabricLakehouseIDείναι σωστά GUID - Ελέγξτε τον έλεγχο ταυτότητας Azure CLI:
az account show - Βεβαιωθείτε ότι έχετε τα κατάλληλα δικαιώματα χώρου εργασίας Fabric
- Επαληθεύστε τη συνδεσιμότητα δικτύου σε
api.fabric.microsoft.com
Σφάλματα ελέγχου ταυτότητας
Πρόβλημα: Ο έλεγχος ταυτότητας αποτυγχάνει με το Azure CLI
Λύσεις:
- Εκτέλεση
az loginγια ανανέωση διαπιστευτηρίων - Επαλήθευση σωστού μισθωτή:
az account set --subscription <subscription-id> - Ελέγξτε την εγκυρότητα του διακριτικού:
az account get-access-token --resource https://api.fabric.microsoft.com
Λήξη χρονικού ορίου ερωτήματος
Πρόβλημα: Λήξη χρονικού ορίου ερωτημάτων σε μεγάλους πίνακες
Λύσεις:
- Αύξηση χρονικού ορίου δήλωσης:
LivyStatementTimeoutSeconds=1200. - Χρήση
LIMITόρου για τον περιορισμό του μεγέθους του αποτελέσματος κατά την ανάπτυξη - Βεβαιωθείτε ότι το σύμπλεγμα Spark διαθέτει επαρκείς πόρους
Χρονικό όριο σύνδεσης ή απόκτησης HC
Πρόβλημα: Το χρονικό όριο μιας σύνδεσης λήγει κατά την αναμονή για μια συγκεντρωτική σύνδεση ή μια περίοδο λειτουργίας HC
Λύσεις:
- Για την αναμονή της ομάδας πελατών και τη δημιουργία σύνδεσης HTTP, ελέγξτε
HttpConnectionTimeoutInSecondsτο αρχείο . - Για την απόκτηση HC, αύξηση
hcAcquireTimeoutSecondsεντός του υποστηριζόμενου εύρους 120 έως 3,600 δευτερολέπτων. - Ελέγξτε τη διαθεσιμότητα εκχωρημένων πόρων Fabric
- Επαλήθευση ότι ο χώρος εργασίας δεν έχει συμπληρώσει τα όρια περιόδου λειτουργίας
Ενεργοποίηση καταγραφής
Κατά την αντιμετώπιση προβλημάτων, η λεπτομερής καταγραφή μπορεί να σας βοηθήσει να εντοπίσετε τη βασική αιτία. Διαμορφώστε την καταγραφή μέσω της συμβολοσειρά σύνδεσης:
Για να ενεργοποιήσετε τη λεπτομερή καταγραφή μέσω συμβολοσειράς σύνδεσης:
LogLevel=Debug;LogFilePath=<path-to-log-file>
Εάν δεν ορίσετε LogFilePath ή μια ρύθμιση παραμέτρων καθολικής καταγραφής, το πρόγραμμα οδήγησης εγγράφει αρχεία καταγραφής στα %LOCALAPPDATA%\FabricSparkAdoNet\Logs Windows.
Επίπεδα καταγραφής:
-
Trace: Πιο αναλυτικό, περιλαμβάνει όλες τις κλήσεις API -
Debug: Λεπτομερείς πληροφορίες εντοπισμού σφαλμάτων -
Information: Γενικές πληροφορίες (προεπιλογή) -
Warning: Μόνο προειδοποιήσεις -
Error: Μόνο σφάλματα