Skript PowerShellu – Přírůstkové načítání dat pomocí služby Azure Data Factory
Tento ukázkový skript PowerShellu načte pouze nové nebo aktualizované záznamy ze zdrojového úložiště dat do úložiště dat jímky po počáteční úplné kopii dat ze zdroje do jímky.
Poznámka:
Při práci s Azure doporučujeme používat modul Azure Az PowerShellu. Začněte tím, že si projdete téma Instalace Azure PowerShellu. Informace o tom, jak migrovat na modul Az PowerShell, najdete v tématu Migrace Azure PowerShellu z AzureRM na Az.
Tato ukázka vyžaduje Azure PowerShell. Verzi zjistíte spuštěním příkazu Get-Module -ListAvailable Az
.
Pokud potřebujete instalaci nebo upgrade, přečtěte si téma Instalace modulu Azure PowerShell.
Spuštěním rutiny Připojení-AzAccount se připojte k Azure.
Projděte si kurz: Přírůstkové kopírování pro předpoklady pro spuštění této ukázky.
Ukázkový skript
Důležité
Tento skript vytvoří soubory JSON, které definují entity služby Data Factory (propojená služba, datová sada a kanál) na pevném disku ve složce c:\.
# Set variables with your own values
$resourceGroupName = "<azure resource group name>" # group will be created if it does not exist already
$dataFactoryName = "<data factory name>" # must be globally unique
$dataFactoryRegion = "East US"
$storageAccountName = "<Az.Storage account name>"
$storageAccountKey = "<Az.Storage account key>"
$azureSqlServer = "<azure sql server name>"
$azureSqlDatabase = "<azure sql database name>"
$azureSqlUser = "<azure sql server - user name>"
$azureSqlPassword = "<azure sql server - user password>"
$outputBlobFolderPath = "<azure blob container>/<folder>" # output folder where the records are copied.
$azureStorageLinkedServiceName = "AzureStorageLinkedService"
$azureSqlDatabaseLinkedServiceName = "AzureSQLDatabaseLinkedService"
$sourceDatasetName = "SourceDataset"
$sinkDatasetName = "SinkDataset"
$sourceSqlTableName = "datasource"
$watermarkDatasetName = "WatermarkDataset"
$pipelineName = "IncrementalCopyPipeline"
# Create a resource group
New-AzResourceGroup -Name $resourceGroupName -Location $dataFactoryRegion
# Create a data factory
$df = Set-AzDataFactoryV2 -ResourceGroupName $resourceGroupName -Location $dataFactoryRegion -Name $dataFactoryName
# Create an Az.Storage linked service in the data factory
## JSON definition of the linked service.
$storageLinkedServiceDefinition = @"
{
"name": "$azureStorageLinkedServiceName",
"properties": {
"type": "AzureStorage",
"typeProperties": {
"connectionString": {
"value": "DefaultEndpointsProtocol=https;AccountName=$storageAccountName;AccountKey=$storageAccountKey",
"type": "SecureString"
}
}
}
}
"@
## IMPORTANT: stores the JSON definition in a file that will be used by the Set-AzDataFactoryV2LinkedService command.
$storageLinkedServiceDefinition | Out-File ./$azureStorageLinkedServiceName.json
## Creates a linked service in the data factory
Set-AzDataFactoryV2LinkedService -DataFactoryName $dataFactoryName -ResourceGroupName $resourceGroupName -Name "$azureStorageLinkedServiceName" -File ./$azureStorageLinkedServiceName.json
## JSON definition of the linked service.
$azureSQLDatabaseLinkedServiceDefinition = @"
{
"name": "$azureSqlDatabaseLinkedService",
"properties": {
"type": "AzureSqlDatabase",
"typeProperties": {
"connectionString": {
"value": "Server = tcp:$azureSqlServer.database.windows.net,1433;Initial Catalog=$azureSqlDatabase; Persist Security Info=False; User ID=$azureSqlUser; Password=$azureSqlPassword; MultipleActiveResultSets = False; Encrypt = True; TrustServerCertificate = False; Connection Timeout = 30;",
"type": "SecureString"
}
}
}
}
"@
## IMPORTANT: stores the JSON definition in a file that will be used by the Set-AzDataFactoryV2LinkedService command.
$azureSQLDatabaseLinkedServiceDefinition | Out-File ./$azureSqlDatabaseLinkedServiceName.json
## Creates a linked service in the data factory
Set-AzDataFactoryV2LinkedService -DataFactoryName $dataFactoryName -ResourceGroupName $resourceGroupName -Name "$azureSqlDatabaseLinkedServiceName" -File ./$azureSqlDatabaseLinkedServiceName.json
# Create an Azure SQL dataset in the data factory
## JSON definition of the dataset
$sourceDataset = @"
{
"name": "$sourceDatasetName",
"properties": {
"type": "AzureSqlTable",
"typeProperties": {
"tableName": "$sourceSqlTableName"
},
"linkedServiceName": {
"referenceName": "$azureSqlDatabaseLinkedServiceName",
"type": "LinkedServiceReference"
}
}
}
"@
## IMPORTANT: store the JSON definition in a file that will be used by the Set-AzDataFactoryV2Dataset command.
$sourceDataset | Out-File ./$sourceDatasetName.json
## Create a dataset in the data factory
Set-AzDataFactoryV2Dataset -DataFactoryName $dataFactoryName -ResourceGroupName $resourceGroupName -Name "$sourceDatasetName" -File "./$sourceDatasetName.json"
# Create an Azure Blob dataset in the data factory
## JSON definition of the dataset
$sinkDataset = @"
{
"name": "$sinkDatasetName",
"properties": {
"type": "AzureBlob",
"typeProperties": {
"folderPath": "$outputBlobFolderPath",
"format": {
"type": "TextFormat"
}
},
"linkedServiceName": {
"referenceName": "$azureStorageLinkedServiceName",
"type": "LinkedServiceReference"
}
}
}
"@
## IMPORTANT: store the JSON definition in a file that will be used by the Set-AzDataFactoryV2Dataset command.
$sinkDataset | Out-File ./$sinkDatasetName.json
## Create a dataset in the data factory
Set-AzDataFactoryV2Dataset -DataFactoryName $dataFactoryName -ResourceGroupName $resourceGroupName -Name "$sinkDatasetName" -File "./$sinkDatasetName.json"
## JSON definition of the dataset
$watermarkDataset = @"
{
"name": "$watermarkDatasetName",
"properties": {
"type": "AzureSqlTable",
"typeProperties": {
"tableName": "watermarktable"
},
"linkedServiceName": {
"referenceName": "$azureSqlDatabaseLinkedServiceName",
"type": "LinkedServiceReference"
}
}
}
"@
## IMPORTANT: store the JSON definition in a file that will be used by the Set-AzDataFactoryV2Dataset command.
$watermarkDataset | Out-File ./$watermarkDatasetName.json
## Create a dataset in the data factory
Set-AzDataFactoryV2Dataset -DataFactoryName $dataFactoryName -ResourceGroupName $resourceGroupName -Name "$watermarkDatasetName" -File "./$watermarkDatasetName.json"
# Create a pipeline in the data factory
## JSON definition of the pipeline
$pipelineDefinition = @"
{
"name": "$pipelineName",
"properties": {
"activities": [
{
"name": "LookupWaterMarkActivity",
"type": "Lookup",
"typeProperties": {
"source": {
"type": "SqlSource",
"sqlReaderQuery": "select * from watermarktable"
},
"dataset": {
"referenceName": "$watermarkDatasetName",
"type": "DatasetReference"
}
}
},
{
"name": "LookupMaxValuefromSourceActivity",
"type": "Lookup",
"typeProperties": {
"source": {
"type": "SqlSource",
"sqlReaderQuery": "SELECT MAX(LastModifytime) as NewWatermarkvalue FROM dbo.datasource"
},
"dataset": {
"referenceName": "$sourceDatasetName",
"type": "DatasetReference"
}
}
},
{
"name": "IncrementalCopyActivity",
"type": "Copy",
"typeProperties": {
"source": {
"type": "SqlSource",
"sqlReaderQuery": "select * from dbo.datasource where LastModifytime > '@{activity('LookupWaterMarkActivity').output.WatermarkValue}' and LastModifytime <= '@{activity('LookupMaxValuefromSourceActivity').output.NewWatermarkvalue}'"
},
"sink": {
"type": "BlobSink"
}
},
"dependsOn": [
{
"activity": "LookupMaxValuefromSourceActivity",
"dependencyConditions": [
"Succeeded"
]
},
{
"activity": "LookupWaterMarkActivity",
"dependencyConditions": [
"Succeeded"
]
}
],
"inputs": [
{
"referenceName": "$sourceDatasetName",
"type": "DatasetReference"
}
],
"outputs": [
{
"referenceName": "$sinkDatasetName",
"type": "DatasetReference"
}
]
},
{
"name": "StoredProceduretoWriteWatermarkActivity",
"type": "SqlServerStoredProcedure",
"typeProperties": {
"storedProcedureName": "sp_write_watermark",
"storedProcedureParameters": {
"LastModifiedtime": {"value": "@{activity('LookupMaxValuefromSourceActivity').output.NewWatermarkvalue}", "type": "datetime" },
"TableName": { "value":"@{activity('LookupWaterMarkActivity').output.TableName}", "type":"String"}
}
},
"linkedServiceName": {
"referenceName": "$azureSqlDatabaseLinkedServiceName",
"type": "LinkedServiceReference"
},
"dependsOn": [
{
"activity": "IncrementalCopyActivity",
"dependencyConditions": [
"Succeeded"
]
}
]
}
],
}
}
"@
## IMPORTANT: store the JSON definition in a file that will be used by the Set-AzDataFactoryV2Pipeline command.
$pipelineDefinition | Out-File ./$pipelineName.json
## Create a pipeline in the data factory
Set-AzDataFactoryV2Pipeline -DataFactoryName $dataFactoryName -ResourceGroupName $resourceGroupName -Name "$pipelineName" -File "./$pipelineName.json"
$RunId = Invoke-AzDataFactoryV2Pipeline -PipelineName "$pipelineName" -ResourceGroup $resourceGroupName -dataFactoryName $dataFactoryName
# Check the pipeline run status until it finishes the copy operation
Start-Sleep -Seconds 30
while ($True) {
$result = Get-AzDataFactoryV2ActivityRun -DataFactoryName $dataFactoryName -ResourceGroupName $resourceGroupName -PipelineRunId $runId -RunStartedAfter (Get-Date).AddMinutes(-30) -RunStartedBefore (Get-Date).AddMinutes(30)
if (($result | Where-Object { $_.Status -eq "InProgress" } | Measure-Object).count -ne 0) {
Write-Host "Pipeline run status: In Progress" -foregroundcolor "Yellow"
Start-Sleep -Seconds 30
}
else {
Write-Host "Pipeline '"$pipelineName"' run finished. Result:" -foregroundcolor "Yellow"
$result
break
}
}
$result = Get-AzDataFactoryV2ActivityRun -DataFactoryName $dataFactoryName -ResourceGroupName $resourceGroupName `
-PipelineRunId $runId `
-RunStartedAfter (Get-Date).AddMinutes(-10) `
-RunStartedBefore (Get-Date).AddMinutes(10) `
-ErrorAction Stop
$result
if ($result.Status -eq "Succeeded") {`
$result.Output -join "`r`n"`
}`
else {`
$result.Error -join "`r`n"`
}
# INSERT INTO datasource
# VALUES (6, 'newdata','9/6/2017 2:23:00 AM')
# INSERT INTO datasource
# VALUES (7, 'newdata','9/7/2017 9:01:00 AM')
# Inovke the pipeline and see that only new records are copied to the destination.
# To remove the data factory from the resource gorup
# Remove-AzDataFactoryV2 -Name $dataFactoryName -ResourceGroupName $resourceGroupName
#
# To remove the whole resource group
# Remove-AzResourceGroup -Name $resourceGroupName
Vyčištění nasazení
Po spuštění ukázkového skriptu můžete pomocí následujícího příkazu odebrat skupinu prostředků a všechny přidružené prostředky:
Remove-AzResourceGroup -ResourceGroupName $resourceGroupName
Pokud chcete odebrat datovou továrnu ze skupiny prostředků, spusťte následující příkaz:
Remove-AzDataFactoryV2 -Name $dataFactoryName -ResourceGroupName $resourceGroupName
Vysvětlení skriptu
Tento skript používá následující příkazy:
Příkaz | Notes |
---|---|
New-AzResourceGroup | Vytvoří skupinu prostředků, ve které se ukládají všechny prostředky. |
Set-AzDataFactoryV2 | Vytvoření datové továrny |
Set-AzDataFactoryV2LinkedService | Vytvoří propojenou službu v datové továrně. Propojená služba propojí úložiště dat nebo výpočetní prostředky s datovou továrnou. |
Set-AzDataFactoryV2Dataset | Vytvoří datovou sadu v datové továrně. Datová sada představuje vstup/výstup aktivity v kanálu. |
Set-AzDataFactoryV2Pipeline | Vytvoří kanál v datové továrně. Kanál obsahuje jednu nebo více aktivit, které provádějí určitou operaci. V tomto kanálu aktivita kopírování kopíruje data z jednoho umístění do jiného umístění ve službě Azure Blob Storage. |
Invoke-AzDataFactoryV2Pipeline | Vytvoří spuštění kanálu. Jinými slovy, spustí kanál. |
Get-AzDataFactoryV2ActivityRun | Získá podrobnosti o spuštění aktivity (spuštění aktivity) v kanálu. |
Remove-AzResourceGroup | Odstraní skupinu prostředků včetně všech vnořených prostředků. |
Související obsah
Další informace o Azure PowerShellu najdete v dokumentaci k Azure PowerShellu.
Další ukázky skriptů PowerShellu pro Azure Data Factory najdete ve skriptech PowerShellu služby Azure Data Factory.