หมายเหตุ
การเข้าถึงหน้านี้ต้องได้รับการอนุญาต คุณสามารถลอง ลงชื่อเข้าใช้หรือเปลี่ยนไดเรกทอรีได้
การเข้าถึงหน้านี้ต้องได้รับการอนุญาต คุณสามารถลองเปลี่ยนไดเรกทอรีได้
ADO.NET เป็นเทคโนโลยีการเข้าถึงข้อมูลที่นํามาใช้อย่างแพร่หลายในระบบนิเวศ .NET ที่ช่วยให้แอปพลิเคชันสามารถเชื่อมต่อและทํางานกับข้อมูลจากฐานข้อมูลและแพลตฟอร์มข้อมูลขนาดใหญ่ได้
ไดรเวอร์ Microsoft ADO.NET สําหรับ Fabric Data Engineering ช่วยให้คุณเชื่อมต่อ สืบค้น และจัดการงาน Spark ใน Fabric ด้วยความน่าเชื่อถือและความเรียบง่ายของรูปแบบมาตรฐาน ADO.NET ไดรเวอร์นี้สร้างขึ้นบน Fabric Livy APIs เพื่อให้การเชื่อมต่อ Spark SQL ที่ปลอดภัยและยืดหยุ่นกับแอปพลิเคชัน .NET ของคุณโดยใช้ , DbConnection, และDbCommandนามธรรมที่คุ้นเคยDbDataReader
คุณลักษณะสำคัญ
-
ADO.NET APIs: นามธรรมที่คุ้นเคย
DbConnection,DbCommand,DbDataReader, ,DbParameter, และ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 จะถูกแสดงให้เห็นสําหรับการลองใหม่ที่ควบคุมโดยแอปพลิเคชัน
Note
ใน Apache Spark แบบโอเพ่นซอร์ส ฐานข้อมูลและสคีมาจะถูกใช้เหมือนกัน ตัวอย่างเช่น การรันSHOW SCHEMASหรือSHOW DATABASESในสมุดบันทึก Fabric จะได้ผลลัพธ์เดียวกัน — คือรายการสคีมาทั้งหมดในบ้านพักริมทะเลสาบ
ข้อกำหนดเบื้องต้น
ก่อนใช้ไดรเวอร์ Microsoft ADO.NET สําหรับ Fabric Data Engineering โปรดตรวจสอบให้แน่ใจว่าคุณมี:
- รันไทม์ .NET: .NET 8.0 หรือใหม่กว่า
- Fabric Access: การเข้าถึงพื้นที่ทํางาน Fabric ด้วยความสามารถด้านวิศวกรรมข้อมูล
- ข้อมูลประจําตัว Azure Entra ID: ข้อมูลประจําตัวที่เหมาะสมสําหรับการรับรองความถูกต้อง
- รหัสพื้นที่ทํางานและเลคเฮาส์: ตัวระบุ GUID สําหรับพื้นที่ทํางาน Fabric และเลคเฮาส์ของคุณ
- 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 |
เลขจำนวนเต็ม | 600 |
เวลาเป็นวินาทีเพื่อรอการดําเนินการคําสั่ง |
HttpConnectionTimeoutInSeconds |
เลขจำนวนเต็ม | 30 |
ถึงเวลารอการเชื่อมต่อ HTTP และเมื่อพูลไคลเอนต์หมดแล้ว ให้รอการเชื่อมต่อพูลที่มีสิทธิ์ |
SessionName |
สตริง | (อัตโนมัติ) | ชื่อที่กําหนดเองสําหรับเซสชัน Spark |
EnvironmentID |
ยูอี | (ไม่มี) | ตัวระบุสภาพแวดล้อม Fabric แบบเสริมสําหรับเซสชันคลาสสิกและ HC |
AutoReconnect |
แบบบูลีน | false |
เปิดใช้งานการกู้คืนเซสชันแบบคลาสสิก ในโหมด HC ความล้มเหลวของเซสชันที่หยุดเต้นจะถูกส่งกลับไปยังแอปพลิเคชันและจะไม่ถูกเล่นซ้ําอย่างโปร่งใส |
การตั้งค่าพูลการเชื่อมต่อ
| พารามิเตอร์ | ประเภท | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
ConnectionPoolEnabled |
แบบบูลีน | true |
เปิดใช้งานการรวมการเชื่อมต่อ |
MinPoolSize |
เลขจำนวนเต็ม | 1 |
ได้รับการยอมรับในเรื่องความเข้าข้างได้ แต่ยังไม่ได้บังคับใช้เป็นพูลขั้นต่ําที่กําหนดไว้ล่วงหน้าหรือดูแลไว้ |
MaxPoolSize |
เลขจำนวนเต็ม | 50 |
จํานวนเซสชัน Livy ที่รวมกันสูงสุดต่อคีย์สระว่ายน้ํา |
ValidateConnections |
แบบบูลีน | true |
ตรวจสอบความถูกต้องของเซสชันที่รวมกันจากระยะไกลเมื่อมีการเช็คเอาท์ |
ValidationTimeoutMs |
เลขจำนวนเต็ม | 5000 |
ระยะเวลาการตรวจสอบสูงสุดเป็นมิลลิวินาที |
การตั้งค่าการทํางานพร้อมกันสูง
| พารามิเตอร์ | ประเภท | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
HcEnabled |
แบบบูลีน | false |
เปิดใช้งานโหมด Fabric Livy แบบ High Concurrency ต้องการ SparkServerType=Fabric และส่งเส้นทางการดําเนินการเซสชัน, คําสั่ง, ยกเลิก และการทําความสะอาดผ่านปลายทาง HC |
HcSessionTag |
สตริง | (ไม่มี) | เคล็ดลับการบรรจุเซสชันร่วมเป็นทางเลือก หากคุณละเว้นค่าหรือใส่ค่าว่างเปล่าหรือมีเฉพาะช่องว่าง ไดรเวอร์จะไม่ส่งแท็ก |
HcConfOverrides |
สตริง | (ไม่มี) | การแทนที่การกําหนดค่า Spark ที่อนุญาตด้วยเครื่องหมายเซมิโคลอนสําหรับการสร้างเซสชัน HC อ้างอิงค่าทั้งหมดเมื่อมีการแทนที่หลายรายการ |
hcAcquireTimeoutSeconds |
เลขจำนวนเต็ม | 300 |
เวลาหมดเวลารับ/พร้อมเซสชัน HC ในวินาที (120..3600) |
hcAcquirePollingIntervalMs |
เลขจำนวนเต็ม | 1000 |
HC ได้รับช่วงเวลาการสํารวจเป็นมิลลิวินาที (50..30000 รับได้, รันไทม์แคลมป์ 100..5000) |
การตั้งค่าการบันทึก
| พารามิเตอร์ | ประเภท | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
LogLevel |
สตริง | Information |
ระดับบันทึก: Trace, Debug, , Information, WarningError |
LogFilePath |
สตริง |
%LOCALAPPDATA%\FabricSparkAdoNet\Logsบน Windows |
เส้นทางสําหรับการบันทึกแบบไฟล์ |
นามแฝงข้ามไดรเวอร์: โปรแกรมควบคุมยอมรับชื่อคุณสมบัติ 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; API การเชื่อมต่อและคําสั่งมาตรฐานของ ADO.NET ยังคงไม่เปลี่ยนแปลง ใช้โฮสต์ Fabric API ที่ไม่มีเวอร์ชันสําหรับ Server; ไดรเวอร์จะใช้ FabricVersion=v1 และ LivyApiVersion=2023-12-01 โดยค่าเริ่มต้นเมื่อสร้าง HC endpoint
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 |
ใช้ข้อมูลประจําตัวที่แคชไว้ของ 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)
โหมด High-concurrency (HC) ช่วยให้แอปพลิเคชัน .NET สามารถรันงาน Spark SQL พร้อมกันได้โดยไม่ต้องจัดเตรียมเซสชัน Spark แบบคลาสสิกแยกสําหรับแต่ละการเชื่อมต่อ ADO.NET Fabric สามารถวางการเชื่อมต่อที่เข้ากันได้ในเซสชัน Livy ที่จัดการโดยเซิร์ฟเวอร์เดียวกัน พร้อมทั้งให้แต่ละการเชื่อมต่อมี Read-Eval-Print Loop (REPL) แยกสําหรับการดําเนินการคําสั่ง
โมเดลนี้ช่วยลดเวลาการเริ่มต้นเชื่อมต่อ หลีกเลี่ยงการจัดสรรเซสชัน Spark ซ้ํา ๆ และใช้ความจุของ Fabric Spark ได้อย่างมีประสิทธิภาพมากขึ้น แอปพลิเคชันของคุณยังคงใช้ API มาตรฐาน ADO.NET รวมถึง DbConnection, DbCommand, DbDataReader, OpenAsync, และClose
โหมด HC คือโหมดเลือกเข้าร่วม ถ้าคุณไม่เปิดใช้งาน ไดรเวอร์จะใช้เส้นทางเซสชัน Livy แบบคลาสสิก
เลือกได้ระหว่างโหมด HC และโหมดคลาสสิก
ใช้โหมด HC เมื่อ:
- บริการ ASP.NET จัดการคําขอที่เปิดการเชื่อมต่อและรัน Spark SQL พร้อมกัน
- บริการเวิร์กเกอร์ งานที่ตั้งเวลาไว้ หรือสายข้อมูลแบบขนานจะสร้างการเชื่อมต่อ ADO.NET เป็นชุด ๆ
- การเชื่อมต่อหลายจุดจะมุ่งเป้าไปที่พื้นที่ทํางาน Fabric และบ้านพักริมทะเลสาบเดียวกัน และใช้การตั้งค่า 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 ให้ใช้โฮสต์ API Fabric ที่ไม่มีเวอร์ชันสําหรับ
Server. ไดรเวอร์จะใช้เวอร์ชัน API Fabric และ Livy เริ่มต้นเมื่อสร้าง HC endpoint - ชื่อคุณสมบัติไม่แยกแยะตัวพิมพ์ใหญ่-เล็ก
กําหนดค่าการจัดเซสชัน
HcSessionTag ให้คําแนะนําฝั่งเซิร์ฟเวอร์สําหรับการบรรจุเซสชัน HC ที่เข้ากันได้ลงในเซสชัน Livy พื้นฐาน แท็กที่ตรงกันไม่ได้รับประกันว่าจะอยู่ในเซสชันเดียวกัน
หากคุณละเว้นแท็กหรือให้ค่าว่างเปล่าหรือมีเฉพาะช่องว่าง ไดรเวอร์จะไม่ส่งแท็กนั้นในคําขอ acquire การละเว้นแท็กไม่ได้ปิดโหมด 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 หรือใหม่กว่า เพิ่มรหัสพื้นที่ทํางานและบ้านพักริมทะเลสาบของคุณก่อนเปิดการเชื่อมต่อ การแทนที่ทั้งสองจะถูกส่งในคําขอสร้างเซสชันของ 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 connection pooling จะใช้ทรัพยากรการเชื่อมต่อที่จัดการโดยไดรเวอร์ในแอปพลิเคชันลูกข่ายซ้ํา
คุณสามารถเปิดใช้งานทั้งสองฟีเจอร์ได้ Connection pooling ช่วยลดการตั้งค่าการเชื่อมต่อฝั่งไคลเอนต์ซ้ํา ๆ ขณะที่โหมด HC ลดการจัดสรรเซสชัน Spark ฝั่งเซิร์ฟเวอร์ซ้ํา ปรับขนาดพูลการเชื่อมต่อให้เหมาะสมกับความพร้อมกันที่คาดหวังของแอปพลิเคชัน แทนที่จะใช้พูลขนาดใหญ่เพื่อสร้างงานขนานที่ไม่จําเป็น
ในโหมด AutoReconnect=true HC จะไม่เล่นซ้ําคําสั่งที่ล้มเหลวอย่างโปร่งใสหลังจากเกิดข้อผิดพลาดเซสชันที่หยุดนิ่ง แอปพลิเคชันจะได้รับข้อยกเว้นและต้องตัดสินใจว่าการทดลองดําเนินการใหม่นั้นปลอดภัยหรือไม่
ปิดโหมด HC
หากต้องการใช้โหมด classic สําหรับการเชื่อมต่อใหม่ ให้ลบHcEnabledออกจาก สายอักขระการเชื่อมต่อ หรือตั้งค่าเป็น false:
HcEnabled=false
การเปลี่ยนแปลงนี้จะส่งผลต่อการเชื่อมต่อใหม่และไม่ล้างเซสชัน HC ที่รวมกันที่มีอยู่ ปิดหรือกําจัดการเชื่อมต่อเชิงตรรกะตามปกติ;เซสชันทางกายภาพที่มีสิทธิ์สามารถอยู่ในกลุ่มลูกค้าจนกว่าจะเลิกใช้งาน
ข้อจํากัดของ ADO.NET
- ธุรกรรมไม่รองรับ
- คําสั่งรองรับเฉพาะโหมดคําสั่งข้อความเท่านั้น โหมดคําสั่งแบบ stored-procedure และ table-direct ไม่รองรับ
-
Prepareไม่ทําอะไรเลย - คําสั่งต้องมีคําสั่งหนึ่งคําสั่ง;ข้อความคําสั่งหลายคําสั่งจะถูกปฏิเสธ
- ใช้การเชื่อมต่อที่แยกกันและเปิดพร้อมกันสําหรับงานที่ทํางานพร้อมกัน คําสั่งบนการเชื่อมต่อเดียวกันจะแชร์เซสชันและ REPL
การแมปชนิดข้อมูล
ไดรเวอร์แมปชนิดข้อมูล Spark SQL กับชนิด .NET:
| ประเภท Spark SQL | ประเภท .NET | ประเภท Db |
|---|---|---|
| บูลีน | bool |
แบบบูลีน |
| จินินท์ | sbyte |
เอสไบต์ |
| SMALLINT | short |
Int16 |
| INT | int |
Int32 |
| บิ๊กอินต์ | long |
Int64 |
| ลอย | float |
โสด |
| คู่ | double |
ดับเบิ้ล |
| ทศนิยม (p,s) | decimal |
ทศนิยม |
| เชือก | string |
สตริง |
| วาร์ชาร์(n) | string |
สตริง |
| ชาร์(n) | string |
สตริง |
| ไบ นารี | byte[] |
Binary |
| วันที่ | DateTime |
วันที่ |
| ประทับเวลา | DateTime |
วันเวลา |
| อาร์เรย์<T> | string |
วัตถุ |
| แผนที่<K,V> | string |
วัตถุ |
| โครงสร้าง | string |
วัตถุ |
การทํางานกับประเภทที่ซับซ้อน
เส้นทางผลลัพธ์ของ HC ไม่สามารถทําการซีเรียลค่า native nested Array, MAP หรือ STRUCT เป็น JSON ได้อย่างน่าเชื่อถือ Project ค่าที่ซับซ้อนเป็นสตริง JSON ใน Spark SQL ก่อนการ deserialize :
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และเป็นFabricLakehouseIDGUID ที่ถูกต้อง - ตรวจสอบการรับรองความถูกต้อง 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 ให้เพิ่มในช่วง
hcAcquireTimeoutSeconds120 ถึง 3,600 วินาทีที่รองรับ - ตรวจสอบความพร้อมใช้งานของความจุ Fabric
- ตรวจสอบว่าพื้นที่ทํางานยังไม่ถึงขีดจํากัดเซสชัน
เปิดใช้งานการบันทึก
เมื่อแก้ไขปัญหา การบันทึกอย่างละเอียดจะช่วยให้คุณระบุสาเหตุที่แท้จริงได้ กําหนดค่าการบันทึกผ่าน สายอักขระการเชื่อมต่อ:
วิธีเปิดใช้งานการบันทึกโดยละเอียดผ่านสตริงการเชื่อมต่อ:
LogLevel=Debug;LogFilePath=<path-to-log-file>
ถ้าคุณไม่ได้ตั้งค่าLogFilePathการตั้งค่าการบันทึกแบบทั่วโลก ไดรเวอร์จะเขียนบันทึกไว้ใต้ %LOCALAPPDATA%\FabricSparkAdoNet\Logs Windows
ระดับบันทึก:
-
Trace: ฟุ่มเฟือยที่สุด รวมถึงการเรียก API ทั้งหมด -
Debug: ข้อมูลการดีบักโดยละเอียด -
Information: ข้อมูลทั่วไป (ค่าเริ่มต้น) -
Warning: คําเตือนเท่านั้น -
Error: ข้อผิดพลาดเท่านั้น