Så här skapar och uppdaterar du en Spark-jobbdefinition med V2-format via Microsoft Fabric REST API

Spark Job Definition (SJD) är en typ av Fabric-objekt som gör att användare kan definiera och köra Apache Spark-jobb i Microsoft Fabric. Med API:et för Spark-jobbdefinition v2 kan användare skapa och uppdatera Spark-jobbdefinitionsobjekt med ett nytt format med namnet SparkJobDefinitionV2. Den främsta fördelen med att använda v2-formatet är att användarna kan hantera den körbara huvudfilen och andra biblioteksfiler med ett enda API-anrop, i stället för att använda lagrings-API för att ladda upp filer separat behövs ingen mer lagringstoken för att hantera filer.

Förutsättningar

  • En token från Microsoft Entra krävs för att få åtkomst till Fabric REST API. MSAL-biblioteket (Microsoft Authentication Library) rekommenderas för att hämta token. Mer information finns i Stöd för autentiseringsflöde i MSAL.

REST-API:et för Microsoft Fabric definierar en enhetlig slutpunkt för CRUD-åtgärder av Fabric-objekt. Slutpunkten är https://api.fabric.microsoft.com/v1/workspaces/{workspaceId}/items.

Översikt över Spark Job Definition v2-format

I nyttolasten för hantering av en Spark-jobbdefinition används fältet definition för att specificera inställningarna i detalj för Spark-jobbdefinitionen. Fältet definition innehåller två underfält: format och parts. Fältet format anger formatet för Spark-jobbdefinitionsobjektet, som ska vara SparkJobDefinitionV2 för v2-formatet.

Fältet parts är en matris som innehåller den detaljerade konfigurationen av Spark-jobbdefinitionsobjektet. Varje objekt i matrisen parts representerar en del av den detaljerade installationen. Varje del innehåller tre underfält: path, payloadoch payloadType. Fältet path anger sökvägen till delen, payload fältet anger innehållet i den del som är base64-kodad och payloadType fältet anger typen av nyttolast, som ska vara InlineBase64.

Viktigt!

Det här v2-formatet stöder endast Spark-jobbdefinitioner med filformat för .py eller .scala. Det .jar filformatet stöds inte.

Skapa ett Spark-jobbdefinitionsobjekt med huvuddefinitionsfilen och andra lib-filer

I följande exempel skapar vi ett Spark-jobbdefinitionsobjekt som:

  1. Namnet är SJDHelloWorld.
  2. Huvuddefinitionsfilen är main.py, vilken ska läsa en CSV-fil från sitt standard Lakehouse och sedan spara den som en Delta-tabell tillbaka i samma Lakehouse.
  3. Annan lib-fil är libs.py, som har en verktygsfunktion för att returnera namnet på CSV-filen och Delta-tabellen.
  4. Standardvärdet för Lakehouse är inställt på ett specifikt Lakehouse-artefakt-ID.

Följande är den detaljerade nyttolasten för att skapa Spark-jobbdefinitionsobjektet.

{
  "displayName": "SJDHelloWorld",
  "type": "SparkJobDefinition",
  "definition": {
    "format": "SparkJobDefinitionV2",
    "parts": [
      {
        "path": "SparkJobDefinitionV1.json",
        "payload": "<REDACTED>",
        "payloadType": "InlineBase64"
      },
      {
        "path": "Main/main.py",
        "payload": "<REDACTED>",
        "payloadType": "InlineBase64"
      },
      {
        "path": "Libs/lib1.py",
        "payload": "<REDACTED>",
        "payloadType": "InlineBase64"
      }
    ]
  }
}

Om du vill avkoda eller koda den detaljerade installationen kan du använda följande hjälpfunktioner i Python. Det finns också andra onlineverktyg som https://www.base64decode.org/ kan utföra samma jobb.

import base64

def json_to_base64(json_data):
    # Serialize the JSON data to a string
    json_string = json.dumps(json_data)
    
    # Encode the JSON string as bytes
    json_bytes = json_string.encode('utf-8')
    
    # Encode the bytes as Base64
    base64_encoded = base64.b64encode(json_bytes).decode('utf-8')
    
    return base64_encoded

def base64_to_json(base64_data):
    # Decode the Base64-encoded string to bytes
    base64_bytes = base64_data.encode('utf-8')
    
    # Decode the bytes to a JSON string
    json_string = base64.b64decode(base64_bytes).decode('utf-8')
    
    # Deserialize the JSON string to a Python dictionary
    json_data = json.loads(json_string)
    
    return json_data

Ett HTTP-kod 202-svar anger att Spark-jobbdefinitionsobjektet har skapats.

Hämta Spark-jobbdefinition med definitionsdelar i v2-format

Med det nya v2-formatet, när du hämtar ett Spark-jobbdefinitionsobjekt med definitionsdelar, inkluderas filinnehållet i huvuddefinitionsfilen och andra lib-filer i svarsnyttolasten, base64 som kodas under parts fältet. Här är ett exempel på hur du hämtar ett Spark-jobbdefinitionsobjekt med definitionsdelar:

  1. Gör först en POST-begäran till slutpunkten https://api.fabric.microsoft.com/v1/workspaces/{workspaceId}/items/{sjdartifactid}/getDefinitionParts?format=SparkJobDefinitionV2. Kontrollera att värdet för frågeparametern format är SparkJobDefinitionV2.
  2. Kontrollera sedan HTTP-statuskoden i svarshuvudena. En HTTP-kod 202 anger att begäran har godkänts. x-ms-operation-id Kopiera värdet från svarshuvudena.
  3. Slutligen gör du en GET-begäran till slutpunkten https://api.fabric.microsoft.com/v1/operations/{operationId} med det kopierade x-ms-operation-id värdet för att hämta åtgärdsresultatet. I svarsnyttolasten innehåller definition-fältet den detaljerade konfigurationen av objektet spark-jobbdefinition, inklusive huvuddefinitionsfilen och andra lib-filer under fältet parts.

Uppdatera Spark-jobbdefinitionsobjektet med huvuddefinitionsfilen och andra lib-filer i v2-format

Om du vill uppdatera ett befintligt Spark-jobbdefinitionsobjekt med huvuddefinitionsfilen och andra lib-filer i v2-formatet kan du använda en liknande nyttolaststruktur som skapandeåtgärden. Här är ett exempel på hur du uppdaterar det Spark-jobbdefinitionsobjekt som skapades i föregående avsnitt:

{
  "displayName": "SJDHelloWorld",
  "type": "SparkJobDefinition",
  "definition": {
    "format": "SparkJobDefinitionV2",
    "parts": [
      {
        "path": "SparkJobDefinitionV1.json",
        "payload": "<REDACTED>",
        "payloadType": "InlineBase64"
      },
      {
        "path": "Main/main.py",
        "payload": "<REDACTED>",
        "payloadType": "InlineBase64"
      },
      {
        "path": "Libs/lib2.py",
        "payload": "<REDACTED>",
        "payloadType": "InlineBase64"
      }
    ]
  }
}

Med nyttolasten ovan görs följande ändringar i filerna:

  1. Filen main.py uppdateras med nytt innehåll.
  2. Lib1.py tas bort från det här Spark-jobbdefinitionsobjektet och tas även bort från OneLake-lagringen.
  3. En ny lib2.py fil läggs till i det här Spark-jobbdefinitionsobjektet och laddas upp till OneLake-lagringen.

Om du vill uppdatera Spark-jobbdefinitionsobjektet gör du en POST-begäran till slutpunkten https://api.fabric.microsoft.com/v1/workspaces/{workspaceId}/items/{sjdartifactid} med nyttolasten ovan. Ett HTTP-kod 202-svar anger att Spark-jobbdefinitionsobjektet har uppdaterats.