Microsoft JDBC -ajuri Microsoft Fabric Data Engineeringille

JDBC (Java Database Connectivity) on laajasti hyväksytty standardi, joka mahdollistaa asiakassovellusten yhteyden tietokantojen ja big data -alustojen datan kanssa työskentelyyn.

Microsoft JDBC Driver for Fabric Data Engineering antaa sinun yhdistää, kysyä ja hallita Spark-työkuormia Fabric-järjestelmässä JDBC-standardin luotettavuudella ja yksinkertaisuudella. Fabric:n Livy-rajapintojen pohjalta rakennettu ajuri tarjoaa turvallisen ja joustavan Spark SQL -yhteyden Java-sovelluksiin ja BI-työkaluihin. Tämä integraatio mahdollistaa Spark-koodin lähettämisen ja suorittamisen suoraan ilman, että tarvitsee luoda erillisiä muistikirja- tai Spark-työn määrittelykohteita. Ajuri on yhteensopiva suosittujen JDBC-asiakkaiden, kuten DbVisualizerin ja DBeaverin, sekä JDBC-yhteyksiä tukevien BI-työkalujen, kuten Tableau:n, kanssa.

Tärkeimmät ominaisuudet

  • JDBC 4.2 -rajapinnat: Toteuttaa JDBC 4.2 -rajapinnat Spark SQL -yhteyksille, Spark- ja Livy-rajoituksin, kuten JDBC-transaktioiden puuttuminen ja vain välitys, vain luku -tulosjoukot
  • Microsoft Entra ID -tunnistautuminen: Useita todennusprosesseja, mukaan lukien interaktiiviset, asiakastunnukset ja varmennepohjainen tunnistautuminen
  • Korkean samanaikaisuuden istunnot: Opt-in Fabric -istuntojen jakaminen samanaikaisille työkuormille
  • Eksplisiittinen yhteyspoolaus: Valitse HikariCP, tavallinen poolinhallinta, tai LivyBuiltInPooledDataSource; suorat sisäänkäyntipisteet eivät koskaan poolaa
  • Spark SQL -natiivikyselytuki: Spark SQL -lauseiden suora suoritus ilman käännöksiä
  • Kattava tietotyyppituki: Tuki kaikille Spark SQL -tietotyypeille, mukaan lukien monimutkaiset tyypit (TAULUKKO, KARTTA, RAKENNE)
  • Asynkronisen tulosjoukon esihaku: taustalla lataava datan lataus suorituskyvyn parantamiseksi
  • Katkaisijan kuvio: Suojaus ketjureaktioilta automaattisella uudelleenkokeilulla
  • Automaattinen uudelleenyhdistäminen: Läpinäkyvä istunnon palautus yhteyden epäonnistumisista
  • Edistynyt uudelleenyrittämislogiikka: Kokeile uudelleen eksponentiaalisella peruutuksella ja istunnon palautuksella parantaen resilienssiä
  • Välityspalvelintuki: HTTP- ja SOCKS-välityspalvelinkonfiguraatio yritysympäristöihin

Ennakkovaatimukset

Ennen kuin käytät Microsoft JDBC Driver for Fabric Data Engineeringiä, varmista, että sinulla on:

  • Java Development Kit (JDK): Java 11, 17 ja 21 (Java 21 suositeltava)
  • Fabric Access: Pääsy Fabric-työtilaan
  • Microsoft Entra ID tunnistetiedot: Sopivat tunnistetiedot todennukseen
  • Workspace- ja Lakehouse-tunnisteet: GUID-tunnisteet Fabric-työtilallesi ja järvenrakennukselle

Lataus ja asennus

Microsoft JDBC Driver for Fabric Data Engineering -versio 2.0.1 tukee Java 11, 17 ja 21. Käytä uusinta saatavilla olevaa versiota.

  1. Lataa joko zip- tai tar-tiedosto yllä olevista linkeistä.
  2. Purkaa ladattu tiedosto päästäksesi ajurien JAR-tiedostoihin.
  3. Valitse JAR-tiedosto, joka vastaa JRE-versiotasi:
    • Java 11:lle: ms-sparksql-jdbc-2.0.1.jre11.jar
    • Java 17:lle: ms-sparksql-jdbc-2.0.1.jre17.jar
    • Java 21:lle: ms-sparksql-jdbc-2.0.1.jre21.jar
  4. Lisää valittu JAR-tiedosto hakemuksesi luokkapolkuun.
  5. JDBC-asiakkaille määritä JDBC-ajuriluokka: com.microsoft.spark.livy.jdbc.LivyDriver

Nopea aloitusesimerkki

Tässä esimerkissä osoitetaan, miten Fabric yhdistetään ja kysely suoritetaan käyttämällä Microsoft JDBC Driver for Fabric Data Engineeringiä. Ennen kuin suoritat tämän koodin, varmista, että olet suorittanut vaaditut vaatimukset ja asentanut ajurin. Käyttämällä AuthFlow=2, ajuri käyttää DefaultAzureCredential. Jos haluat käyttää Azure CLI:tä tunnistetietolähteenä, asenna Azure CLI ja aja az login.

import java.sql.*;

public class QuickStartExample {
    public static void main(String[] args) {
        // Connection string with required parameters
        String url = "jdbc:fabricspark://api.fabric.microsoft.com;" +
                     "FabricWorkspaceID=<workspace-id>;" +
                     "FabricLakehouseID=<lakehouse-id>;" +
                     "AuthFlow=2;" +  // DefaultAzureCredential; Azure CLI can be one source
                     "LogLevel=INFO";
        
        try (Connection conn = DriverManager.getConnection(url)) {
            // Execute a simple query
            try (Statement stmt = conn.createStatement();
                 ResultSet rs = stmt.executeQuery("SELECT 'Hello from Fabric!' as message")) {
                
                if (rs.next()) {
                    System.out.println(rs.getString("message"));
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

Yhteysmerkkijonon muoto

Perusyhteysmerkkijono

Microsoft JDBC Driver for Fabric Data Engineering käyttää seuraavaa yhteysmerkkijono -muotoa:

jdbc:fabricspark://<hostname>[:<port>][;<parameter1>=<value1>;<parameter2>=<value2>;...]

Yhteysmerkkijonon komponentit

Komponentti Kuvaus Esimerkki
Protokolla JDBC-URL-protokollan tunniste jdbc:fabricspark://
Isäntänimi Fabric-päätepisteen isäntänimi api.fabric.microsoft.com
Satama Valinnainen porttinumero (oletus: 443) :443
Parametrit Puolipisteellä eroteltu avain=arvoparit FabricWorkspaceID=<guid>

Esimerkkiyhteysmerkkijonoja

Perusyhteys (interaktiivinen selainpohjainen todennus)

jdbc:fabricspark://api.fabric.microsoft.com;FabricWorkspaceID=<workspace-id>;FabricLakehouseID=<lakehouse-id>;AuthFlow=1

Kipinäresurssikonfiguraatiolla

jdbc:fabricspark://api.fabric.microsoft.com;FabricWorkspaceID=<workspace-id>;FabricLakehouseID=<lakehouse-id>;DriverCores=4;DriverMemory=4g;ExecutorCores=4;ExecutorMemory=8g;NumExecutors=2;AuthFlow=2

Spark Session Propertiesin kanssa

jdbc:fabricspark://api.fabric.microsoft.com;FabricWorkspaceID=<workspace-id>;FabricLakehouseID=<lakehouse-id>;spark.sql.adaptive.enabled=true;spark.sql.shuffle.partitions=200;AuthFlow=2

Korkean samanaikaisuuden tilalla

Korkean rinnakkaisuuden (HC) tila on saatavilla Microsoft Fabric -yhteyksille ajuriversiossa 1.1.0 ja uudemmissa versioissa. Lisää hcEnabled=true saadaksesi HC-istunnon perinteisen Livy-session sijaan:

jdbc:fabricspark://api.fabric.microsoft.com;FabricWorkspaceID=<workspace-id>;FabricLakehouseID=<lakehouse-id>;AuthFlow=2;hcEnabled=true

Voit halutessasi tunnistaa työkuorman istuntotunnisteella ja valita Fabric-ympäristön:

jdbc:fabricspark://api.fabric.microsoft.com;FabricWorkspaceID=<workspace-id>;FabricLakehouseID=<lakehouse-id>;AuthFlow=2;hcEnabled=true;sessionTag=orders_etl;FabricEnvironmentID=<environment-id>

HC-tila on vapaaehtoinen. Jos hcEnabled se jätetään pois tai asetetaan , falseajuri käyttää klassista Livyn istuntopolkua.

Katso High-Concurrency (HC) Mode -osio saadaksesi täydelliset konfigurointiohjeet.


Todennus

Microsoft JDBC Driver for Fabric Data Engineering tukee useita todennusmenetelmiä Microsoft Entra ID:n (entinen Azure Active Directory) kautta. Tunnistautuminen konfiguroidaan yhteysmerkkijonon AuthFlow parametrin avulla.

Tunnistautumisvirrat

AuthFlow Todentamismenetelmä Käyttötapaus
1 Interaktiivinen selain Interaktiivinen käyttäjän tunnistautuminen OAuth 2.0:n avulla
2 Oletus Azure credential chain Kehitys ja hallittu sovellusten autentikointi; Azure CLI voi olla yksi tunnistetietojen lähde
3 Asiakkaan salaiset tunnukset (palvelupäähenkilö) Automatisoitu/palvelu-todennus
4 Asiakasvarmenteen pätevyys Varmennepohjainen palvelupäähenkilön tunnistautuminen
5 Pääsytunnus Ennakkoon hankittu haltijan pääsytunnus

Interaktiivinen selaimen tunnistautuminen

Paras: Kehitykseen ja interaktiivisiin sovelluksiin

String url = "jdbc:fabricspark://api.fabric.microsoft.com;" +
             "FabricWorkspaceID=<workspace-id>;" +
             "FabricLakehouseID=<lakehouse-id>;" +
             "AuthFlow=1;" +
             "LogLevel=INFO";

Connection conn = DriverManager.getConnection(url);

Parametrit:

  • AuthFlow=1: Määrittelee interaktiivisen selaimen tunnistautumisen

Käyttäytyminen:

  • Avaa selaimen ikkunan käyttäjän tunnistautumista varten
  • Tallentaa tunnistetiedot myöhemmistä yhteyksistä, kunnes ne vanhenevat
  • Sopii yksinkäyttäjäsovelluksiin

Asiakastunnukset tai palvelupäähenkilön todennus

Paras: Automatisoidut palvelut ja taustatyöt

String url = "jdbc:fabricspark://api.fabric.microsoft.com;" +
             "FabricWorkspaceID=<workspace-id>;" +
             "FabricLakehouseID=<lakehouse-id>;" +
             "AuthFlow=3;" +  
             "AuthClientID=<client-id>;" +
             "AuthClientSecret=<client-secret>;" +
             "AuthTenantID=<tenant-id>;" +
             "LogLevel=INFO";

Connection conn = DriverManager.getConnection(url);

Vaaditut parametrit:

  • AuthFlow=3: Määrittelee asiakkaan tunnistetunnisteiden todennuksen
  • AuthClientID: Application (client) ID Microsoft Entra ID:stä
  • AuthClientSecret: Asiakassalaisuus Microsoft Entra ID:stä
  • AuthTenantID: Microsoft Entra vuokralaisen tunnus

Parhaat käytännöt:

  • Tallenna salaisuudet turvallisesti (Azure Key Vault, ympäristömuuttujat)
  • Käytä hallittuja identiteettejä aina kun mahdollista
  • Kierrätä salaisuuksia säännöllisesti

Certificate-Based Todennus

Paras: Yrityssovelluksiin, jotka vaativat varmennepohjaista todennusta

String url = "jdbc:fabricspark://api.fabric.microsoft.com;" +
             "FabricWorkspaceID=<workspace-id>;" +
             "FabricLakehouseID=<lakehouse-id>;" +
             "AuthFlow=4;" +  
             "AuthClientID=<client-id>;" +
             "AuthCertificatePath=/path/to/certificate.pem;" +
             "AuthCertificatePassword=<certificate-password>;" +
             "AuthTenantID=<tenant-id>;" +
             "LogLevel=INFO";

Connection conn = DriverManager.getConnection(url);

Vaaditut parametrit:

  • AuthFlow=4: Määrittelee varmennepohjaisen tunnistautumisen
  • AuthClientID: Sovelluksen (asiakas) tunnus
  • AuthCertificatePath: Polku PEM-sertifikaattitiedostoon
  • AuthCertificatePassword: Varmenteen salasana
  • AuthTenantID: Microsoft Entra vuokralaisen tunnus

Pääsytunnusen tunnistautuminen

Parhaiten: Mukautetut todennusskenaariot

// Acquire token through custom mechanism
String accessToken = acquireTokenFromCustomSource();

String url = "jdbc:fabricspark://api.fabric.microsoft.com;" +
             "FabricWorkspaceID=<workspace-id>;" +
             "FabricLakehouseID=<lakehouse-id>;" +
             "AuthFlow=5;" +  // Access token authentication
             "AuthAccessToken=" + accessToken + ";" +
             "LogLevel=INFO";

Connection conn = DriverManager.getConnection(url);

Todennusvälimuisti

Kuljettaja tallentaa tunnistautumistokenit välimuistiin ja päivittää ne tokenin vanhentumisen perusteella. Jäsennetyt AuthEnableCaching ja AuthCacheTTLMS ominaisuudet eivät ohjaa tätä käyttäytymistä versiossa 2.0.0.

Määritysparametrit

Pakolliset parametrit

Nämä parametrit täytyy olla läsnä jokaisessa yhteysjonossa:

Parametri Kirjoita Kuvaus Esimerkki
FabricWorkspaceID UUID Fabric-työtilan tunnus <workspace-id>
FabricLakehouseID UUID Fabric-järvimajan tunniste <lakehouse-id>
AuthFlow Integer Todennusprosessityyppi (1-5) 2

Valinnaiset parametrit

API-version konfiguraatio

Parametri Kirjoita Oletus Kuvaus
FabricVersion Merkkijono v1 Fabric API -versio
LivyApiVersion Merkkijono 2023-12-01 Livy API -versio

Ympäristön määritys

Parametri Kirjoita Oletus Kuvaus
FabricEnvironmentID UUID Ei ole Fabric-ympäristön tunniste ympäristöelementin viittaamiseen Spark-istunnossa

Korkean samanaikaisuuden istuntoasetukset

Aseta hcEnabled=true käyttämään HC-tilaa. Jäljellä olevia HC-ominaisuuksia käytetään vain, kun HC-tila on käytössä.

Parametri Kirjoita Oletus Kuvaus
hcEnabled totuusarvo false Käyttää Fabric-korkean samanaikaisuuden sessiota.
sessionTag Merkkijono Ei ole Valinnainen palvelinpuolen istuntotunniste. Käytä 1–64 kirjainta, numeroita, alaviivoja tai yhdysviivoja.
hcAcquireTimeoutSeconds Integer 300 Maksimiaika odottaa HC-istunnon valmistumista. Voimassa olevat arvot vaihtelevat 120:stä 3 600 sekuntiin.
hcAcquirePollingIntervalMs Integer 1000 Väli HC-istunnon tilatarkistusten välillä. Hyväksytyt arvot vaihtelevat 50–30 000 millisekunnin välillä ja ne rajoitetaan ajon aikana 100–5 000 millisekuntiin.

Esimerkki:

hcEnabled=true;sessionTag=interactive_reporting;hcAcquireTimeoutSeconds=600;hcAcquirePollingIntervalMs=2000;FabricEnvironmentID=<environment-id>
  • FabricEnvironmentID koskee sekä HC- että klassisia sessioita
  • EnvironmentID hyväksytään myös ristikuljettajan alias-nimimerkkinä. Kiinteistöjen nimet ovat kirjainkoon liittymättömiä.

Important

Käytä sessionTag vain ei-herkkiä käyttömerkintöjä varten. Älä sisällytä salaisuuksia, pääsytunnukkeja, henkilötietoja, asiakastunnisteita tai kyselytekstiä.

Katso High-Concurrency (HC) Mode -osio saadaksesi täydelliset konfigurointiohjeet.

Kipinän konfiguraatio

Istuntoresurssien konfigurointi

Määritä Spark-istuntoresurssit optimaalisen suorituskyvyn saavuttamiseksi:

Parametri Kirjoita Oletus Kuvaus Esimerkki
DriverCores Integer Sparkin oletus Ajurin CPU-ytimien määrä 4
DriverMemory Merkkijono Sparkin oletus Muistin varaus ajurille 4g
ExecutorCores Integer Sparkin oletus Suorittimen ytimien määrä per suorittaja 4
ExecutorMemory Merkkijono Sparkin oletus Muistin varaus per toimeenpanija 8g
NumExecutors Integer Sparkin oletus Toimeenpanijoiden määrä 2
SessionName Merkkijono Automaattisesti luotu Mukautettu istunnonnimi MySparkSession

Esimerkki:

DriverCores=4;DriverMemory=4g;ExecutorCores=4;ExecutorMemory=8g;NumExecutors=2; SessionName=MySparkSession

Mukautetut Spark-istunto-ominaisuudet

Mikä tahansa etuliitteen mukainen parametri spark. sovelletaan automaattisesti Spark-istuntoon:

Esimerkkejä kipinäkonfiguraatioista:

spark.sql.adaptive.enabled=true
spark.sql.adaptive.coalescePartitions.enabled=true
spark.sql.shuffle.partitions=200
spark.sql.autoBroadcastJoinThreshold=10485760
spark.dynamicAllocation.enabled=true
spark.dynamicAllocation.minExecutors=1
spark.dynamicAllocation.maxExecutors=10
spark.executor.memoryOverhead=1g

Natiivisuoritusmoottori (NEE):

spark.nee.enabled=true

Täydellinen esimerkki:

jdbc:fabricspark://api.fabric.microsoft.com;FabricWorkspaceID=<guid>;FabricLakehouseID=<guid>;DriverMemory=4g;ExecutorMemory=8g;NumExecutors=2;spark.sql.adaptive.enabled=true;spark.nee.enabled=true;AuthFlow=2

HTTP-asiakasyhteysasetukset

Määritä ajurin HTTP-siirtoyhteydet optimaalisen verkon suorituskyvyn saavuttamiseksi. Nämä asetukset eivät konfiguroi tai hallinnoi JDBC-yhteyspoolia:

Parametri Kirjoita Oletus Kuvaus
HttpMaxTotalConnections Integer 100 Maksimimäärä kokonais-HTTP-yhteyksiä
HttpMaxConnectionsPerRoute Integer 20 Maksimiyhteydet per reitti
HttpConnectionTimeoutInSeconds Integer 30 Yhteyden aikakatkaisu
HttpSocketTimeoutInSeconds Integer 60 Pistorasian lukemisen aikakatkaisu
HttpReadTimeoutInSeconds Integer 60 HTTP-lukuaikakatkaisu
HttpConnectionRequestTimeoutSeconds Integer 10 Yhteyspyynnön aikakatkaisu poolista
HttpEnableKeepAlive totuusarvo tosi Ota HTTP keep-alive käyttöön
HttpKeepAliveTimeoutSeconds Integer 60 Pidä elossa -aikalisä
HttpFollowRedirects totuusarvo tosi Seuraa HTTP-uudelleenohjauksia
HttpUseAsyncIO totuusarvo tosi Käytä asynkronista HTTP I/O:ta

Esimerkki:

HttpMaxTotalConnections=200;HttpMaxConnectionsPerRoute=100;HttpConnectionTimeoutInSeconds=60

Välityspalvelimen konfiguraatio

Määritä HTTP- ja SOCKS-välityspalvelinasetukset yritysympäristöihin:

Parametri Kirjoita Oletus Kuvaus
UseProxy totuusarvo väärä Ota välityspalvelin käyttöön
ProxyTransport Merkkijono http Välityspalvelimen siirtotyyppi (http/tcp)
ProxyHost Merkkijono Ei ole Välityspalvelimen isäntänimi
ProxyPort Integer Ei ole Proxy-portti
ProxyAuthEnabled totuusarvo väärä Ota välityspalvelin autentikointi käyttöön
ProxyUsername Merkkijono Ei ole Välityspalvelimen todennuskäyttäjätunnus
ProxyPassword Merkkijono Ei ole Välityspalvelimen todennussalasana
ProxyAuthScheme Merkkijono basic Auth-järjestelmä (perus/digest/ntlm)
ProxySocksVersion Integer 5 SOCKS-versio (4/5)

HTTP-välityspalvelinesimerkki:

UseProxy=true;ProxyTransport=http;ProxyHost=proxy.company.com;ProxyPort=8080;ProxyAuthEnabled=true;ProxyUsername=user;ProxyPassword=pass

SOCKS-proxy-esimerkki:

UseProxy=true;ProxyTransport=tcp;ProxyHost=socks.company.com;ProxyPort=1080;ProxySocksVersion=5

Kirjaamisen kokoonpano

Parametri Kirjoita Oletus Kuvaus
LogLevel Merkkijono WARN Lokitaso: JÄLJITYS, VIRHEENKORJAUS, TIETO, VAROITUS, VIRHE

Esimerkki:

LogLevel=DEBUG

Oletuslokin sijainti:

${user.home}/.microsoft/livy-jdbc-driver/logs/driver.log

Mukautettu lokin konfiguraatio: Käytä mukautettua log4j2.xml tiedostoa logback.xml luokkapolullasi.

Korkean samanaikaisuuden (HC) tila

Korkean rinnakkaisuuden (HC) tila on suunniteltu JDBC-sovelluksiin, jotka avaavat useita yhteyksiä samaan Fabric-työtilaan ja järvenrakennukseen. Sen sijaan, että jokaiselle yhteydelle olisi suunniteltu erillinen klassinen Spark-istunto, Fabric palvelee näitä yhteyksiä jaetulla, palvelimen hallinnoimalla Spark-kapasiteetilla.

HC-tila voi lyhentää yhteyden käynnistysaikaa, välttää toistuvan Spark-istunnon provisionoinnin ja käyttää käytettävissä olevaa kapasiteettia tehokkaammin samanaikaisissa työkuormissa. Jokainen JDBC-yhteys jatkaa lauseiden suorittamista sen määritetyn kontekstin kautta HC-istunnossa.

HC-tila on valinnainen ja täydentää JDBC-yhteyspoolausta. HC-tila hallinnoi Fabric Spark -istuntoja palvelimella, kun taas JDBC-yhteyspooli hallinnoi yhteyksiä asiakassovelluksessa. Jos et ota HC-tilaa käyttöön, ajuri luo klassisen Livy-session.

Valitse HC:n ja klassisen tilan välillä

Käytä HC-tilaa, kun:

  • Sovelluspalvelu käsittelee samanaikaisia pyyntöjä, jotka ajavat Spark SQL:ää useiden JDBC-yhteyksien kautta.
  • BI eli raportointityökalu avaa useita yhteyksiä samaan työtilaan ja järventaloon.
  • Rinnakkaiset ETL-tehtävät tai aikataulutetut tehtävät luovat JDBC-yhteyksien purkauksia.
  • Yhteydet käyttävät yhteensopivia Spark-asetuksia ja voivat jakaa palvelimen hallinnoiman Spark-kapasiteetin.
  • Yhteyden käynnistysajan ja toistuvan Spark-istunnon provisionoinnin lyhentäminen on tärkeää.

Käytä klassista tilaa, kun:

  • Sovelluksessasi käytetään vain yhtä tai muutamaa pitkäaikaista JDBC-yhteyttä.
  • Jokainen yhteys vaatii omistetun Spark-istunnon tiukkaa työkuormaa tai resurssien eristämistä varten.
  • Liitännät vaativat merkittävästi erilaisia Spark-konfiguraatioita tai Fabric-ympäristöjä.
  • Fabric Livy -päätepiste kohdetyötilalle ja järvitalolle ei tue HC-tilaa.

Ota käyttöön korkean samanaikaisuuden tila

HC-tila on vapaaehtoinen. Jos jätät hcEnabled sen pois tai asetat vääräksi, ajuri käyttää klassista Livyn sessiopolkua. Aseta hcEnabled oikeaksi saadaksesi HC-istunnon:

hcEnabled=true;

Vaaditut parametrit HC-tilassa

HC-aktivointi vaatii seuraavat kelvolliset tunnisteet:

Parametri Muistiinpanot
WorkspaceId Sen täytyy olla voimassa oleva Fabric-työtilan GUID.
LakehouseId Sen täytyy olla voimassa oleva Fabric Lakehouse -käyttöliittymä.

Sisällytä SessionTag , koska se vaikuttaa palvelinpuolen matchaukseen lämpimissä sessioissa.

Istuntojen yhdistäminen

HC-tila ei takaa, että jokainen yhteys käyttää olemassa olevaa istuntoa uudelleen. Jokaisesta istuntokeruuspyynnöstä kuljettaja lähettää:

  • Arvo SessionTag .
  • Tehokas Spark-konfiguraatio, mukaan lukien conf.* asetukset ja EnvironmentId.

Fabric Livy -palvelu arvioi nämä arvot ja päättää, liitetäänkö yhteys lämpimään istuntoon vai luodako uusi istunto. Istunnon uudelleenkäytön parantamiseksi käytä yhtenäisiä arvoja yhteyksien välillä, joiden on tarkoitus jakaa palvelimen hallinnoima Spark-kapasiteetti.

Poista HC-tila käytöstä

Voit poistaa käytöstä uudet HC-istunnon hankinnat ilman, että ajuria otat uudelleen käyttöön, asettamalla HC-yhteysmerkkijono vääraksi tai poistamalla HC-parametrit:

hcEnabled=false;

Hätäpalautukset: Hätäpalautusta varten aloita JVM .-Dcom.microsoft.fabric.jdbc.hc.disable=true Tämä JVM-laajuinen kytkin pakottaa klassisen tilan, vaikka yhteysmerkkijono sisältäisi hcEnabled=true.

Ymmärrä HC:n ajonaikainen käyttäytyminen

  • HC-istunnon hankinta estää siihen asti, kunnes istunto on valmis tai hcAcquireTimeoutSeconds vanhenee.
  • Yhteyden sulkeminen hankinnan aikana keskeyttää hankinnan ja käynnistää parhaan yrityksen HC-istunnon siivouksen.
  • Tunnistautuminen, kyselyn suoritus, peruutus, valmistellut lauseet, tulosten käsittely ja FabricEnvironmentID työskentely JDBC-standardien kautta molemmissa tiloissa.

Käyttöesimerkkejä

Perusyhteys

import java.sql.*;

public class BasicConnectionExample {
    public static void main(String[] args) {
        String url = "jdbc:fabricspark://api.fabric.microsoft.com;" +
                     "FabricWorkspaceID=<workspace-id>;" +
                     "FabricLakehouseID=<lakehouse-id>;" +
                     "AuthFlow=2";
        
        try (Connection conn = DriverManager.getConnection(url)) {
            System.out.println("Connected successfully!");
            System.out.println("Database: " + conn.getMetaData().getDatabaseProductName());
            System.out.println("Driver: " + conn.getMetaData().getDriverName());
            System.out.println("Driver Version: " + conn.getMetaData().getDriverVersion());
        } catch (SQLException e) {
            System.err.println("Connection failed: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

Korkean samanaikaisuuden tilan yhteys

Seuraava esimerkki avaa JDBC-yhteyden HC-tilassa, suorittaa kyselyn ja vapauttaa yhteyden automaattisesti:

String url = "jdbc:fabricspark://api.fabric.microsoft.com;" +
             "FabricWorkspaceID=<workspace-id>;" +
             "FabricLakehouseID=<lakehouse-id>;" +
             "AuthFlow=2;" +
             "hcEnabled=true;" +
             "sessionTag=dashboard_queries;" +
             "FabricEnvironmentID=<environment-id>";

try (Connection conn = DriverManager.getConnection(url);
     Statement stmt = conn.createStatement();
     ResultSet rs = stmt.executeQuery("SELECT current_timestamp()")) {
    while (rs.next()) {
        System.out.println(rs.getTimestamp(1));
    }
}

Kyselyjen suorittaminen

Yksinkertainen kysely

public void executeSimpleQuery(Connection conn) throws SQLException {
    String sql = "SELECT current_timestamp() as now";
    
    try (Statement stmt = conn.createStatement();
         ResultSet rs = stmt.executeQuery(sql)) {
        
        if (rs.next()) {
            Timestamp now = rs.getTimestamp("now");
            System.out.println("Current timestamp: " + now);
        }
    }
}

Kysely suodattimella

public void executeQueryWithFilter(Connection conn) throws SQLException {
    String sql = "SELECT * FROM sales WHERE amount > 1000 ORDER BY amount DESC";
    
    try (Statement stmt = conn.createStatement();
         ResultSet rs = stmt.executeQuery(sql)) {
        
        while (rs.next()) {
            int id = rs.getInt("id");
            double amount = rs.getDouble("amount");
            Date date = rs.getDate("sale_date");
            
            System.out.printf("ID: %d, Amount: %.2f, Date: %s%n", 
                            id, amount, date);
        }
    }
}

Kysely rajan kanssa

public void executeQueryWithLimit(Connection conn) throws SQLException {
    String sql = "SELECT * FROM customers LIMIT 10";
    
    try (Statement stmt = conn.createStatement();
         ResultSet rs = stmt.executeQuery(sql)) {
        
        ResultSetMetaData metaData = rs.getMetaData();
        int columnCount = metaData.getColumnCount();
        
        // Print column names
        for (int i = 1; i <= columnCount; i++) {
            System.out.print(metaData.getColumnName(i) + "\t");
        }
        System.out.println();
        
        // Print rows
        while (rs.next()) {
            for (int i = 1; i <= columnCount; i++) {
                System.out.print(rs.getString(i) + "\t");
            }
            System.out.println();
        }
    }
}

Työskentely tulosjoukkojen kanssa

Travers-tulosjoukot

public void navigateResultSet(Connection conn) throws SQLException {
    String sql = "SELECT id, name, amount FROM orders";
    
    try (Statement stmt = conn.createStatement();
         ResultSet rs = stmt.executeQuery(sql)) {

        while (rs.next()) {
            System.out.printf(
                "Order %d: %s, %.2f%n",
                rs.getInt("id"),
                rs.getString("name"),
                rs.getDouble("amount"));
        }
    }
}

Tulosjoukot ovat vain eteenpäin suuntautuvia ja vain lukua varten. Ajuri ei tue menetelmiä kuten first(), last(), ja absolute().

Suurten tulosjoukkojen käsittely

Kuljettaja sivuttaa tulokset vastekoon mukaan. Määritä LivyStatementPageSize JDBC-URL-osoitteessa asettamaan pyydetty sivukoko tavuina. Menetelmä Statement.setFetchSize() ei säätele hakua tai muistin käyttöä.

jdbc:fabricspark://api.fabric.microsoft.com;FabricWorkspaceID=<workspace-id>;FabricLakehouseID=<lakehouse-id>;AuthFlow=2;LivyStatementPageSize=1048576
public void processLargeResultSet(Connection conn) throws SQLException {
    String sql = "SELECT * FROM large_table";
    
    try (Statement stmt = conn.createStatement()) {
        try (ResultSet rs = stmt.executeQuery(sql)) {
            int rowCount = 0;
            while (rs.next()) {
                // Process row
                processRow(rs);
                rowCount++;
                
                if (rowCount % 10000 == 0) {
                    System.out.println("Processed " + rowCount + " rows");
                }
            }
            System.out.println("Total rows processed: " + rowCount);
        }
    }
}

private void processRow(ResultSet rs) throws SQLException {
    // Process individual row
}

Valmisteltujen lausumien käyttö

public void usePreparedStatement(Connection conn) throws SQLException {
    String sql = "SELECT * FROM products WHERE category = ? AND price > ?";
    
    try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
        // Set parameters
        pstmt.setString(1, "Electronics");
        pstmt.setDouble(2, 100.0);
        
        try (ResultSet rs = pstmt.executeQuery()) {
            while (rs.next()) {
                String name = rs.getString("name");
                double price = rs.getDouble("price");
                System.out.printf("Product: %s, Price: $%.2f%n", name, price);
            }
        }
    }
}

Erätoiminta

Ajuri ei tue JDBC-tapahtumia. Eräsuoritus on ei-transaktionaalista ja voi osittain onnistua. Myöhempi epäonnistuminen ei peruuta aiempia onnistuneita lausuntoja.

public void executeBatchInsert(Connection conn) throws SQLException {
    String sql = "INSERT INTO logs (timestamp, level, message) VALUES (?, ?, ?)";
    int pendingStatements = 0;
    
    try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
        // Add multiple statements to batch
        for (int i = 0; i < 1000; i++) {
            pstmt.setTimestamp(1, new Timestamp(System.currentTimeMillis()));
            pstmt.setString(2, "INFO");
            pstmt.setString(3, "Log message " + i);
            pstmt.addBatch();
            pendingStatements++;
            
            // Execute batch every 100 statements
            if ((i + 1) % 100 == 0) {
                pstmt.executeBatch();
                pstmt.clearBatch();
                pendingStatements = 0;
            }
        }
        
        if (pendingStatements > 0) {
            pstmt.executeBatch();
        }
        
        System.out.println("Batch insert completed successfully");
    }
}

Valitse yhteyden omistaja

Valitse yksi komponentti, joka omistaa yhteyden elinkaaren. Älä laita yhtä liitäntäpoolia toisen sisälle.

Käyttömalli Aloituskohta Altaan omistaja Lainatun sulkeminen Connection Sulun omistaja
Suora DriverManager, LivyDriver tai LivyDataSource Ei ole Sulkee fyysisesti itsenäisen Livy-yhteyden ja istunnon. Sovellus sulkee kaikki yhteydet. Suoralla LivyDataSource ei ole erillistä läheistä elinkaarta.
Ulkoinen HikariCP HikariDataSource jota tukee JDBC-URL tai LivyDataSource Vain HikariCP Palauttaa Hikari-proxy-yhteyden HikariCP:lle. Sovellus sulkee säilytetyn HikariDataSource.
Eksplisiittinen sisäänrakennettu uima-allas LivyBuiltInPooledDataSource Yksi laiskasti luotu LivyConnectionPool jokaiselle konfiguroidulle tietolähteen generoinnille Lopettaa loogisen vuokrasopimuksen ja käyttää fyysisen istunnon uudelleen vasta turvallisen siivouksen jälkeen. Sovellus sulkee säilytetyn sisäänrakennetun tietolähteensä.
Standardi poolaus-SPI LivyConnectionPoolDataSource luo PooledConnection objekteja keskitasoiselle poolinhallinnalle Keskitason uima-altaan johtaja, ei tehdas Sulkee loogisen kahvan ja ilmoittaa synkronisesti esimiehelle siivouksen jälkeen. Johtaja soittaa PooledConnection.close() tuhotakseen jokaisen fyysisen yhteyden.

ConnectionPoolEnabled oletuksena false sekä ajurikoodissa että toimitetuissa ominaisuuksissa. Se ei ole valinnainen kytkin nykyisille sisääntulopisteille. Käytä LivyBuiltInPooledDataSource silloin, kun ajuri omistaa poolin, tai konfiguroi ulkoinen pooli, kuten HikariCP. Muut sisäänkäyntipisteet luovat suoria, ei-pool-omistusyhteyksiä.

Yhteyden poolaus HikariCP:n kanssa

HikariCP voi luoda yhteyksiä joko LivyDataSource JDBC:n URL-osoitteesta kautta LivyDriver. Luo yksi HikariCP-instanssi, käytä sitä uudelleen sovelluksen elinkaaren ajan ja käytä vain yhtä yhteyspoolia kummassakin kokoonpanossa.

Maven-riippuvuus

<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>5.0.1</version>
</dependency>

LivyDataSource käyttäminen

LivyDataSource luo itsenäisiä fyysisiä yhteyksiä eikä omista yhteyspoolia tai erillistä läheistä elinkaarta. Toimita se suoraan HikariCP:lle, jotta HikariCP on ainoa poolin omistaja:

import com.microsoft.spark.livy.jdbc.LivyDataSource;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public final class ConnectionPoolExample implements AutoCloseable {
    private final HikariDataSource hikariDataSource;

    public ConnectionPoolExample(String url) {
        LivyDataSource configuredDataSource = new LivyDataSource();
        configuredDataSource.setUrl(url);

        HikariConfig config = new HikariConfig();
        config.setDataSource(configuredDataSource);
        config.setMaximumPoolSize(2);
        config.setMinimumIdle(0);
        config.setConnectionTimeout(900000);     // Wait up to 15 minutes for a connection
        config.setInitializationFailTimeout(-1); // Connect on demand
        config.setIdleTimeout(600000);           // 10 minutes
        config.setMaxLifetime(1800000);          // 30 minutes
        config.setPoolName("FabricSparkPool");

        hikariDataSource = new HikariDataSource(config);
    }

    public Connection getConnection() throws SQLException {
        return hikariDataSource.getConnection();
    }

    @Override
    public void close() {
        hikariDataSource.close();
    }

    public static void main(String[] args) throws SQLException {
        String url = "jdbc:fabricspark://api.fabric.microsoft.com;" +
                     "FabricWorkspaceID=<workspace-id>;" +
                     "FabricLakehouseID=<lakehouse-id>;" +
                     "AuthFlow=AZURE_CLI;" +
                     "hcEnabled=true;" +
                     "sessionTag=pooled_app;" +
                     "hcAcquireTimeoutSeconds=600";

        try (ConnectionPoolExample pool = new ConnectionPoolExample(url);
             Connection conn = pool.getConnection();
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery("SELECT 'Pooled connection!' as message")) {

            if (rs.next()) {
                System.out.println(rs.getString("message"));
            }
        }
    }
}

Esimerkki mahdollistaa HC-tilan JDBC-URL-osoitteessa. HikariCP hallinnoi asiakaspuolen yhteyksiä, kun taas HC-tila hallinnoi jaettuja Spark-istuntoja Fabric-ohjelmassa. Poista hcEnabled ja sessionTag jos sovellus vaatii klassisia istuntoja.

Käytä LivyDriver suoraan

Määritä JDBC:n URL-osoite ja ajuriluokka siten, että HikariCP luo fyysiset yhteydet .LivyDriver Kuljettajaluokan asettaminen eksplisiittisesti on valinnaista, kun JDBC-palveluntarjoajan automaattinen tunnistus on saatavilla. Tämä konfiguraatio ei LivyDataSourcekäynnistä , joten sen sisäänrakennettu pooli ei ole mukana:

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public final class DriverConnectionPoolExample {
    public static HikariDataSource createPool(String url) {
        HikariConfig config = new HikariConfig();
        config.setDriverClassName("com.microsoft.spark.livy.jdbc.LivyDriver");
        config.setJdbcUrl(url);

        // Keep pool sizes small: each classic-mode physical connection owns a Livy session.
        config.setMaximumPoolSize(2);
        config.setMinimumIdle(0);
        config.setConnectionTimeout(900000);     // Wait up to 15 minutes to borrow a connection
        config.setInitializationFailTimeout(-1); // Skip startup validation; connect on demand
        config.setIdleTimeout(600000);           // 10 minutes
        config.setMaxLifetime(1800000);          // 30 minutes
        config.setPoolName("FabricSparkDriverPool");

        return new HikariDataSource(config);
    }

    public static void main(String[] args) throws SQLException {
        String url = "jdbc:fabricspark://api.fabric.microsoft.com;" +
                     "FabricWorkspaceID=<workspace-id>;" +
                     "FabricLakehouseID=<lakehouse-id>;" +
                     "AuthFlow=AZURE_CLI;" +            // Uses the DefaultAzureCredential chain
                     "hcEnabled=true;" +
                     "sessionTag=pooled_app;" +
                     "hcAcquireTimeoutSeconds=600";  // Poll up to 10 minutes for HC readiness

        // Reuse this pool for the application lifetime; main closes it at process exit.
        try (HikariDataSource pool = createPool(url);
             Connection conn = pool.getConnection();
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery("SELECT 'Pooled LivyDriver connection!' as message")) {

            if (rs.next()) {
                System.out.println(rs.getString("message"));
            }
        }
    }
}

Käytä seuraavia ohjeita poolin konfiguroinnissa:

Ympäristö tai käyttäytyminen Opastus
Uima-altaan omistajuus LivyDataSource on vain suora. Kun toimitat sen HikariCP:lle, HikariCP omistaa poolin. Käytä LivyBuiltInPooledDataSource sen sijaan, kun kuljettajan pitäisi omistaa pooli.
Altaan koko Aloita pienestä poolista ja kasvata sitä vasta mittaamalla työkuorman samanaikaisuuden ja kapasiteetin käytön. Klassisessa tilassa jokaisella fyysisellä yhteydellä on Livy-sessio. HC-tilassa yhteydet voivat jakaa palvelimen hallinnoiman Spark-kapasiteetin.
connectionTimeout Se hallitsee, kuinka kauan soittaja odottaa yhteyden lainaamista, mutta ei peruuta jo käynnissä olevaa yhteydenpitoyritystä. HC-URL-osoitteille salli hcAcquireTimeoutSeconds; klassisessa tilassa LivySessionTimeoutSecondssalli , autentikointi, HTTP-kokeilut ja validointi. HikariCP ilmaisee tämän asetuksen millisekunneissa.
initializationFailTimeout Negatiivinen arvo ohittaa käynnistysyhteyden ja validointiyrityksen. Yhteyshäiriöt ilmenevät, kun sovellus pyytää ensimmäistä kertaa yhteyttä. Käytä positiivista arvoa, jos sovelluksen täytyy varmistaa yhteys käynnistyksen aikana.
Yhteyden validointi HikariCP käyttää Connection.isValid(). Sen tehokasta kestoa säätelee ajurin HTTP-aikakatkaisu ja uudelleenyritys/peruutusasetukset, ei HikariCP validationTimeout:n. Älä määritä yhteystestikyselyä, koska se korvaa kevyemmän validointitarkistuksen Spark-lauseella.

Täydelliset HikariCP-konfiguraatiovaihtoehdot löytyvät katso:

Tietotyyppien kartoitus

Ajuri yhdistää Spark SQL -tietotyypit JDBC:n SQL-tyyppeihin ja Java-tyyppeihin:

Spark SQL Type JDBC SQL Type Java-tyyppi Muistiinpanot
BOOLEAN BOOLEAN Boolean
BYTE TINYINT Byte
SHORT SMALLINT Short
INT INTEGER Integer
LONG BIGINT Long
FLOAT FLOAT Float
DOUBLE DOUBLE Double
DECIMAL DECIMAL BigDecimal Tarkkuus ja mittakaava säilynyt
STRING VARCHAR String
VARCHAR(n) VARCHAR String
CHAR(n) CHAR String
BINARY BINARY byte[]
DATE DATE java.sql.Date
TIMESTAMP TIMESTAMP java.sql.Timestamp
ARRAY ARRAY String Haettu JSON-tekstinä; metatietotyyppi ei takaa täydellistä java.sql.Array accessor-tukea
MAP JAVA_OBJECT String Haettu JSON-tekstinä
STRUCT STRUCT String Haettu JSON-tekstinä; metatietotyyppi ei takaa täydellistä java.sql.Struct accessor-tukea