Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Fabric REST API tillhandahåller en tjänsteslutpunkt för CRUD-operationer av Fabric-objekt. I denna handledning går vi igenom ett end-to-end-scenario för hur man skapar och uppdaterar ett Spark-jobbdefinitionsobjekt. Det handlar om tre övergripande steg:
- Skapa ett Spark-jobbdefinitionsobjekt med ett initialt tillstånd.
- Ladda upp huvuddefinitionsfilen och andra lib-filer.
- Uppdatera Spark-jobbdefinitionsobjektet med OneLake-URL:en till huvuddefinitionsfilen och andra biblioteksfiler.
Förutsättningar
- En token från Microsoft Entra krävs för att få åtkomst till Fabric REST API. MSAL-biblioteket rekommenderas för att hämta token. Mer information finns i Stöd för autentiseringsflöde i MSAL.
- En lagringstoken krävs för att få åtkomst till OneLake-API:et. Mer information finns i MSAL för Python.
Skapa ett Spark-jobbdefinitionsobjekt med initialtillståndet
Fabric REST API definierar en enhetlig slutpunkt för CRUD-operationer av Fabric-objekt. Slutpunkten är https://api.fabric.microsoft.com/v1/workspaces/{workspaceId}/items.
Objektinformationen anges i begärandetexten. Här är ett exempel på förfrågningskroppen för att skapa en Spark-jobbdefinition:
{
"displayName": "SJDHelloWorld",
"type": "SparkJobDefinition",
"definition": {
"format": "SparkJobDefinitionV1",
"parts": [
{
"path": "SparkJobDefinitionV1.json",
"payload": "<REDACTED>",
"payloadType": "InlineBase64"
}
]
}
}
I detta exempel heter SJDHelloWorldSpark-jobbdefinitionsobjektet . Fältet payload är det base64-kodade innehållet i den detaljerade installationen. Efter avkodningen är innehållet:
{
"executableFile":null,
"defaultLakehouseArtifactId":"",
"mainClass":"",
"additionalLakehouseIds":[],
"retryPolicy":null,
"commandLineArguments":"",
"additionalLibraryUris":[],
"language":"",
"environmentArtifactId":null
}
Här är två hjälpfunktioner för att koda och avkoda den detaljerade installationen:
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
Här är kodutsnittet för att skapa en Spark-jobbdefinition:
import requests
bearerToken = "<REDACTED>" # Replace this token with the real AAD token
headers = {
"Authorization": f"Bearer {bearerToken}",
"Content-Type": "application/json" # Set the content type based on your request
}
payload = "<REDACTED>"
# Define the payload data for the POST request
payload_data = {
"displayName": "SJDHelloWorld",
"Type": "SparkJobDefinition",
"definition": {
"format": "SparkJobDefinitionV1",
"parts": [
{
"path": "SparkJobDefinitionV1.json",
"payload": payload,
"payloadType": "InlineBase64"
}
]
}
}
# Make the POST request with Bearer authentication
sjdCreateUrl = f"https://api.fabric.microsoft.com//v1/workspaces/{workspaceId}/items"
response = requests.post(sjdCreateUrl, json=payload_data, headers=headers)
Ladda upp huvuddefinitionsfilen och andra lib-filer
En lagringstoken krävs för att ladda upp filen till OneLake. Här är en hjälpfunktion för att hämta lagringstoken:
import msal
def getOnelakeStorageToken():
app = msal.PublicClientApplication(
"<REDACTED>", # This field should be the client ID
authority="https://login.microsoftonline.com/microsoft.com")
result = app.acquire_token_interactive(scopes=["https://storage.azure.com/.default"])
print(f"Successfully acquired AAD token with storage audience:{result['access_token']}")
return result['access_token']
Nu har vi skapat ett Spark-jobbdefinitionsobjekt. För att göra den körbar måste vi konfigurera huvuddefinitionsfilen och nödvändiga egenskaper. Slutpunkten för att ladda upp filen för det här SJD-objektet är https://onelake.dfs.fabric.microsoft.com/{workspaceId}/{sjditemid}. Samma "workspaceId" från föregående steg ska användas. Värdet av "sjditemid" kunde hittas i svarsdelen av föregående steg. Här är kodfragmentet för att konfigurera huvuddefinitionsfilen:
import requests
# Three steps are required: create file, append file, flush file
onelakeEndPoint = "https://onelake.dfs.fabric.microsoft.com/workspaceId/sjditemid" # Replace the ID of workspace and item with the right one
mainExecutableFile = "main.py" # The name of the main executable file
mainSubFolder = "Main" # The sub folder name of the main executable file. Don't change this value
onelakeRequestMainFileCreateUrl = f"{onelakeEndPoint}/{mainSubFolder}/{mainExecutableFile}?resource=file" # The URL for creating the main executable file via the 'file' resource type
onelakePutRequestHeaders = {
"Authorization": f"Bearer {onelakeStorageToken}", # The storage token can be achieved from the helper function above
}
onelakeCreateMainFileResponse = requests.put(onelakeRequestMainFileCreateUrl, headers=onelakePutRequestHeaders)
if onelakeCreateMainFileResponse.status_code == 201:
# Request was successful
print(f"Main File '{mainExecutableFile}' was successfully created in OneLake.")
# With the previous step, the main executable file is created in OneLake. Now we need to append the content of the main executable file
appendPosition = 0
appendAction = "append"
### Main File Append.
mainExecutableFileSizeInBytes = 83 # The size of the main executable file in bytes
onelakeRequestMainFileAppendUrl = f"{onelakeEndPoint}/{mainSubFolder}/{mainExecutableFile}?position={appendPosition}&action={appendAction}"
mainFileContents = "<REDACTED>" # The content of the main executable file, please replace this with the real content of the main executable file
mainExecutableFileSizeInBytes = 83 # The size of the main executable file in bytes, this value should match the size of the mainFileContents
onelakePatchRequestHeaders = {
"Authorization": f"Bearer {onelakeStorageToken}",
"Content-Type": "text/plain"
}
onelakeAppendMainFileResponse = requests.patch(onelakeRequestMainFileAppendUrl, data = mainFileContents, headers=onelakePatchRequestHeaders)
if onelakeAppendMainFileResponse.status_code == 202:
# Request was successful
print(f"Successfully accepted main file '{mainExecutableFile}' append data.")
# With the previous step, the content of the main executable file is appended to the file in OneLake. Now we need to flush the file
flushAction = "flush"
### Main File flush
onelakeRequestMainFileFlushUrl = f"{onelakeEndPoint}/{mainSubFolder}/{mainExecutableFile}?position={mainExecutableFileSizeInBytes}&action={flushAction}"
print(onelakeRequestMainFileFlushUrl)
onelakeFlushMainFileResponse = requests.patch(onelakeRequestMainFileFlushUrl, headers=onelakePatchRequestHeaders)
if onelakeFlushMainFileResponse.status_code == 200:
print(f"Successfully flushed main file '{mainExecutableFile}' contents.")
else:
print(onelakeFlushMainFileResponse.json())
Följ samma process för att ladda upp de andra lib-filerna om det behövs.
Uppdatera Spark-jobbdefinitionsobjektet med OneLake-URL:en till huvuddefinitionsfilen och andra biblioteksfiler
Hittills har vi skapat ett Spark-jobbdefinitionsobjekt med ett initialt tillstånd och laddat upp huvuddefinitionsfilen och andra biblioteksfiler. Det sista steget är att uppdatera Spark-jobbdefinitionsobjektet för att sätta URL-egenskaperna för huvuddefinitionsfilen och andra biblioteksfiler. Slutpunkten för att uppdatera Spark-jobbdefinitionsobjektet är https://api.fabric.microsoft.com/v1/workspaces/{workspaceId}/items/{sjditemid}. Samma "workspaceId" och "sjditemid" som tidigare steg bör användas. Här är kodutsnittet för att uppdatera Spark-jobbdefinitionspunkten:
mainAbfssPath = f"abfss://{workspaceId}@onelake.dfs.fabric.microsoft.com/{sjditemid}/Main/{mainExecutableFile}" # The workspaceId and sjditemid are the same as previous steps, the mainExecutableFile is the name of the main executable file
libsAbfssPath = f"abfss://{workspaceId}@onelake.dfs.fabric.microsoft.com/{sjditemid}/Libs/{libsFile}" # The workspaceId and sjditemid are the same as previous steps, the libsFile is the name of the libs file
defaultLakehouseId = '<REDACTED>' # Replace this with the real default lakehouse ID
updateRequestBodyJson = {
"executableFile": mainAbfssPath,
"defaultLakehouseArtifactId": defaultLakehouseId,
"mainClass": "",
"additionalLakehouseIds": [],
"retryPolicy": None,
"commandLineArguments": "",
"additionalLibraryUris": [libsAbfssPath],
"language": "Python",
"environmentArtifactId": None}
# Encode the bytes as a Base64-encoded string
base64EncodedUpdateSJDPayload = json_to_base64(updateRequestBodyJson)
# Print the Base64-encoded string
print("Base64-encoded JSON payload for SJD Update:")
print(base64EncodedUpdateSJDPayload)
# Define the API URL
updateSjdUrl = f"https://api.fabric.microsoft.com//v1/workspaces/{workspaceId}/items/{sjditemid}/updateDefinition"
updatePayload = base64EncodedUpdateSJDPayload
payloadType = "InlineBase64"
path = "SparkJobDefinitionV1.json"
format = "SparkJobDefinitionV1"
Type = "SparkJobDefinition"
# Define the headers with Bearer authentication
bearerToken = "<REDACTED>" # Replace this token with the real AAD token
headers = {
"Authorization": f"Bearer {bearerToken}",
"Content-Type": "application/json" # Set the content type based on your request
}
# Define the payload data for the POST request
payload_data = {
"displayName": "sjdCreateTest11",
"Type": Type,
"definition": {
"format": format,
"parts": [
{
"path": path,
"payload": updatePayload,
"payloadType": payloadType
}
]
}
}
# Make the POST request with Bearer authentication
response = requests.post(updateSjdUrl, json=payload_data, headers=headers)
if response.status_code == 200:
print("Successfully updated SJD.")
else:
print(response.json())
print(response.status_code)
För att sammanfatta hela processen behövs både Fabric REST API och OneLake API för att skapa och uppdatera ett Spark-jobbdefinitionsobjekt. Fabric REST API används för att skapa och uppdatera Spark-jobbdefinitionsobjektet. OneLake-API:et används för att ladda upp huvuddefinitionsfilen och andra lib-filer. Huvuddefinitionsfilen och andra lib-filer laddas upp till OneLake först. Sedan sätts URL-egenskaperna för huvuddefinitionsfilen och andra biblioteksfiler i Spark-jobbdefinitionsobjektet.