PowerShell を使用し、Azure Data Factory を使用して複数のテーブルを一括コピーする
適用対象: Azure Data Factory Azure Synapse Analytics
ヒント
企業向けのオールインワン分析ソリューション、Microsoft Fabric の Data Factory をお試しください。 Microsoft Fabric は、データ移動からデータ サイエンス、リアルタイム分析、ビジネス インテリジェンス、レポートまで、あらゆるものをカバーしています。 無料で新しい試用版を開始する方法について説明します。
このチュートリアルでは、Azure SQL Database から Azure Synapse Analytics に多数のテーブルをコピーする方法について説明します。 同じパターンは他のコピー シナリオでも適用できます。 たとえば、SQL Server/Oracle から Azure SQL Database/Data Warehouse/Azure BLOB にテーブルをコピーしたり、BLOB から Azure SQL Database テーブルにさまざまなパスをコピーしたりするシナリオが該当します。
このチュートリアルは大まかに次の手順で構成されます。
- データ ファクトリを作成します。
- Azure SQL Database、Azure Synapse Analytics、および Azure Storage のリンクされたサービスを作成します。
- Azure SQL Database および Azure Synapse Analytics データセットを作成します。
- コピーするテーブルを検索するためのパイプラインと、実際のコピー操作を実行するためのもう 1 つのパイプラインを作成します。
- パイプラインの実行を開始します。
- パイプラインとアクティビティの実行を監視します。
このチュートリアルでは、Azure PowerShell を使用します。 その他のツールまたは SDK を使ってデータ ファクトリを作成する方法については、クイックスタートを参照してください。
エンド ツー エンド ワークフロー
このシナリオでは、Azure Synapse Analytics にコピーする必要のあるテーブルが Azure SQL Database に多数存在します。 以下の図は、パイプラインのワークフロー ステップを論理的な発生順に並べたものです。
- 1 つ目のパイプラインでは、シンク データ ストアにコピーするテーブルの一覧が検索されます。 代わりに、シンク データ ストアにコピーするすべてのテーブルが列挙されたメタデータ テーブルを用意する方法もあります。 次に、1 つ目のパイプラインによって 2 つ目のパイプラインがトリガーされ、データベース内の各テーブルを反復処理しながらデータのコピー操作が実行されます。
- 実際のコピーは 2 つ目のパイプラインによって実行されます。 このパイプラインは、テーブルの一覧をパラメーターとして受け取ります。 その一覧の各テーブルについて、Azure SQL Database 内の特定のテーブルを Azure Synapse Analytics 内の該当するテーブルにコピーします。この処理には、パフォーマンスを最大限に高めるために、Blob Storage と PolyBase によるステージング コピーが使用されます。 この例では、1 つ目のパイプラインからパラメーターの値としてテーブルの一覧が渡されます。
Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。
前提条件
Note
Azure を操作するには、Azure Az PowerShell モジュールを使用することをお勧めします。 作業を開始するには、「Azure PowerShell のインストール」を参照してください。 Az PowerShell モジュールに移行する方法については、「AzureRM から Az への Azure PowerShell の移行」を参照してください。
- Azure PowerShell。 Azure PowerShell のインストールと構成の方法に関するページに記載されている手順に従います。
- Azure Storage アカウント。 この Azure ストレージ アカウントは、一括コピー操作のステージング BLOB ストレージとして使用されます。
- Azure SQL データベース。 ソース データが格納されているデータベースです。
- Azure Synapse Analytics。 SQL データベースからコピーされたデータは、このデータ ウェアハウスに格納されます。
SQL Database と Azure Synapse Analytics を準備する
ソース Azure SQL Database の準備:
Azure SQL Database のデータベースの作成に関する記事に従い、Adventure Works LT サンプル データを使って SQL Database にデータベースを作成します。 このチュートリアルでは、このサンプル データベースからすべてのテーブルを Azure Synapse Analytics にコピーします。
シンク Azure Synapse Analytics を準備する:
Azure Synapse Analytics ワークスペースがない場合は、「Azure Synapse Analytics の使用を開始する」の記事の作成手順を参照してください。
対応するテーブル スキーマを Azure Synapse Analytics に作成します。 データの移行/コピーは、後続の手順で Azure Data Factory を使用して行います。
SQL サーバーにアクセスするための Azure サービス
SQL Database と Azure Synapse Analytics の両方について、SQL サーバーへのアクセスを Azure サービスに許可します。 ご利用のサーバーで [Azure サービスへのアクセスを許可] 設定をオンにしてください。 この設定により、Data Factory サービスで Azure SQL Database からデータを読み取ったり、Azure Synapse Analytics にデータを書き込んだりすることができます。 この設定を確認して有効にするには、次の手順を実行します。
- 左側にある [すべてのサービス] をクリックし、 [SQL Server] をクリックします。
- サーバーを選択し、 [設定] の [ファイアウォール] をクリックします。
- [ファイアウォールの設定] ページの [Azure サービスへのアクセスを許可] で [オン] をクリックします。
Data Factory の作成
PowerShellを起動します。 Azure PowerShell は、このチュートリアルが終わるまで開いたままにしておいてください。 Azure PowerShell を閉じて再度開いた場合は、これらのコマンドをもう一度実行する必要があります。
次のコマンドを実行して、Azure Portal へのサインインに使用するユーザー名とパスワードを入力します。
Connect-AzAccount
次のコマンドを実行して、このアカウントのすべてのサブスクリプションを表示します。
Get-AzSubscription
次のコマンドを実行して、使用するサブスクリプションを選択します。 SubscriptionId は、実際の Azure サブスクリプションの ID に置き換えてください。
Select-AzSubscription -SubscriptionId "<SubscriptionId>"
Set-AzDataFactoryV2 コマンドレットを実行してデータ ファクトリを作成します。 各プレースホルダーを実際の値に置き換えてからコマンドを実行してください。
$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
以下の点に注意してください。
Azure Data Factory の名前はグローバルに一意にする必要があります。 次のエラーが発生した場合は、名前を変更してからもう一度実行してください。
The specified Data Factory name 'ADFv2QuickStartDataFactory' is already in use. Data Factory names must be globally unique.
Data Factory インスタンスを作成するには、Azure サブスクリプションの共同作成者または管理者である必要があります。
現在 Data Factory が利用できる Azure リージョンの一覧については、次のページで目的のリージョンを選択し、 [分析] を展開して [Data Factory] を探してください。リージョン別の利用可能な製品 データ ファクトリで使用するデータ ストア (Azure Storage、Azure SQL Database など) やコンピューティング (HDInsight など) は他のリージョンに配置できます。
リンクされたサービスを作成します
このチュートリアルでは、ソース、シンク、ステージング BLOB のそれぞれについて、データ ストアへの接続情報が含まれた、3 つのリンクされたサービスを作成します。
ソース Azure SQL Database のリンクされたサービスを作成する
次の内容を記述した AzureSqlDatabaseLinkedService.json という名前の JSON ファイルを C:\ADFv2TutorialBulkCopy フォルダーに作成します。(ADFv2TutorialBulkCopy フォルダーがまだ存在しない場合は作成してください)。
重要
<servername>、<databasename>、<username>@<servername>、<password> を実際の Azure SQL データベースの値に置き換えてからファイルを保存してください。
{ "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" } } }
Azure PowerShell で ADFv2TutorialBulkCopy フォルダーに切り替えます。
Set-AzDataFactoryV2LinkedService コマンドレットを実行して、リンクされたサービス AzureSqlDatabaseLinkedService を作成します。
Set-AzDataFactoryV2LinkedService -DataFactoryName $dataFactoryName -ResourceGroupName $resourceGroupName -Name "AzureSqlDatabaseLinkedService" -File ".\AzureSqlDatabaseLinkedService.json"
出力例を次に示します。
LinkedServiceName : AzureSqlDatabaseLinkedService ResourceGroupName : <resourceGroupName> DataFactoryName : <dataFactoryName> Properties : Microsoft.Azure.Management.DataFactory.Models.AzureSqlDatabaseLinkedService
シンク Azure Synapse Analytics のリンクされたサービスを作成する
次の内容を記述した AzureSqlDWLinkedService.json という名前の JSON ファイルを C:\ADFv2TutorialBulkCopy フォルダーに作成します。
重要
<servername>、<databasename>、<username>@<servername>、<password> を実際の Azure SQL データベースの値に置き換えてからファイルを保存してください。
{ "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" } } }
リンクされたサービス AzureSqlDWLinkedService を作成するには、Set-AzDataFactoryV2LinkedService コマンドレットを実行します。
Set-AzDataFactoryV2LinkedService -DataFactoryName $dataFactoryName -ResourceGroupName $resourceGroupName -Name "AzureSqlDWLinkedService" -File ".\AzureSqlDWLinkedService.json"
出力例を次に示します。
LinkedServiceName : AzureSqlDWLinkedService ResourceGroupName : <resourceGroupName> DataFactoryName : <dataFactoryName> Properties : Microsoft.Azure.Management.DataFactory.Models.AzureSqlDWLinkedService
ステージング Azure Storage のリンクされたサービスを作成する
このチュートリアルでは、PolyBase でコピーのパフォーマンスを高めるために、中間ステージング領域として Azure BLOB ストレージを使用しています。
次の内容を記述した AzureStorageLinkedService.json という名前の JSON ファイルを C:\ADFv2TutorialBulkCopy フォルダーに作成します。
重要
<accountName> と <accountKey> を実際の Azure ストレージ アカウントの名前とキーに置き換えてからファイルを保存してください。
{ "name": "AzureStorageLinkedService", "properties": { "type": "AzureStorage", "typeProperties": { "connectionString": "DefaultEndpointsProtocol=https;AccountName=<accountName>;AccountKey=<accountKey>" } } }
リンクされたサービス AzureStorageLinkedService を作成するには、Set-AzDataFactoryV2LinkedService コマンドレットを実行します。
Set-AzDataFactoryV2LinkedService -DataFactoryName $dataFactoryName -ResourceGroupName $resourceGroupName -Name "AzureStorageLinkedService" -File ".\AzureStorageLinkedService.json"
出力例を次に示します。
LinkedServiceName : AzureStorageLinkedService ResourceGroupName : <resourceGroupName> DataFactoryName : <dataFactoryName> Properties : Microsoft.Azure.Management.DataFactory.Models.AzureStorageLinkedService
データセットを作成する
このチュートリアルでは、ソースとシンクのデータセットを作成して、データの格納場所を指定します。
ソース SQL Database のデータセットを作成する
次の内容を記述した AzureSqlDatabaseDataset.json という名前の JSON ファイルを C:\ADFv2TutorialBulkCopy フォルダーに作成します。 "tableName" はダミーです (後でデータを取得するためのコピー アクティビティで SQL クエリを使用することになるため)。
{ "name": "AzureSqlDatabaseDataset", "properties": { "type": "AzureSqlTable", "linkedServiceName": { "referenceName": "AzureSqlDatabaseLinkedService", "type": "LinkedServiceReference" }, "typeProperties": { "tableName": "dummy" } } }
データセット AzureSqlDatabaseDataset を作成するには、Set-AzDataFactoryV2Dataset コマンドレットを実行します。
Set-AzDataFactoryV2Dataset -DataFactoryName $dataFactoryName -ResourceGroupName $resourceGroupName -Name "AzureSqlDatabaseDataset" -File ".\AzureSqlDatabaseDataset.json"
出力例を次に示します。
DatasetName : AzureSqlDatabaseDataset ResourceGroupName : <resourceGroupname> DataFactoryName : <dataFactoryName> Structure : Properties : Microsoft.Azure.Management.DataFactory.Models.AzureSqlTableDataset
シンク Azure Synapse Analytics 用のデータセットを作成する
次の内容を記述した AzureSqlDWDataset.json という名前の JSON ファイルを C:\ADFv2TutorialBulkCopy フォルダーに作成します。"tableName" はパラメーターとして設定されています。後で、このデータセットを参照するコピー アクティビティを使用して、実際の値をデータセットに渡します。
{ "name": "AzureSqlDWDataset", "properties": { "type": "AzureSqlDWTable", "linkedServiceName": { "referenceName": "AzureSqlDWLinkedService", "type": "LinkedServiceReference" }, "typeProperties": { "tableName": { "value": "@{dataset().DWTableName}", "type": "Expression" } }, "parameters":{ "DWTableName":{ "type":"String" } } } }
データセット AzureSqlDWDataset を作成するには、Set-AzDataFactoryV2Dataset コマンドレットを実行します。
Set-AzDataFactoryV2Dataset -DataFactoryName $dataFactoryName -ResourceGroupName $resourceGroupName -Name "AzureSqlDWDataset" -File ".\AzureSqlDWDataset.json"
出力例を次に示します。
DatasetName : AzureSqlDWDataset ResourceGroupName : <resourceGroupname> DataFactoryName : <dataFactoryName> Structure : Properties : Microsoft.Azure.Management.DataFactory.Models.AzureSqlDwTableDataset
パイプラインを作成する
このチュートリアルでは、2 つのパイプラインを作成します。
パイプライン "IterateAndCopySQLTables" を作成する
このパイプラインは、テーブルの一覧をパラメーターとして受け取ります。 その一覧の各テーブルについて、ステージング コピーと PolyBase を使って、Azure SQL Database 内のテーブルから Azure Synapse Analytics にデータがコピーされます。
次の内容を記述した IterateAndCopySQLTables.json という名前の JSON ファイルを C:\ADFv2TutorialBulkCopy フォルダーに作成します。
{ "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" } } } }
パイプライン IterateAndCopySQLTables を作成するには、Set-AzDataFactoryV2Pipeline コマンドレットを実行します。
Set-AzDataFactoryV2Pipeline -DataFactoryName $dataFactoryName -ResourceGroupName $resourceGroupName -Name "IterateAndCopySQLTables" -File ".\IterateAndCopySQLTables.json"
出力例を次に示します。
PipelineName : IterateAndCopySQLTables ResourceGroupName : <resourceGroupName> DataFactoryName : <dataFactoryName> Activities : {IterateSQLTables} Parameters : {[tableList, Microsoft.Azure.Management.DataFactory.Models.ParameterSpecification]}
パイプライン "GetTableListAndTriggerCopyData" を作成する
このパイプラインでは、次の 2 つのステップが実行されます。
- Azure SQL Database システム テーブルを検索してコピーするテーブルの一覧を取得します。
- パイプライン "IterateAndCopySQLTables" をトリガーして実際にデータのコピーを実行します。
C:\ADFv2TutorialBulkCopy フォルダーに、GetTableListAndTriggerCopyData.json という名前で以下の内容の JSON ファイルを作成します。
{ "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" ] } ] } ] } }
パイプライン GetTableListAndTriggerCopyData を作成するには、Set-AzDataFactoryV2Pipeline コマンドレットを実行します。
Set-AzDataFactoryV2Pipeline -DataFactoryName $dataFactoryName -ResourceGroupName $resourceGroupName -Name "GetTableListAndTriggerCopyData" -File ".\GetTableListAndTriggerCopyData.json"
出力例を次に示します。
PipelineName : GetTableListAndTriggerCopyData ResourceGroupName : <resourceGroupName> DataFactoryName : <dataFactoryName> Activities : {LookupTableList, TriggerCopy} Parameters :
パイプラインの実行を開始して監視する
主なパイプラインである "GetTableListAndTriggerCopyData" の実行を開始し、後で監視できるようパイプライン実行 ID をキャプチャします。 この ID の下で、ExecutePipeline アクティビティに指定されたパイプライン "IterateAndCopySQLTables" の実行がトリガーされます。
$runId = Invoke-AzDataFactoryV2Pipeline -DataFactoryName $dataFactoryName -ResourceGroupName $resourceGroupName -PipelineName 'GetTableListAndTriggerCopyData'
次のスクリプトを実行して、パイプライン GetTableListAndTriggerCopyData の状態を常時チェックし、最終的なパイプライン実行とアクティビティ実行の結果を出力します。
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
サンプル実行の出力結果を次に示します。
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}
次のようにして、パイプライン "IterateAndCopySQLTables" の実行 ID を取得し、詳細なアクティビティの実行結果をチェックすることができます。
Write-Host "Pipeline 'IterateAndCopySQLTables' run result:" -ForegroundColor "Yellow" ($result | Where-Object {$_.ActivityName -eq "TriggerCopy"}).Output.ToString()
サンプル実行の出力結果を次に示します。
{ "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
シンク Azure Synapse Analytics に接続し、Azure SQL Database から正しくデータがコピーされていることを確認します。
関連するコンテンツ
このチュートリアルでは、以下の手順を実行しました。
- データ ファクトリを作成します。
- Azure SQL Database、Azure Synapse Analytics、および Azure Storage のリンクされたサービスを作成します。
- Azure SQL Database および Azure Synapse Analytics データセットを作成します。
- コピーするテーブルを検索するためのパイプラインと、実際のコピー操作を実行するためのもう 1 つのパイプラインを作成します。
- パイプラインの実行を開始します。
- パイプラインとアクティビティの実行を監視します。
次のチュートリアルに進んで、ソースからコピー先にデータを増分コピーする方法について学習しましょう。