Dela via


Kopiera flera tabeller i grupp med hjälp av Azure Data Factory med hjälp av PowerShell

GÄLLER FÖR: Azure Data Factory Azure Synapse Analytics

Dricks

Prova Data Factory i Microsoft Fabric, en allt-i-ett-analyslösning för företag. Microsoft Fabric omfattar allt från dataflytt till datavetenskap, realtidsanalys, business intelligence och rapportering. Lär dig hur du startar en ny utvärderingsversion kostnadsfritt!

Den här självstudien visar hur du kopierar ett antal tabeller från Azure SQL Database till Azure Synapse Analytics. Du kan även använda samma mönster i andra kopieringssituationer. Till exempel kan du kopiera tabeller från SQL Server/Oracle till Azure SQL Database/Data Warehouse/Azure Blob eller kopiera olika sökvägar från Blob till Azure SQL Database-tabeller.

Sett på en hög nivå ingår följande steg i självstudierna:

  • Skapa en datafabrik.
  • Skapa länkade Azure SQL Database-, Azure Synapse Analytics- och Azure Storage-länkade tjänster.
  • Skapa Azure SQL Database- och Azure Synapse Analytics-datauppsättningar.
  • Skapa en pipeline för sökning av de tabeller som ska kopieras och en annan pipeline för den faktiska kopieringsåtgärden.
  • Starta en pipelinekörning.
  • Övervaka pipelinen och aktivitetskörningarna.

I den här kursen används Azure PowerShell. Läs mer om att använda andra verktyg/SDK:er för att skapa en datafabrik i Snabbstarter.

Arbetsflödet slutpunkt till slutpunkt

I det här scenariot har vi ett antal tabeller i Azure SQL Database som vi vill kopiera till Azure Synapse Analytics. Här är den logiska ordningsföljden i arbetsflödet som sker i våra pipelines:

Arbetsflöde

  • Den första pipelinen letar rätt på listan med tabeller som ska kopieras till de mottagande datalagren. Du kan istället underhålla en metadatatabell som innehåller alla tabeller som ska kopieras till de mottagande datalagren. Sedan utlöser pipelinen en annan pipeline, som itererar över varje tabell i databasen och utför själva datakopieringen.
  • Den andra pipelinen utför den faktiska kopieringen. Den tar listan med tabeller som en parameter. För varje tabell i listan kopierar du den specifika tabellen i Azure SQL Database till motsvarande tabell i Azure Synapse Analytics med mellanlagrad kopia via Blob Storage och PolyBase för bästa prestanda. I det här exemplet skickar den första pipelinen listan med tabeller som värde för parametern.

Om du inte har någon Azure-prenumeration skapar du ett kostnadsfritt konto innan du börjar.

Förutsättningar

Kommentar

Vi rekommenderar att du använder Azure Az PowerShell-modulen för att interagera med Azure. Information om hur du kommer igång finns i Installera Azure PowerShell. Information om hur du migrerar till Az PowerShell-modulen finns i artikeln om att migrera Azure PowerShell från AzureRM till Az.

  • Azure PowerShell. Följ instruktionerna i Så här installerar och konfigurerar du Azure PowerShell.
  • Azure Storage-konto. Azure Storage-kontot används för mellanlagring för Blob Storage i masskopieringsåtgärden.
  • Azure SQL Database. Den här databasen innehåller källdata.
  • Azure Synapse Analytics. Det här datalagret innehåller de data som kopieras från SQL Database.

Förbereda SQL Database och Azure Synapse Analytics

Förbered Azure SQL Database-källan:

Skapa en databas med Adventure Works LT-exempeldata i SQL Database genom att följa artikeln Skapa en databas i Azure SQL Database . Den här självstudien kopierar alla tabeller från den här exempeldatabasen till Azure Synapse Analytics.

Förbered Azure Synapse Analytics för mottagare:

  1. Om du inte har någon Azure Synapse Analytics-arbetsyta kan du läsa artikeln Kom igång med Azure Synapse Analytics för steg för att skapa en.

  2. Skapa motsvarande tabellscheman i Azure Synapse Analytics. Du kommer att använda Azure Data Factory till att migrera/kopiera data i ett senare steg.

Azure-tjänster för åtkomst till SQL-servern

För både SQL Database och Azure Synapse Analytics tillåter du att Azure-tjänster får åtkomst till SQL Server. Se till att inställningen Tillåt åtkomst till Azure-tjänster är aktiverad för servern. Med den här inställningen kan Data Factory-tjänsten läsa data från din Azure SQL Database och skriva data till Azure Synapse Analytics. Gör så här för att kontrollera och aktivera den här inställningen:

  1. Klicka på Alla tjänster till vänster och klicka på SQL-servrar.
  2. Välj din server och klicka på Brandvägg under INSTÄLLNINGAR.
  3. På sidan Brandväggsinställningar klickar du på för Tillåt åtkomst till Azure-tjänster.

Skapa en datafabrik

  1. Starta PowerShell. Låt Azure PowerShell vara öppet tills du är klar med självstudien. Om du stänger och öppnar det igen måste du köra kommandona en gång till.

    Kör följande kommando och ange det användarnamn och lösenord som du använder för att logga in i Azure Portal:

    Connect-AzAccount
    

    Kör följande kommando för att visa alla prenumerationer för det här kontot:

    Get-AzSubscription
    

    Kör följande kommando för att välja den prenumeration som du vill arbeta med. Ersätt SubscriptionId med ID:t för din Azure-prenumeration:

    Select-AzSubscription -SubscriptionId "<SubscriptionId>"
    
  2. Kör cmdleten Set-AzDataFactoryV2 för att skapa en datafabrik. Ersätt platshållarna med egna värden innan du kör kommandot.

    $resourceGroupName = "<your resource group to create the factory>"
    $dataFactoryName = "<specify the name of data factory to create. It must be globally unique.>"
    Set-AzDataFactoryV2 -ResourceGroupName $resourceGroupName -Location "East US" -Name $dataFactoryName
    

    Observera följande:

    • Namnet på Azure Data Factory måste vara globalt unikt. Om du får följande felmeddelande ändrar du namnet och försöker igen.

      The specified Data Factory name 'ADFv2QuickStartDataFactory' is already in use. Data Factory names must be globally unique.
      
    • När du ska skapa Data Factory-instanser måste du vara deltagare/administratör för Azure-prenumerationen.

    • Om du vill se en lista med Azure-regioner där Data Factory är tillgängligt för närvarande markerar du de regioner du är intresserad av på följande sida. Expandera sedan Analytics och leta rätt på Data Factory: Tillgängliga produkter per region. Datalagren (Azure Storage, Azure SQL Database osv.) och beräkningarna (HDInsight osv.) som används i Data Factory kan finnas i andra regioner.

Skapa länkade tjänster

I den här självstudien skapar du tre länkade tjänster för käll-, mottagar- och mellanlagringsbloben, som innehåller anslutningar till dina datalager:

Skapa den länkade tjänsten för Azure SQL Database-källan

  1. Skapa en JSON-fil med namnet AzureSqlDatabaseLinkedService.json i mappen C:\ADFv2TutorialBulkCopy med följande innehåll: (skapa mappen ADFv2TutorialBulkCopy om den inte redan finns.)

    Viktigt!

    Ersätt <servernamn>, <databasnamn>, <username>@<servername> och <lösenord> med värden för din Azure SQL Database innan du sparar filen.

    {
        "name": "AzureSqlDatabaseLinkedService",
        "properties": {
            "type": "AzureSqlDatabase",
            "typeProperties": {
                "connectionString": "Server=tcp:<servername>.database.windows.net,1433;Database=<databasename>;User ID=<username>@<servername>;Password=<password>;Trusted_Connection=False;Encrypt=True;Connection Timeout=30"
            }
        }
    }
    
  2. I Azure PowerShell växlar du till mappen ADFv2TutorialBulkCopy.

  3. Kör cmdleten Set-AzDataFactoryV2LinkedService för att skapa den länkade tjänsten: AzureSqlDatabaseLinkedService.

    Set-AzDataFactoryV2LinkedService -DataFactoryName $dataFactoryName -ResourceGroupName $resourceGroupName -Name "AzureSqlDatabaseLinkedService" -File ".\AzureSqlDatabaseLinkedService.json"
    

    Här är exempel på utdata:

    LinkedServiceName : AzureSqlDatabaseLinkedService
    ResourceGroupName : <resourceGroupName>
    DataFactoryName   : <dataFactoryName>
    Properties        : Microsoft.Azure.Management.DataFactory.Models.AzureSqlDatabaseLinkedService
    

Skapa den länkade azure Synapse Analytics-tjänsten för mottagare

  1. Skapa en JSON-fil med namnet AzureSqlDWLinkedService.json i mappen C:\ADFv2TutorialBulkCopy med följande innehåll:

    Viktigt!

    Ersätt <servernamn>, <databasnamn>, <username>@<servername> och <lösenord> med värden för din Azure SQL Database innan du sparar filen.

    {
        "name": "AzureSqlDWLinkedService",
        "properties": {
            "type": "AzureSqlDW",
            "typeProperties": {
                "connectionString": "Server=tcp:<servername>.database.windows.net,1433;Database=<databasename>;User ID=<username>@<servername>;Password=<password>;Trusted_Connection=False;Encrypt=True;Connection Timeout=30"
            }
        }
    }
    
  2. Om du vill skapa den länkade tjänsten: AzureSqlDWLinkedService kör du cmdleten Set-AzDataFactoryV2LinkedService .

    Set-AzDataFactoryV2LinkedService -DataFactoryName $dataFactoryName -ResourceGroupName $resourceGroupName -Name "AzureSqlDWLinkedService" -File ".\AzureSqlDWLinkedService.json"
    

    Här är exempel på utdata:

    LinkedServiceName : AzureSqlDWLinkedService
    ResourceGroupName : <resourceGroupName>
    DataFactoryName   : <dataFactoryName>
    Properties        : Microsoft.Azure.Management.DataFactory.Models.AzureSqlDWLinkedService
    

Skapa den länkade tjänsten för Azure Storage-mellanlagringen

I den här självstudien använder du Azure Blob Storage som ett mellanlagringsutrymme så att PolyBase aktiveras och ger kopieringen bättre prestanda.

  1. Skapa en JSON-fil med namnet AzureStorageLinkedService.json i mappen C:\ADFv2TutorialBulkCopy med följande innehåll:

    Viktigt!

    Ersätt <accountName> och <accountKey> med namnet och nyckeln för ditt Azure Storage-konto innan du sparar filen.

    {
        "name": "AzureStorageLinkedService",
        "properties": {
            "type": "AzureStorage",
            "typeProperties": {
                "connectionString": "DefaultEndpointsProtocol=https;AccountName=<accountName>;AccountKey=<accountKey>"
            }
        }
    }
    
  2. Skapa den länkade tjänsten: AzureStorageLinkedService genom att köra cmdleten Set-AzDataFactoryV2LinkedService .

    Set-AzDataFactoryV2LinkedService -DataFactoryName $dataFactoryName -ResourceGroupName $resourceGroupName -Name "AzureStorageLinkedService" -File ".\AzureStorageLinkedService.json"
    

    Här är exempel på utdata:

    LinkedServiceName : AzureStorageLinkedService
    ResourceGroupName : <resourceGroupName>
    DataFactoryName   : <dataFactoryName>
    Properties        : Microsoft.Azure.Management.DataFactory.Models.AzureStorageLinkedService
    

Skapa datauppsättningar

I den här självstudien skapar du datauppsättningar för källa och mottagare som anger var data lagras:

Skapa en datauppsättning för SQL Database-källan

  1. Skapa en JSON-fil med namnet AzureSqlDatabaseDataset.json i mappen C:\ADFv2TutorialBulkCopy med följande innehåll: ”tableName” är en platshållare eftersom du senare använder SQL-frågan i kopieringsaktiviteten till att hämta data.

    {
        "name": "AzureSqlDatabaseDataset",
        "properties": {
            "type": "AzureSqlTable",
            "linkedServiceName": {
                "referenceName": "AzureSqlDatabaseLinkedService",
                "type": "LinkedServiceReference"
            },
            "typeProperties": {
                "tableName": "dummy"
            }
        }
    }
    
  2. Om du vill skapa datauppsättningen: AzureSqlDatabaseDataset kör du cmdleten Set-AzDataFactoryV2Dataset .

    Set-AzDataFactoryV2Dataset -DataFactoryName $dataFactoryName -ResourceGroupName $resourceGroupName -Name "AzureSqlDatabaseDataset" -File ".\AzureSqlDatabaseDataset.json"
    

    Här är exempel på utdata:

    DatasetName       : AzureSqlDatabaseDataset
    ResourceGroupName : <resourceGroupname>
    DataFactoryName   : <dataFactoryName>
    Structure         :
    Properties        : Microsoft.Azure.Management.DataFactory.Models.AzureSqlTableDataset
    

Skapa en datauppsättning för Azure Synapse Analytics för mottagare

  1. Skapa en JSON-fil med namnet AzureSqlDWDataset.json i mappen C:\ADFv2TutorialBulkCopy med följande innehåll: ”tableName” anges som en parameter, senare skickar kopieringsaktiviteten som refererar till den här datauppsättningen det faktiska värdet till datauppsättningen.

    {
        "name": "AzureSqlDWDataset",
        "properties": {
            "type": "AzureSqlDWTable",
            "linkedServiceName": {
                "referenceName": "AzureSqlDWLinkedService",
                "type": "LinkedServiceReference"
            },
            "typeProperties": {
                "tableName": {
                    "value": "@{dataset().DWTableName}",
                    "type": "Expression"
                }
            },
            "parameters":{
                "DWTableName":{
                    "type":"String"
                }
            }
        }
    }
    
  2. Om du vill skapa datauppsättningen: AzureSqlDWDataset kör du cmdleten Set-AzDataFactoryV2Dataset .

    Set-AzDataFactoryV2Dataset -DataFactoryName $dataFactoryName -ResourceGroupName $resourceGroupName -Name "AzureSqlDWDataset" -File ".\AzureSqlDWDataset.json"
    

    Här är exempel på utdata:

    DatasetName       : AzureSqlDWDataset
    ResourceGroupName : <resourceGroupname>
    DataFactoryName   : <dataFactoryName>
    Structure         :
    Properties        : Microsoft.Azure.Management.DataFactory.Models.AzureSqlDwTableDataset
    

Skapa pipelines

I den här självstudien skapar du två pipelines:

Skapa pipelinen ”IterateAndCopySQLTables”

Den här pipelinen tar en lista med tabeller som en parameter. För varje tabell i listan kopieras data från tabellen i Azure SQL Database till Azure Synapse Analytics med mellanlagrad kopia och PolyBase.

  1. Skapa en JSON-fil med namnet IterateAndCopySQLTables.json i mappen C:\ADFv2TutorialBulkCopy med följande innehåll:

    {
        "name": "IterateAndCopySQLTables",
        "properties": {
            "activities": [
                {
                    "name": "IterateSQLTables",
                    "type": "ForEach",
                    "typeProperties": {
                        "isSequential": "false",
                        "items": {
                            "value": "@pipeline().parameters.tableList",
                            "type": "Expression"
                        },
                        "activities": [
                            {
                                "name": "CopyData",
                                "description": "Copy data from Azure SQL Database to Azure Synapse Analytics",
                                "type": "Copy",
                                "inputs": [
                                    {
                                        "referenceName": "AzureSqlDatabaseDataset",
                                        "type": "DatasetReference"
                                    }
                                ],
                                "outputs": [
                                    {
                                        "referenceName": "AzureSqlDWDataset",
                                        "type": "DatasetReference",
                                        "parameters": {
                                            "DWTableName": "[@{item().TABLE_SCHEMA}].[@{item().TABLE_NAME}]"
                                        }
                                    }
                                ],
                                "typeProperties": {
                                    "source": {
                                        "type": "SqlSource",
                                        "sqlReaderQuery": "SELECT * FROM [@{item().TABLE_SCHEMA}].[@{item().TABLE_NAME}]"
                                    },
                                    "sink": {
                                        "type": "SqlDWSink",
                                        "preCopyScript": "TRUNCATE TABLE [@{item().TABLE_SCHEMA}].[@{item().TABLE_NAME}]",
                                        "allowPolyBase": true
                                    },
                                    "enableStaging": true,
                                    "stagingSettings": {
                                        "linkedServiceName": {
                                            "referenceName": "AzureStorageLinkedService",
                                            "type": "LinkedServiceReference"
                                        }
                                    }
                                }
                            }
                        ]
                    }
                }
            ],
            "parameters": {
                "tableList": {
                    "type": "Object"
                }
            }
        }
    }
    
  2. Skapa pipelinen: IterateAndCopySQLTables genom att köra cmdleten Set-AzDataFactoryV2Pipeline .

    Set-AzDataFactoryV2Pipeline -DataFactoryName $dataFactoryName -ResourceGroupName $resourceGroupName -Name "IterateAndCopySQLTables" -File ".\IterateAndCopySQLTables.json"
    

    Här är exempel på utdata:

    PipelineName      : IterateAndCopySQLTables
    ResourceGroupName : <resourceGroupName>
    DataFactoryName   : <dataFactoryName>
    Activities        : {IterateSQLTables}
    Parameters        : {[tableList, Microsoft.Azure.Management.DataFactory.Models.ParameterSpecification]}
    

Skapa pipelinen ”GetTableListAndTriggerCopyData”

Den här pipelinen utför två steg:

  • Den söker i Azure SQL Database-systemtabellen för att få fram listan med tabeller som ska kopieras
  • den utlöser pipelinen ”IterateAndCopySQLTables” för att utföra den faktiska kopieringen.
  1. Skapa en JSON-fil med namnet GetTableListAndTriggerCopyData.json i mappen C:\ADFv2TutorialBulkCopy med följande innehåll:

    {
        "name":"GetTableListAndTriggerCopyData",
        "properties":{
            "activities":[
                { 
                    "name": "LookupTableList",
                    "description": "Retrieve the table list from Azure SQL database",
                    "type": "Lookup",
                    "typeProperties": {
                        "source": {
                            "type": "SqlSource",
                            "sqlReaderQuery": "SELECT TABLE_SCHEMA, TABLE_NAME FROM information_schema.TABLES WHERE TABLE_TYPE = 'BASE TABLE' and TABLE_SCHEMA = 'SalesLT' and TABLE_NAME <> 'ProductModel'"
                        },
                        "dataset": {
                            "referenceName": "AzureSqlDatabaseDataset",
                            "type": "DatasetReference"
                        },
                        "firstRowOnly": false
                    }
                },
                {
                    "name": "TriggerCopy",
                    "type": "ExecutePipeline",
                    "typeProperties": {
                        "parameters": {
                            "tableList": {
                                "value": "@activity('LookupTableList').output.value",
                                "type": "Expression"
                            }
                        },
                        "pipeline": {
                            "referenceName": "IterateAndCopySQLTables",
                            "type": "PipelineReference"
                        },
                        "waitOnCompletion": true
                    },
                    "dependsOn": [
                        {
                            "activity": "LookupTableList",
                            "dependencyConditions": [
                                "Succeeded"
                            ]
                        }
                    ]
                }
            ]
        }
    }
    
  2. Skapa pipelinen: GetTableListAndTriggerCopyData genom att köra cmdleten Set-AzDataFactoryV2Pipeline .

    Set-AzDataFactoryV2Pipeline -DataFactoryName $dataFactoryName -ResourceGroupName $resourceGroupName -Name "GetTableListAndTriggerCopyData" -File ".\GetTableListAndTriggerCopyData.json"
    

    Här är exempel på utdata:

    PipelineName      : GetTableListAndTriggerCopyData
    ResourceGroupName : <resourceGroupName>
    DataFactoryName   : <dataFactoryName>
    Activities        : {LookupTableList, TriggerCopy}
    Parameters        :
    

Starta och övervaka en pipelinekörning

  1. Starta en pipelinekörning för huvudpipelinen ”GetTableListAndTriggerCopyData” och spara pipelinekörningens ID för framtida övervakning. Därefter utlöses körningen av pipelinen ”IterateAndCopySQLTables” som anges i aktiviteten ExecutePipeline.

    $runId = Invoke-AzDataFactoryV2Pipeline -DataFactoryName $dataFactoryName -ResourceGroupName $resourceGroupName -PipelineName 'GetTableListAndTriggerCopyData'
    
  2. Kör följande skript som kontinuerligt kontrollerar körningsstatus för pipelinen GetTableListAndTriggerCopyData och skriver ut slutresultatet för pipelinekörningen och aktiviteten.

    while ($True) {
        $run = Get-AzDataFactoryV2PipelineRun -ResourceGroupName $resourceGroupName -DataFactoryName $DataFactoryName -PipelineRunId $runId
    
        if ($run) {
            if ($run.Status -ne 'InProgress') {
                Write-Host "Pipeline run finished. The status is: " $run.Status -ForegroundColor "Yellow"
                Write-Host "Pipeline run details:" -ForegroundColor "Yellow"
                $run
                break
            }
            Write-Host  "Pipeline is running...status: InProgress" -ForegroundColor "Yellow"
        }
    
        Start-Sleep -Seconds 15
    }
    
    $result = Get-AzDataFactoryV2ActivityRun -DataFactoryName $dataFactoryName -ResourceGroupName $resourceGroupName -PipelineRunId $runId -RunStartedAfter (Get-Date).AddMinutes(-30) -RunStartedBefore (Get-Date).AddMinutes(30)
    Write-Host "Activity run details:" -ForegroundColor "Yellow"
    $result
    

    Här är utdata från exempelkörningen:

    Pipeline run details:
    ResourceGroupName : <resourceGroupName>
    DataFactoryName   : <dataFactoryName>
    RunId             : 0000000000-00000-0000-0000-000000000000
    PipelineName      : GetTableListAndTriggerCopyData
    LastUpdated       : 9/18/2017 4:08:15 PM
    Parameters        : {}
    RunStart          : 9/18/2017 4:06:44 PM
    RunEnd            : 9/18/2017 4:08:15 PM
    DurationInMs      : 90637
    Status            : Succeeded
    Message           : 
    
    Activity run details:
    ResourceGroupName : <resourceGroupName>
    DataFactoryName   : <dataFactoryName>
    ActivityName      : LookupTableList
    PipelineRunId     : 0000000000-00000-0000-0000-000000000000
    PipelineName      : GetTableListAndTriggerCopyData
    Input             : {source, dataset, firstRowOnly}
    Output            : {count, value, effectiveIntegrationRuntime}
    LinkedServiceName : 
    ActivityRunStart  : 9/18/2017 4:06:46 PM
    ActivityRunEnd    : 9/18/2017 4:07:09 PM
    DurationInMs      : 22995
    Status            : Succeeded
    Error             : {errorCode, message, failureType, target}
    
    ResourceGroupName : <resourceGroupName>
    DataFactoryName   : <dataFactoryName>
    ActivityName      : TriggerCopy
    PipelineRunId     : 0000000000-00000-0000-0000-000000000000
    PipelineName      : GetTableListAndTriggerCopyData
    Input             : {pipeline, parameters, waitOnCompletion}
    Output            : {pipelineRunId}
    LinkedServiceName : 
    ActivityRunStart  : 9/18/2017 4:07:11 PM
    ActivityRunEnd    : 9/18/2017 4:08:14 PM
    DurationInMs      : 62581
    Status            : Succeeded
    Error             : {errorCode, message, failureType, target}
    
  3. Du kan få fram körnings-ID:t för pipelinen ”IterateAndCopySQLTables” och se detaljerade resultat från aktivitetskörningen genom att köra följande:

    Write-Host "Pipeline 'IterateAndCopySQLTables' run result:" -ForegroundColor "Yellow"
    ($result | Where-Object {$_.ActivityName -eq "TriggerCopy"}).Output.ToString()
    

    Här är utdata från exempelkörningen:

    {
        "pipelineRunId": "7514d165-14bf-41fb-b5fb-789bea6c9e58"
    }
    
    $result2 = Get-AzDataFactoryV2ActivityRun -DataFactoryName $dataFactoryName -ResourceGroupName $resourceGroupName -PipelineRunId <copy above run ID> -RunStartedAfter (Get-Date).AddMinutes(-30) -RunStartedBefore (Get-Date).AddMinutes(30)
    $result2
    
  4. Anslut till din mottagare Azure Synapse Analytics och bekräfta att data har kopierats från Azure SQL Database korrekt.

I den här självstudiekursen fick du:

  • Skapa en datafabrik.
  • Skapa länkade Azure SQL Database-, Azure Synapse Analytics- och Azure Storage-länkade tjänster.
  • Skapa Azure SQL Database- och Azure Synapse Analytics-datauppsättningar.
  • Skapa en pipeline för sökning av de tabeller som ska kopieras och en annan pipeline för den faktiska kopieringsåtgärden.
  • Starta en pipelinekörning.
  • Övervaka pipelinen och aktivitetskörningarna.

Fortsätt till följande självstudiekurs om du vill lära dig att kopiera data stegvis från en källa till ett mål: