Azure Data Factory パイプラインでカスタム アクティビティを使用するUse custom activities in an Azure Data Factory pipeline

注意

この記事は、Data Factory のバージョン 1 に適用されます。This article applies to version 1 of Data Factory. 現在のバージョンの Data Factory サービスを使用している場合は、V2 のカスタム アクティビティに関するページを参照してください。If you are using the current version of the Data Factory service, see Custom activities in V2.

Azure Data Factory パイプラインでは、2 種類のアクティビティを使用できます。There are two types of activities that you can use in an Azure Data Factory pipeline.

Data Factory でサポートされていないデータ ストアとの間でデータを移動するには、独自のデータ移動ロジックでカスタム アクティビティを作成し、パイプラインでそのアクティビティを使用します。To move data to/from a data store that Data Factory does not support, create a custom activity with your own data movement logic and use the activity in a pipeline. 同じように、Data Factory でサポートされていない方法でデータを変換/処理するには、独自のデータ変換ロジックでカスタム アクティビティを作成し、パイプラインでそのアクティビティを使用します。Similarly, to transform/process data in a way that isn't supported by Data Factory, create a custom activity with your own data transformation logic and use the activity in a pipeline.

仮想マシンの Azure Batch プールで実行するカスタム アクティビティを構成することができます。You can configure a custom activity to run on an Azure Batch pool of virtual machines. Azure Batch を使用する場合は、既存の Azure Batch プールのみを使用できます。When using Azure Batch, you can use only an existing Azure Batch pool.

以下のチュートリアルでは、カスタム .NET アクティビティを作成し、パイプラインでそのカスタム アクティビティを使用する手順について説明します。The following walkthrough provides step-by-step instructions for creating a custom .NET activity and using the custom activity in a pipeline. このチュートリアルでは、Azure Batch のリンクされたサービスを使用します。The walkthrough uses an Azure Batch linked service.

重要

  • カスタム アクティビティからデータ管理ゲートウェイを使用してオンプレミスのデータ ソースにアクセスすることはできません。It is not possible to use a Data Management Gateway from a custom activity to access on-premises data sources. 現時点では、データ管理ゲートウェイでサポートされるのは Data Factory でのコピー アクティビティとストアド プロシージャ アクティビティのみです。Currently, Data Management Gateway supports only the copy activity and stored procedure activity in Data Factory.

チュートリアル: カスタム アクティビティの作成Walkthrough: create a custom activity

前提条件Prerequisites

Azure Batch の前提条件Azure Batch prerequisites

このチュートリアルでは、コンピューティング リソースとして Azure Batch を使用して、カスタム .NET アクティビティを実行します。In the walkthrough, you run your custom .NET activities using Azure Batch as a compute resource. Azure Batch は、大規模な並列コンピューティングやハイ パフォーマンス コンピューティング (HPC) のアプリケーションをクラウドで効率的に実行するためのプラットフォーム サービスです。Azure Batch is a platform service for running large-scale parallel and high-performance computing (HPC) applications efficiently in the cloud. 多くのコンピューティング処理を要する作業を管理された仮想マシンの集合で実行するようにスケジュール設定し、ジョブのニーズに合わせてコンピューティング リソースを自動的に拡大/縮小できます。Azure Batch schedules compute-intensive work to run on a managed collection of virtual machines, and can automatically scale compute resources to meet the needs of your jobs. Azure Batch サービスの詳細については、Azure Batch の基礎に関するページをご覧ください。See Azure Batch basics article for a detailed overview of the Azure Batch service.

このチュートリアルでは、VM のプールと Azure Batch アカウントを作成します。For the tutorial, create an Azure Batch account with a pool of VMs. 手順は次のようになります。Here are the steps:

  1. Azure ポータル を使用して、 Azure Batch アカウントを作成します。Create an Azure Batch account using the Azure portal. 手順については、「Azure Batch アカウントの作成と管理」の記事を参照してください。See Create and manage an Azure Batch account article for instructions.

  2. Azure Batch のアカウント名とアカウント キー、URI、プール名をメモしておきます。Note down the Azure Batch account name, account key, URI, and pool name. Azure Batch のリンクされたサービスを作成するためにこれらが必要になります。You need them to create an Azure Batch linked service.

    1. Azure Batch アカウントのホーム ページに、https://myaccount.westus.batch.azure.com の形式で URL が表示されます。On the home page for Azure Batch account, you see a URL in the following format: https://myaccount.westus.batch.azure.com. この例では、myaccount が Azure Batch のアカウント名です。In this example, myaccount is the name of the Azure Batch account. リンクされたサービスの定義で使用する URI は、URL からアカウント名を除いたものです。URI you use in the linked service definition is the URL without the name of the account. (例: https://<region>.batch.azure.com)。For example: https://<region>.batch.azure.com.
    2. 左側のメニューの [キー] をクリックして、プライマリ アクセス キーをコピーします。Click Keys on the left menu, and copy the PRIMARY ACCESS KEY.
    3. 既存のプールを使用するには、メニューの [プール] をクリックして、プールの ID をメモしておきます。To use an existing pool, click Pools on the menu, and note down the ID of the pool. 既存のプールがない場合は、次の手順に進みます。If you don't have an existing pool, move to the next step.
  3. Azure Batch プールを作成します。Create an Azure Batch pool.

    1. Azure Portal で、左側のメニューの [参照] をクリックし、 [Batch アカウント] をクリックします。In the Azure portal, click Browse in the left menu, and click Batch Accounts.
    2. Azure Batch アカウントを選択して、 [Batch アカウント] ブレードを開きます。Select your Azure Batch account to open the Batch Account blade.
    3. [プール] タイルをクリックします。Click Pools tile.
    4. [プール] ブレードで、ツールバーの [追加] ボタンをクリックしてプールを追加します。In the Pools blade, click Add button on the toolbar to add a pool.
      1. プールの ID を入力します (プール ID)。Enter an ID for the pool (Pool ID). プールの IDは、Data Factory ソリューションを作成するときに必要になります。Note the ID of the pool; you need it when creating the Data Factory solution.
      2. オペレーティング システム ファミリ設定には、 Windows Server 2012 R2 を指定します。Specify Windows Server 2012 R2 for the Operating System Family setting.
      3. ノード価格レベルを選択します。Select a node pricing tier.
      4. ターゲットの専用数の設定値として、「2」と入力します。Enter 2 as value for the Target Dedicated setting.
      5. ノードごとの最大タスクの設定値として、「2」と入力します。Enter 2 as value for the Max tasks per node setting.
    5. [OK] をクリックすると、プールが作成されます。Click OK to create the pool.
    6. プールの ID をメモしておきます。Note down the ID of the pool.

手順の概要High-level steps

このチュートリアルの一環として実行する 2 つの大まかな手順を次に示します。Here are the two high-level steps you perform as part of this walkthrough:

  1. シンプルなデータ変換/処理ロジックが含まれまるカスタム アクティビティを作成します。Create a custom activity that contains simple data transformation/processing logic.
  2. カスタム アクティビティを使用するパイプラインを備えた Azure Data Factory を作成します。Create an Azure data factory with a pipeline that uses the custom activity.

カスタム アクティビティの作成Create a custom activity

.NET カスタム アクティビティを作成するには、その IDotNetActivity インターフェイスを実装したクラスを含む .NET クラス ライブラリプロジェクトを作成します。To create a .NET custom activity, create a .NET Class Library project with a class that implements that IDotNetActivity interface. このインターフェイスには、Execute という 1 つのメソッドのみが含まれ、そのシグネチャは次のとおりです。This interface has only one method: Execute and its signature is:

public IDictionary<string, string> Execute(
    IEnumerable<LinkedService> linkedServices,
    IEnumerable<Dataset> datasets,
    Activity activity,
    IActivityLogger logger)

このメソッドには次の 4 つのパラメーターがあります。The method takes four parameters:

  • linkedServiceslinkedServices. このプロパティは、このアクティビティの入力/出力データセットで参照される、データ ストアのリンクされたサービスの列挙可能なリストです。This property is an enumerable list of Data Store linked services referenced by input/output datasets for the activity.
  • datasetsdatasets. このプロパティは、このアクティビティの入力/出力データセットの列挙可能なリストです。This property is an enumerable list of input/output datasets for the activity. このパラメーターを使用すると、入力と出力のデータセットに定義されている場所とスキーマを取得できます。You can use this parameter to get the locations and schemas defined by input and output datasets.
  • activityactivity. このプロパティは、現在のアクティビティを表します。This property represents the current activity. これを使用して、カスタム アクティビティに関連付けられた拡張プロパティにアクセスできます。It can be used to access extended properties associated with the custom activity. 詳細については、「拡張プロパティへのアクセス」を参照してください。See Access extended properties for details.
  • loggerlogger. このオブジェクトを使用すると、パイプラインのユーザー ログに表示されるデバッグ コメントを作成できます。This object lets you write debug comments that surface in the user log for the pipeline.

メソッドから、今後、カスタム アクティビティの連結に使用できるディクショナリが返されます。The method returns a dictionary that can be used to chain custom activities together in the future. この機能はまだ実装されていないので、メソッドから空のディクショナリが返されます。This feature is not implemented yet, so return an empty dictionary from the method.

手順Procedure

  1. .NET クラス ライブラリ プロジェクトを作成します。Create a .NET Class Library project.

    1. Visual Studio を起動します。Launch Visual Studio.
    2. [ファイル] をクリックし、[新規作成] をポイントして、[プロジェクト] をクリックします。Click File, point to New, and click Project.
    3. [テンプレート] を展開し、[Visual C#] を選択します。Expand Templates, and select Visual C#. このチュートリアルでは C# を使用しますが、カスタム アクティビティの開発には、どの .NET 言語でも使用できます。In this walkthrough, you use C#, but you can use any .NET language to develop the custom activity.
    4. 右側にあるプロジェクトの種類の一覧から [クラス ライブラリ] を選択します。Select Class Library from the list of project types on the right. Visual Studio で、[クラス ライブラリ (.NET Framework)] を選択します。In Visual Studio, choose Class Library (.NET Framework)
    5. [プロジェクト名] に「MyDotNetActivity」と入力します。Enter MyDotNetActivity for the Name.
    6. [場所][C:\ADFGetStarted] を選択します。Select C:\ADFGetStarted for the Location.
    7. [OK] をクリックしてプロジェクトを作成します。Click OK to create the project.
  2. [ツール] をクリックし、 [NuGet パッケージ マネージャー] をポイントして、 [パッケージ マネージャー コンソール] をクリックします。Click Tools, point to NuGet Package Manager, and click Package Manager Console.

  3. パッケージ マネージャー コンソールで、次のコマンドを実行して Microsoft.Azure.Management.DataFactoriesをインポートします。In the Package Manager Console, execute the following command to import Microsoft.Azure.Management.DataFactories.

    Install-Package Microsoft.Azure.Management.DataFactories
    
  4. Azure Storage NuGet パッケージをプロジェクトにインポートします。Import the Azure Storage NuGet package in to the project.

    Install-Package WindowsAzure.Storage -Version 4.3.0
    

    重要

    Data Factory サービス起動ツールには、WindowsAzure.Storage の 4.3 バージョンが必要です。Data Factory service launcher requires the 4.3 version of WindowsAzure.Storage. カスタム アクティビティ プロジェクトで Azure Storage アセンブリの新しいバージョンへの参照を追加した場合、アクティビティの実行時にエラーが表示されます。If you add a reference to a later version of Azure Storage assembly in your custom activity project, you see an error when the activity executes. このエラーを解決する方法については、「Appdomain の分離」セクションを参照してください。To resolve the error, see Appdomain isolation section.

  5. 次の using ステートメントをプロジェクト内のソース ファイルに追加します。Add the following using statements to the source file in the project.

    
    // Comment these lines if using VS 2017
    using System.IO;
    using System.Globalization;
    using System.Diagnostics;
    using System.Linq;
    // --------------------
    
    // Comment these lines if using <= VS 2015
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    // ---------------------
    
    using Microsoft.Azure.Management.DataFactories.Models;
    using Microsoft.Azure.Management.DataFactories.Runtime;
    
    using Microsoft.WindowsAzure.Storage;
    using Microsoft.WindowsAzure.Storage.Blob;
    
  6. 名前空間の名前を MyDotNetActivityNS に変更します。Change the name of the namespace to MyDotNetActivityNS.

    namespace MyDotNetActivityNS
    
  7. 次のコード スニペットに示すように、クラス名を MyDotNetActivity に変更し、IDotNetActivity インターフェイスから派生させます。Change the name of the class to MyDotNetActivity and derive it from the IDotNetActivity interface as shown in the following code snippet:

    public class MyDotNetActivity : IDotNetActivity
    
  8. IDotNetActivity インターフェイスの Execute メソッドを MyDotNetActivity クラスに実装 (追加) し、次のサンプル コードをメソッドにコピーします。Implement (Add) the Execute method of the IDotNetActivity interface to the MyDotNetActivity class and copy the following sample code to the method.

    次のサンプルでは、データ スライスに関連付けられている各 BLOB で検索語句 ("Microsoft") の出現回数をカウントします。The following sample counts the number of occurrences of the search term (“Microsoft”) in each blob associated with a data slice.

    /// <summary>
    /// Execute method is the only method of IDotNetActivity interface you must implement.
    /// In this sample, the method invokes the Calculate method to perform the core logic.
    /// </summary>
    
    public IDictionary<string, string> Execute(
        IEnumerable<LinkedService> linkedServices,
        IEnumerable<Dataset> datasets,
        Activity activity,
        IActivityLogger logger)
    {
        // get extended properties defined in activity JSON definition
        // (for example: SliceStart)
        DotNetActivity dotNetActivity = (DotNetActivity)activity.TypeProperties;
        string sliceStartString = dotNetActivity.ExtendedProperties["SliceStart"];
    
        // to log information, use the logger object
        // log all extended properties
        IDictionary<string, string> extendedProperties = dotNetActivity.ExtendedProperties;
        logger.Write("Logging extended properties if any...");
        foreach (KeyValuePair<string, string> entry in extendedProperties)
        {
            logger.Write("<key:{0}> <value:{1}>", entry.Key, entry.Value);
        }
    
        // linked service for input and output data stores
        // in this example, same storage is used for both input/output
        AzureStorageLinkedService inputLinkedService;
    
        // get the input dataset
        Dataset inputDataset = datasets.Single(dataset => dataset.Name == activity.Inputs.Single().Name);
    
        // declare variables to hold type properties of input/output datasets
        AzureBlobDataset inputTypeProperties, outputTypeProperties;
    
        // get type properties from the dataset object
        inputTypeProperties = inputDataset.Properties.TypeProperties as AzureBlobDataset;
    
        // log linked services passed in linkedServices parameter
        // you will see two linked services of type: AzureStorage
        // one for input dataset and the other for output dataset
        foreach (LinkedService ls in linkedServices)
            logger.Write("linkedService.Name {0}", ls.Name);
    
        // get the first Azure Storage linked service from linkedServices object
        // using First method instead of Single since we are using the same
        // Azure Storage linked service for input and output.
        inputLinkedService = linkedServices.First(
            linkedService =>
            linkedService.Name ==
            inputDataset.Properties.LinkedServiceName).Properties.TypeProperties
            as AzureStorageLinkedService;
    
        // get the connection string in the linked service
        string connectionString = inputLinkedService.ConnectionString;
    
        // get the folder path from the input dataset definition
        string folderPath = GetFolderPath(inputDataset);
        string output = string.Empty; // for use later.
    
        // create storage client for input. Pass the connection string.
        CloudStorageAccount inputStorageAccount = CloudStorageAccount.Parse(connectionString);
        CloudBlobClient inputClient = inputStorageAccount.CreateCloudBlobClient();
    
        // initialize the continuation token before using it in the do-while loop.
        BlobContinuationToken continuationToken = null;
        do
        {   // get the list of input blobs from the input storage client object.
            BlobResultSegment blobList = inputClient.ListBlobsSegmented(folderPath,
                                     true,
                                     BlobListingDetails.Metadata,
                                     null,
                                     continuationToken,
                                     null,
                                     null);
    
            // Calculate method returns the number of occurrences of
            // the search term (“Microsoft”) in each blob associated
            // with the data slice. definition of the method is shown in the next step.
    
            output = Calculate(blobList, logger, folderPath, ref continuationToken, "Microsoft");
    
        } while (continuationToken != null);
    
        // get the output dataset using the name of the dataset matched to a name in the Activity output collection.
        Dataset outputDataset = datasets.Single(dataset => dataset.Name == activity.Outputs.Single().Name);
    
        // get type properties for the output dataset
        outputTypeProperties = outputDataset.Properties.TypeProperties as AzureBlobDataset;
    
        // get the folder path from the output dataset definition
        folderPath = GetFolderPath(outputDataset);
    
        // log the output folder path
        logger.Write("Writing blob to the folder: {0}", folderPath);
    
        // create a storage object for the output blob.
        CloudStorageAccount outputStorageAccount = CloudStorageAccount.Parse(connectionString);
        // write the name of the file.
        Uri outputBlobUri = new Uri(outputStorageAccount.BlobEndpoint, folderPath + "/" + GetFileName(outputDataset));
    
        // log the output file name
        logger.Write("output blob URI: {0}", outputBlobUri.ToString());
    
        // create a blob and upload the output text.
        CloudBlockBlob outputBlob = new CloudBlockBlob(outputBlobUri, outputStorageAccount.Credentials);
        logger.Write("Writing {0} to the output blob", output);
        outputBlob.UploadText(output);
    
        // The dictionary can be used to chain custom activities together in the future.
        // This feature is not implemented yet, so just return an empty dictionary.
    
        return new Dictionary<string, string>();
    }
    
  9. 以下のヘルパー メソッドを追加します。Add the following helper methods:

    /// <summary>
    /// Gets the folderPath value from the input/output dataset.
    /// </summary>
    
    private static string GetFolderPath(Dataset dataArtifact)
    {
        if (dataArtifact == null || dataArtifact.Properties == null)
        {
            return null;
        }
    
        // get type properties of the dataset
        AzureBlobDataset blobDataset = dataArtifact.Properties.TypeProperties as AzureBlobDataset;
        if (blobDataset == null)
        {
            return null;
        }
    
        // return the folder path found in the type properties
        return blobDataset.FolderPath;
    }
    
    /// <summary>
    /// Gets the fileName value from the input/output dataset.
    /// </summary>
    
    private static string GetFileName(Dataset dataArtifact)
    {
        if (dataArtifact == null || dataArtifact.Properties == null)
        {
            return null;
        }
    
        // get type properties of the dataset
        AzureBlobDataset blobDataset = dataArtifact.Properties.TypeProperties as AzureBlobDataset;
        if (blobDataset == null)
        {
            return null;
        }
    
        // return the blob/file name in the type properties
        return blobDataset.FileName;
    }
    
    /// <summary>
    /// Iterates through each blob (file) in the folder, counts the number of instances of search term in the file,
    /// and prepares the output text that is written to the output blob.
    /// </summary>
    
    public static string Calculate(BlobResultSegment Bresult, IActivityLogger logger, string folderPath, ref BlobContinuationToken token, string searchTerm)
    {
        string output = string.Empty;
        logger.Write("number of blobs found: {0}", Bresult.Results.Count<IListBlobItem>());
        foreach (IListBlobItem listBlobItem in Bresult.Results)
        {
            CloudBlockBlob inputBlob = listBlobItem as CloudBlockBlob;
            if ((inputBlob != null) && (inputBlob.Name.IndexOf("$$$.$$$") == -1))
            {
                string blobText = inputBlob.DownloadText(Encoding.ASCII, null, null, null);
                logger.Write("input blob text: {0}", blobText);
                string[] source = blobText.Split(new char[] { '.', '?', '!', ' ', ';', ':', ',' }, StringSplitOptions.RemoveEmptyEntries);
                var matchQuery = from word in source
                                 where word.ToLowerInvariant() == searchTerm.ToLowerInvariant()
                                 select word;
                int wordCount = matchQuery.Count();
                output += string.Format("{0} occurrences(s) of the search term \"{1}\" were found in the file {2}.\r\n", wordCount, searchTerm, inputBlob.Name);
            }
        }
        return output;
    }
    

    GetFolderPath メソッドは、データセットが指すフォルダーのパスを返し、GetFileName メソッドは、データセットが指す BLOB/ファイルの名前を返します。The GetFolderPath method returns the path to the folder that the dataset points to and the GetFileName method returns the name of the blob/file that the dataset points to. {Year}、{Month}、{Day} などの変数を使用して folderPath を定義した場合、このメソッドは文字列を実行時の値で置き換えずにそのまま返します。If you have folderPath defines using variables such as {Year}, {Month}, {Day} etc., the method returns the string as it is without replacing them with runtime values. SliceStart、SliceEnd などにアクセスする方法の詳細については、「 拡張プロパティへのアクセス 」をご覧ください。See Access extended properties section for details on accessing SliceStart, SliceEnd, etc.

    "name": "InputDataset",
    "properties": {
        "type": "AzureBlob",
        "linkedServiceName": "AzureStorageLinkedService",
        "typeProperties": {
            "fileName": "file.txt",
            "folderPath": "adftutorial/inputfolder/",
    

    Calculate メソッドは、入力ファイル (フォルダー内の BLOB) 内のキーワード Microsoft のインスタンス数を計算します。The Calculate method calculates the number of instances of keyword Microsoft in the input files (blobs in the folder). 検索語句 ("Microsoft") は、コードにハード コーディングされています。The search term (“Microsoft”) is hard-coded in the code.

  10. プロジェクトをコンパイルします。Compile the project. メニューの [ビルド] をクリックし、 [ソリューションのビルド] をクリックします。Click Build from the menu and click Build Solution.

    重要

    プロジェクトのターゲット フレームワークとして .NET Framework バージョン 4.5.2 を設定してください。プロジェクトを右クリックし、 [プロパティ] をクリックしてターゲット フレームワークを設定します。Set 4.5.2 version of .NET Framework as the target framework for your project: right-click the project, and click Properties to set the target framework. Data Factory では、4.5.2 より後の .NET Framework のバージョンに対してコンパイルされたカスタム アクティビティはサポートされません。Data Factory does not support custom activities compiled against .NET Framework versions later than 4.5.2.

  11. Windows エクスプローラーを起動し、ビルドの種類に応じて、bin\debug フォルダーまたは bin\release フォルダーに移動します。Launch Windows Explorer, and navigate to bin\debug or bin\release folder depending on the type of build.

  12. <プロジェクト フォルダー>\bin\Debug フォルダー内のすべてのバイナリを含む zip ファイル MyDotNetActivity.zip を作成します。Create a zip file MyDotNetActivity.zip that contains all the binaries in the <project folder>\bin\Debug folder. エラー発生時の問題の原因となったソース コードの行番号など、追加情報を取得するために、MyDotNetActivity.pdb ファイルを含めます。Include the MyDotNetActivity.pdb file so that you get additional details such as line number in the source code that caused the issue if there was a failure.

    重要

    カスタム アクティビティの zip ファイル内のファイルは、いずれもサブフォルダーがない 最上位レベル に置く必要があります。All the files in the zip file for the custom activity must be at the top level with no sub folders.

    バイナリ出力ファイル

  13. customactivitycontainer という名前の BLOB コンテナーがまだ存在していない場合は、作成します。Create a blob container named customactivitycontainer if it does not already exist.

  14. AzureStorageLinkedService によって参照される汎用 Azure Blob ストレージ (ホット/クール BLOB ストレージではない) の customactivitycontainer に MyDotNetActivity.zip を BLOB としてアップロードします。Upload MyDotNetActivity.zip as a blob to the customactivitycontainer in a general-purpose Azure blob storage (not hot/cool Blob storage) that is referred by AzureStorageLinkedService.

重要

この .NET アクティビティ プロジェクトを Visual Studio で Data Factory プロジェクトを含むソリューションに追加し、Data Factory アプリケーション プロジェクトから .NET アクティビティ プロジェクトへの参照を追加する場合は、最後の 2 つの手順 (手動での zip ファイルの作成と汎用 Azure Blob Storage へのアップロード) を実行する必要はありません。If you add this .NET activity project to a solution in Visual Studio that contains a Data Factory project, and add a reference to .NET activity project from the Data Factory application project, you do not need to perform the last two steps of manually creating the zip file and uploading it to the general-purpose Azure blob storage. Data Factory エンティティを Visual Studio を使用して発行すると、これらの手順は発行プロセスによって自動的に実行されます。When you publish Data Factory entities using Visual Studio, these steps are automatically done by the publishing process. 詳しくは、Visual Studio での Data Factory プロジェクトに関するセクションをご覧ください。For more information, see Data Factory project in Visual Studio section.

カスタム アクティビティを使用したパイプラインの作成Create a pipeline with custom activity

カスタム アクティビティを作成し、バイナリと zip ファイルを汎用の Azure ストレージ アカウントの BLOB コンテナーにアップロードしました。You have created a custom activity and uploaded the zip file with binaries to a blob container in a general-purpose Azure Storage Account. ここでは、カスタム アクティビティを使用したパイプラインで Azure Data Factory を作成します。In this section, you create an Azure data factory with a pipeline that uses the custom activity.

カスタム アクティビティの入力データセットは、Blob Storage の adftutorial コンテナーの customactivityinput フォルダー内にある BLOB (ファイル) を表します。The input dataset for the custom activity represents blobs (files) in the customactivityinput folder of adftutorial container in the blob storage. カスタム アクティビティの出力データセットは、Blob Storage の adftutorial コンテナーの customactivityoutput フォルダー内にある出力 BLOB を表します。The output dataset for the activity represents output blobs in the customactivityoutput folder of adftutorial container in the blob storage.

以下の内容を記述した file.txt ファイルを作成し、adftutorial コンテナーの customactivityinput フォルダーにアップロードします。Create file.txt file with the following content and upload it to customactivityinput folder of the adftutorial container. adftutorial コンテナーを作成します (まだ存在しない場合)。Create the adftutorial container if it does not exist already.

test custom activity Microsoft test custom activity Microsoft

入力フォルダーに複数のファイルが含まれている場合でも、入力フォルダーは Azure Data Factory の 1 つのスライスに対応します。The input folder corresponds to a slice in Azure Data Factory even if the folder has two or more files. パイプラインで各スライスが処理されるときに、カスタム アクティビティでは、そのスライスの入力フォルダー内にあるすべての BLOB が反復処理されます。When each slice is processed by the pipeline, the custom activity iterates through all the blobs in the input folder for that slice.

adftutorial\customactivityoutput folder フォルダーには、1 つ以上の行 (入力フォルダーの BLOB と同じ数) が含まれた 1 つの出力ファイルが作成されます。You see one output file with in the adftutorial\customactivityoutput folder with one or more lines (same as number of blobs in the input folder):

2 occurrences(s) of the search term "Microsoft" were found in the file inputfolder/2016-11-16-00/file.txt.

このセクションで実行する手順を次に示します。Here are the steps you perform in this section:

  1. Data Factoryを作成します。Create a data factory.
  2. カスタム アクティビティが実行される VM の Azure Batch プールのリンクされたサービスと、入力/出力 BLOB を保持する Azure Storage を作成します。Create Linked services for the Azure Batch pool of VMs on which the custom activity runs and the Azure Storage that holds the input/output blobs.
  3. カスタム アクティビティの入力と出力を示す入力および出力のデータセットを作成します。Create input and output datasets that represent input and output of the custom activity.
  4. カスタム アクティビティを使用するパイプラインを作成します。Create a pipeline that uses the custom activity.

注意

まだ行っていない場合は、 file.txt を作成し、BLOB コンテナーにアップロードします。Create the file.txt and upload it to a blob container if you haven't already done so. 手順については、前のセクションを参照してください。See instructions in the preceding section.

手順 1:Data Factory の作成Step 1: Create the data factory

  1. Azure Portal へのログイン後、次の手順を実行します。After logging in to the Azure portal, do the following steps:

    1. 左側のメニューで、 [リソースの作成] をクリックします。Click Create a resource on the left menu.

    2. [新規] ブレードの [データ + 分析] をクリックします。Click Data + Analytics in the New blade.

    3. [データ分析] ブレードの [Data Factory] をクリックします。Click Data Factory on the Data analytics blade.

      新しい Azure Data Factory メニュー

  2. [新しい Data Factory] ブレードで、[名前] フィールドに「CustomActivityFactory」と入力します。In the New data factory blade, enter CustomActivityFactory for the Name. Azure Data Factory の名前はグローバルに一意にする必要があります。The name of the Azure data factory must be globally unique. 次のエラー、データ ファクトリ名 "CustomActivityFactory" は使用できません が表示された場合は、データ ファクトリの名前を変更し (yournameCustomActivityFactory など)、作成し直してください。If you receive the error: Data factory name “CustomActivityFactory” is not available, change the name of the data factory (for example, yournameCustomActivityFactory) and try creating again.

    新しい Azure Data Factory ブレード

  3. [リソース グループ名] をクリックし、既存のリソース グループを選択するか、リソース グループを作成します。Click RESOURCE GROUP NAME, and select an existing resource group or create a resource group.

  4. 作成する Data Factory に適したサブスクリプションリージョンを使用していることを確認します。Verify that you are using the correct subscription and region where you want the data factory to be created.

  5. [新しい Data Factory] ブレードで [作成] をクリックします。Click Create on the New data factory blade.

  6. 作成した Data Factory は、Azure ポータルの ダッシュボード に表示されます。You see the data factory being created in the Dashboard of the Azure portal.

  7. Data Factory が正常に作成されると、Data Factory の内容を示す [Data Factory] ブレードが表示されます。After the data factory has been created successfully, you see the Data Factory blade, which shows you the contents of the data factory.

    [Data Factory] ブレード

手順 2:リンクされたサービスを作成しますStep 2: Create linked services

リンクされたサービスは、データ ストアまたはコンピューティング サービスを Azure Data Factory にリンクします。Linked services link data stores or compute services to an Azure data factory. この手順では、Azure Storage アカウントと Azure Batch アカウントを Data Factory にリンクします。In this step, you link your Azure Storage account and Azure Batch account to your data factory.

Azure Storage のリンクされたサービスを作成するCreate Azure Storage linked service

  1. [CustomActivityFactory][Data Factory] ブレードで、 [作成およびデプロイ] をクリックします。Click the Author and deploy tile on the DATA FACTORY blade for CustomActivityFactory. Data Factory エディターが起動します。You see the Data Factory Editor.

  2. コマンド バーの [新しいデータ ストア] をクリックし、 [Azure Storage] を選択します。Click New data store on the command bar and choose Azure storage. Azure Storage のリンクされたサービスを作成するための JSON スクリプトがエディターに表示されます。You should see the JSON script for creating an Azure Storage linked service in the editor.

    [新しいデータ ストア] - [Azure Storage]

  3. <accountname> は Azure Storage アカウントの名前に、<accountkey> は Azure ストレージ アカウントのアクセス キーに置き換えます。Replace <accountname> with name of your Azure storage account and <accountkey> with access key of the Azure storage account. ストレージ アクセス キーを取得する方法については、「 ストレージ アクセス キーの表示、コピーおよび再生成」を参照してください。To learn how to get your storage access key, see View, copy and regenerate storage access keys.

    Azure Storage のリンクされたサービス

  4. コマンド バーの [デプロイ] をクリックして、リンク サービスをデプロイします。Click Deploy on the command bar to deploy the linked service.

Azure Batch のリンクされたサービスの作成Create Azure Batch linked service

  1. Data Factory Editor のツール バーで [...More(...詳細)] をクリックして [新しい計算] をクリックし、メニューから [Azure Batch] を選択します。In the Data Factory Editor, click ... More on the command bar, click New compute, and then select Azure Batch from the menu.

    [新しい計算] - [Azure Batch]

  2. JSON スクリプトを次のように変更します。Make the following changes to the JSON script:

    1. accountName プロパティに Azure Batch アカウント名を指定します。Specify Azure Batch account name for the accountName property. [Azure Batch アカウント] ブレードURL は、http://accountname.region.batch.azure.com という形式です。The URL from the Azure Batch account blade is in the following format: http://accountname.region.batch.azure.com. JSON の batchUri プロパティについては、URL から accountname. を削除し、accountName JSON プロパティには accountname を使用する必要があります。For the batchUri property in the JSON, you need to remove accountname. from the URL and use the accountname for the accountName JSON property.

    2. accessKey プロパティに Azure Batch アカウント キーを指定します。Specify the Azure Batch account key for the accessKey property.

    3. poolName プロパティに、前提条件の一部として作成したプールの名前を指定します。Specify the name of the pool you created as part of prerequisites for the poolName property. プールの名前の代わりにプールの ID を指定することもできます。You can also specify the ID of the pool instead of the name of the pool.

    4. batchUri プロパティに Azure Batch の URI を指定します。Specify Azure Batch URI for the batchUri property. 例: https://westus.batch.azure.com.Example: https://westus.batch.azure.com.

    5. AzureStorageLinkedService for the linkedServiceName プロパティに Azure Batch アカウント名を指定します。Specify the AzureStorageLinkedService for the linkedServiceName property.

      {
        "name": "AzureBatchLinkedService",
        "properties": {
          "type": "AzureBatch",
          "typeProperties": {
            "accountName": "myazurebatchaccount",
            "batchUri": "https://westus.batch.azure.com",
            "accessKey": "<yourbatchaccountkey>",
            "poolName": "myazurebatchpool",
            "linkedServiceName": "AzureStorageLinkedService"
          }
        }
      }
      

      poolName プロパティでは、プール名の代わりにプール ID を指定することもできます。For the poolName property, you can also specify the ID of the pool instead of the name of the pool.

手順 3:データセットを作成するStep 3: Create datasets

この手順では、入力データと出力データを表すデータセットを作成します。In this step, you create datasets to represent input and output data.

入力データセットの作成Create input dataset

  1. Data Factory のエディターで、 [...More(...詳細)] をクリックし、 [新しいデータセット] をクリックして、ドロップダウン メニューから [Azure BLOB ストレージ] を選択します。In the Editor for the Data Factory, click ... More on the command bar, click New dataset, and then select Azure Blob storage from the drop-down menu.

  2. 右側のウィンドウの JSON を、次の JSON スニペットに置き換えます。Replace the JSON in the right pane with the following JSON snippet:

    {
        "name": "InputDataset",
        "properties": {
            "type": "AzureBlob",
            "linkedServiceName": "AzureStorageLinkedService",
            "typeProperties": {
                "folderPath": "adftutorial/customactivityinput/",
                "format": {
                    "type": "TextFormat"
                }
            },
            "availability": {
                "frequency": "Hour",
                "interval": 1
            },
            "external": true,
            "policy": {}
        }
    }
    

    このチュートリアルの後の方では、開始時刻が 2016-11-16T00:00:00Z、終了時刻が 2016-11-16T05:00:00Z のパイプラインを作成します。You create a pipeline later in this walkthrough with start time: 2016-11-16T00:00:00Z and end time: 2016-11-16T05:00:00Z. データを毎時生成するようにスケジュールされているので、5 つの入力/出力スライスがあります (00:00:00 -> 05:00:00)。It is scheduled to produce data hourly, so there are five input/output slices (between 00:00:00 -> 05:00:00).

    入力データセットの frequencyinterval はそれぞれ Hour1 に設定されています。つまり、1 時間に 1 つの入力スライスを利用できます。The frequency and interval for the input dataset is set to Hour and 1, which means that the input slice is available hourly. このサンプルでは、intputfolder の同じファイル (file.txt) です。In this sample, it is the same file (file.txt) in the intputfolder.

    次に各スライスの開始時刻を示します。これは上記の JSON スニペットの SliceStart システム変数で表されます。Here are the start times for each slice, which is represented by SliceStart system variable in the above JSON snippet.

  3. ツール バーの [デプロイ] をクリックし、InputDataset を作成してデプロイします。Click Deploy on the toolbar to create and deploy the InputDataset. エディターのタイトル バーに "テーブルが正常に作成されました" というメッセージが表示されていることを確認します。Confirm that you see the TABLE CREATED SUCCESSFULLY message on the title bar of the Editor.

出力データセットの作成Create an output dataset

  1. Data Factory エディターのコマンド バーで [...More(...詳細)] をクリックし、 [新しいデータセット] をクリックして、 [Azure BLOB ストレージ] を選択します。In the Data Factory editor, click ... More on the command bar, click New dataset, and then select Azure Blob storage.

  2. 右側のウィンドウの JSON スクリプトを、次の JSON スクリプトに置き換えます。Replace the JSON script in the right pane with the following JSON script:

    {
        "name": "OutputDataset",
        "properties": {
            "type": "AzureBlob",
            "linkedServiceName": "AzureStorageLinkedService",
            "typeProperties": {
                "fileName": "{slice}.txt",
                "folderPath": "adftutorial/customactivityoutput/",
                "partitionedBy": [
                    {
                        "name": "slice",
                        "value": {
                            "type": "DateTime",
                            "date": "SliceStart",
                            "format": "yyyy-MM-dd-HH"
                        }
                    }
                ]
            },
            "availability": {
                "frequency": "Hour",
                "interval": 1
            }
        }
    }
    

    出力場所は adftutorial/customactivityoutput/ で、出力ファイル名は yyyy-MM-dd-HH.txt です。この yyyy-MM-dd-HH は、スライスが生成された年、月、日、時間です。Output location is adftutorial/customactivityoutput/ and output file name is yyyy-MM-dd-HH.txt where yyyy-MM-dd-HH is the year, month, date, and hour of the slice being produced. 詳細については、「開発者用リファレンス」のページをご覧ください。See Developer Reference for details.

    各入力スライスの出力 BLOB/ファイルが生成されます。An output blob/file is generated for each input slice. 次に、各スライスの出力ファイルの命名方法を示します。Here is how an output file is named for each slice. すべての出力ファイルは、adftutorial\customactivityoutput という 1 つのフォルダーに生成されます。All the output files are generated in one output folder: adftutorial\customactivityoutput.

    スライスSlice 開始時刻Start time 出力ファイルOutput file
    11 2016-11-16T00:00:002016-11-16T00:00:00 2016-11-16-00.txt2016-11-16-00.txt
    22 2016-11-16T01:00:002016-11-16T01:00:00 2016-11-16-01.txt2016-11-16-01.txt
    33 2016-11-16T02:00:002016-11-16T02:00:00 2016-11-16-02.txt2016-11-16-02.txt
    44 2016-11-16T03:00:002016-11-16T03:00:00 2016-11-16-03.txt2016-11-16-03.txt
    55 2016-11-16T04:00:002016-11-16T04:00:00 2016-11-16-04.txt2016-11-16-04.txt

    入力フォルダー内のすべてのファイルは、前述の開始時刻であるスライスの一部です。Remember that all the files in an input folder are part of a slice with the start times mentioned above. このスライスを処理すると、カスタム アクティビティは各ファイルをスキャンし、出力ファイルに、検索語句 (“Microsoft”) の出現回数が記述された 1 行を生成します。When this slice is processed, the custom activity scans through each file and produces a line in the output file with the number of occurrences of search term (“Microsoft”). inputfolder に 3 つのファイルが存在する場合、1 時間単位のスライスごとの出力ファイル (2016-11-16-00.txt、2016-11-16:01:00:00.txt など) には 3 行が存在します。If there are three files in the inputfolder, there are three lines in the output file for each hourly slice: 2016-11-16-00.txt, 2016-11-16:01:00:00.txt, etc.

  3. OutputDataset をデプロイするには、コマンド バーの [デプロイ] をクリックします。To deploy the OutputDataset, click Deploy on the command bar.

カスタム アクティビティを使用するパイプラインの作成と実行Create and run a pipeline that uses the custom activity

  1. Data Factory Editor のツール バーで [...More(...詳細)] をクリックし、 [新しいパイプライン] をクリックします。In the Data Factory Editor, click ... More, and then select New pipeline on the command bar.

  2. 右側のウィンドウの JSON を、次の JSON スクリプトに置き換えます。Replace the JSON in the right pane with the following JSON script:

    {
      "name": "ADFTutorialPipelineCustom",
      "properties": {
        "description": "Use custom activity",
        "activities": [
          {
            "Name": "MyDotNetActivity",
            "Type": "DotNetActivity",
            "Inputs": [
              {
                "Name": "InputDataset"
              }
            ],
            "Outputs": [
              {
                "Name": "OutputDataset"
              }
            ],
            "LinkedServiceName": "AzureBatchLinkedService",
            "typeProperties": {
              "AssemblyName": "MyDotNetActivity.dll",
              "EntryPoint": "MyDotNetActivityNS.MyDotNetActivity",
              "PackageLinkedService": "AzureStorageLinkedService",
              "PackageFile": "customactivitycontainer/MyDotNetActivity.zip",
              "extendedProperties": {
                "SliceStart": "$$Text.Format('{0:yyyyMMddHH-mm}', Time.AddMinutes(SliceStart, 0))"
              }
            },
            "Policy": {
              "Concurrency": 2,
              "ExecutionPriorityOrder": "OldestFirst",
              "Retry": 3,
              "Timeout": "00:30:00",
              "Delay": "00:00:00"
            }
          }
        ],
        "start": "2016-11-16T00:00:00Z",
        "end": "2016-11-16T05:00:00Z",
        "isPaused": false
      }
    }
    

    以下の点に注意してください。Note the following points:

    • Concurrency2 に設定し、Azure Batch プール内の 2 つの VM で 2 つのスライスが並列処理されるようにします。Concurrency is set to 2 so that two slices are processed in parallel by 2 VMs in the Azure Batch pool.
    • activities セクションには 1 つのアクティビティが存在し、その型は DotNetActivity です。There is one activity in the activities section and it is of type: DotNetActivity.
    • AssemblyName は、DLL の名前 MyDotnetActivity.dll に設定されます。AssemblyName is set to the name of the DLL: MyDotnetActivity.dll.
    • EntryPointMyDotNetActivityNS.MyDotNetActivity に設定します。EntryPoint is set to MyDotNetActivityNS.MyDotNetActivity.
    • PackageLinkedServiceAzureStorageLinkedService に設定されます。これは、カスタム アクティビティの zip ファイルを含む Blob Storage を示します。PackageLinkedService is set to AzureStorageLinkedService that points to the blob storage that contains the custom activity zip file. 入力/出力ファイルとカスタム アクティビティ zip ファイルに異なる Azure Storage アカウントを使用している場合は、Azure Storage の別のリンクされたサービスを作成します。If you are using different Azure Storage accounts for input/output files and the custom activity zip file, you create another Azure Storage linked service. この記事では、同じ Azure Storage アカウントを使用している前提で説明します。This article assumes that you are using the same Azure Storage account.
    • PackageFilecustomactivitycontainer/MyDotNetActivity.zip に設定します。PackageFile is set to customactivitycontainer/MyDotNetActivity.zip. 形式は containerforthezip/nameofthezip.zip です。It is in the format: containerforthezip/nameofthezip.zip.
    • カスタム アクティビティは入力として InputDataset、出力として OutputDataset を使用します。The custom activity takes InputDataset as input and OutputDataset as output.
    • カスタム アクティビティの linkedServiceName プロパティは、AzureBatchLinkedService を示します。これによって、Azure Batch VM でカスタム アクティビティが実行する必要がある Azure Data Factory がわかります。The linkedServiceName property of the custom activity points to the AzureBatchLinkedService, which tells Azure Data Factory that the custom activity needs to run on Azure Batch VMs.
    • isPaused プロパティは、既定で false に設定されています。isPaused property is set to false by default. この例では、スライスが過去に開始されているので、パイプラインは即時に実行されます。The pipeline runs immediately in this example because the slices start in the past. このプロパティを true に設定すると、パイプラインを一時停止できます。また false に設定し直すと再開されます。You can set this property to true to pause the pipeline and set it back to false to restart.
    • start 時刻と end 時刻は 5 時間離れており、スライスは 1 時間ごとに生成されるので、パイプラインによって 5 つのスライスが生成されます。The start time and end times are five hours apart and slices are produced hourly, so five slices are produced by the pipeline.
  3. パイプラインをデプロイするには、コマンド バーの [デプロイ] をクリックします。To deploy the pipeline, click Deploy on the command bar.

パイプラインの監視Monitor the pipeline

  1. Azure ポータルの [Data Factory] ブレードで、 [ダイアグラム] をクリックします。In the Data Factory blade in the Azure portal, click Diagram.

    Diagram tile

  2. [ダイアグラム] ビューで、OutputDataset をクリックします。In the Diagram View, now click the OutputDataset.

    [ダイアグラム] ビュー

  3. 5つの出力スライスが準備完了状態であることが、表示されます。You should see that the five output slices are in the Ready state. 準備完了状態にない場合、まだ生成されていません。If they are not in the Ready state, they haven't been produced yet.

    出力スライス

  4. adftutorial コンテナー内の BLOB ストレージに出力ファイルが生成されていることを確認します。Verify that the output files are generated in the blob storage in the adftutorial container.

    カスタム アクティビティの出力

  5. 出力ファイルを開くと、以下のような出力結果が表示されるはずです。If you open the output file, you should see the output similar to the following output:

    2 occurrences(s) of the search term "Microsoft" were found in the file inputfolder/2016-11-16-00/file.txt.
    
  6. Azure ポータルまたは Azure PowerShell コマンドレットを使用して、データ ファクトリ、パイプライン、データセットを監視します。Use the Azure portal or Azure PowerShell cmdlets to monitor your data factory, pipelines, and data sets. カスタム アクティビティのコード内の ActivityLogger からのメッセージは、ポータルからダウンロードできるログ (user-0.log など) で確認することも、コマンドレットを使用して確認することもできます。You can see messages from the ActivityLogger in the code for the custom activity in the logs (specifically user-0.log) that you can download from the portal or using cmdlets.

    カスタム アクティビティのダウンロード ログ

データセットやパイプラインを監視するための詳細な手順については、「 パイプラインの監視と管理 」を参照してください。See Monitor and Manage Pipelines for detailed steps for monitoring datasets and pipelines.

Visual Studio でのData Factory プロジェクトData Factory project in Visual Studio

Data Factory エンティティを作成して発行するには、Azure ポータルではなく Visual Studio を使用します。You can create and publish Data Factory entities by using Visual Studio instead of using Azure portal. Visual Studio を使用した Data Factory エンティティの作成と発行の詳細については、記事「Visual Studio を使用した初めてのパイプラインの作成」と記事「Azure BLOB から Azure SQL にデータをコピーする」を参照してください。For detailed information about creating and publishing Data Factory entities by using Visual Studio, See Build your first pipeline using Visual Studio and Copy data from Azure Blob to Azure SQL articles.

Visual Studio で Data Factory プロジェクトを作成する場合は、次の追加の手順を実行します。Do the following additional steps if you are creating Data Factory project in Visual Studio:

  1. カスタム アクティビティ プロジェクトを含む Visual Studio ソリューションに Data Factory プロジェクトを追加します。Add the Data Factory project to the Visual Studio solution that contains the custom activity project.

  2. Data Factory プロジェクトから .NET アクティビティ プロジェクトへの参照を追加します。Add a reference to the .NET activity project from the Data Factory project. Data Factory プロジェクトを右クリックし、 [追加] をポイントして、 [参照] をクリックします。Right-click Data Factory project, point to Add, and then click Reference.

  3. [参照の追加] ダイアログボックスで、MyDotNetActivity プロジェクトを選択し、 [OK] をクリックします。In the Add Reference dialog box, select the MyDotNetActivity project, and click OK.

  4. ソリューションをビルドして発行します。Build and publish the solution.

    重要

    Data Factory エンティティの発行時に、zip ファイルが自動的に作成され、BLOB コンテナー: customactivitycontainer にアップロードされます。When you publish Data Factory entities, a zip file is automatically created for you and is uploaded to the blob container: customactivitycontainer. BLOB コンテナーが存在しない場合、これも自動的に作成されます。If the blob container does not exist, it is automatically created too.

Data Factory と Batch の統合Data Factory and Batch integration

Data Factory サービスによって、Azure Batch に adf-poolname: job-xxx という名前のジョブが作成されます。The Data Factory service creates a job in Azure Batch with the name: adf-poolname: job-xxx. 左側のメニューで [ジョブ] をクリックします。Click Jobs from the left menu.

Azure Data Factory - Batch ジョブ

スライスのアクティビティの実行ごとに、1 つのタスクが作成されます。A task is created for each activity run of a slice. 5 個のスライスを処理する準備ができた場合、このジョブに 5 個のタスクが作成されています。If there are five slices ready to be processed, five tasks are created in this job. Batch プール内に複数のコンピューティング ノードがある場合は、2 つ以上のスライスを並列で実行できます。If there are multiple compute nodes in the Batch pool, two or more slices can run in parallel. コンピューティング ノードごとの最大タスクが 1 より大きな値に設定されている場合、同じコンピューティング ノードで複数のスライスを実行することもできます。If the maximum tasks per compute node is set to > 1, you can also have more than one slice running on the same compute.

Azure Data Factory - Batch ジョブのタスク

次の図は、Azure Data Factory と Batch のタスク間の関係を示しています。The following diagram illustrates the relationship between Azure Data Factory and Batch tasks.

Data Factory と Batch

エラーをトラブルシューティングするTroubleshoot failures

トラブルシューティングには、いくつかの基本的な技術があります。Troubleshooting consists of a few basic techniques:

  1. 次のエラーが表示された場合は、汎用の Azure Blob Storage を使用する代わりにホット/クール BLOB ストレージを使用することができます。If you see the following error, you may be using a Hot/Cool blob storage instead of using a general-purpose Azure blob storage. zip ファイルを汎用の Azure ストレージ アカウントにアップロードします。Upload the zip file to a general-purpose Azure Storage Account.

    Error in Activity: Job encountered scheduling error. Code: BlobDownloadMiscError Category: ServerError Message: Miscellaneous error encountered while downloading one of the specified Azure Blob(s).
    
  2. 次のエラーが表示された場合は、CS ファイル内のクラスの名前が、パイプライン JSON の EntryPoint プロパティに指定した名前と一致していることを確認します。If you see the following error, confirm that the name of the class in the CS file matches the name you specified for the EntryPoint property in the pipeline JSON. このチュートリアルでは、クラスの名前は MyDotNetActivity であり、JSON の EntryPoint は MyDotNetActivityNS.MyDotNetActivity です。In the walkthrough, name of the class is: MyDotNetActivity, and the EntryPoint in the JSON is: MyDotNetActivityNS.MyDotNetActivity.

    MyDotNetActivity assembly does not exist or doesn't implement the type Microsoft.DataFactories.Runtime.IDotNetActivity properly
    

    名前が一致する場合は、zip ファイルの ルート フォルダー にすべてのバイナリが含まれていることを確認します。If the names do match, confirm that all the binaries are in the root folder of the zip file. つまり、zip ファイルを開くと、サブ フォルダーではなく、ルート フォルダーにすべてのファイルが表示されます。That is, when you open the zip file, you should see all the files in the root folder, not in any sub folders.

  3. 入力スライスが [準備完了] に設定されていない場合、入力フォルダー構造が正しく、入力フォルダーに file.txt が存在することを確認します。If the input slice is not set to Ready, confirm that the input folder structure is correct and file.txt exists in the input folders.

  4. 問題のトラブルシューティングに役立つ情報をログに記録するには、カスタム アクティビティの Execute メソッドで、IActivityLogger オブジェクトを使用します。In the Execute method of your custom activity, use the IActivityLogger object to log information that helps you troubleshoot issues. ログに記録されたメッセージは、ユーザー ログ ファイル (user-0.log、user-1.log、user-2.log などの名前が付けられた 1 つ以上のファイル) に表示されます。The logged messages show up in the user log files (one or more files named: user-0.log, user-1.log, user-2.log, etc.).

    [OutputDataset] ブレードで、スライスをクリックすると、そのスライスの [データ スライス] ブレードが表示されます。In the OutputDataset blade, click the slice to see the DATA SLICE blade for that slice. そのスライスの アクティビティの実行 が表示されます。You see activity runs for that slice. このスライスには 1 回のアクティビティの実行が表示されます。You should see one activity run for the slice. コマンド バーの [実行] をクリックする場合、同じスライスの別のアクティビティの実行を開始できます。If you click Run in the command bar, you can start another activity run for the same slice.

    アクティビティの実行をクリックすると、 [アクティビティの実行の詳細] ブレードにログ ファイルの一覧が表示されます。When you click the activity run, you see the ACTIVITY RUN DETAILS blade with a list of log files. user_0.log ファイルにログに記録されたメッセージが表示されます。You see logged messages in the user_0.log file. パイプライン/アクティビティ JSON で再試行回数が 3 に設定されているので、エラーが発生した場合、3 つのアクティビティの実行が表示されます。When an error occurs, you see three activity runs because the retry count is set to 3 in the pipeline/activity JSON. アクティビティの実行をクリックすると、ログ ファイルが表示されます。このファイルを確認して、エラーのトラブルシューティングを行うことができます。When you click the activity run, you see the log files that you can review to troubleshoot the error.

    ログ ファイルの一覧で、 user-0.logをクリックします。In the list of log files, click the user-0.log. 右側のパネルには、 IActivityLogger.Write メソッドの使用結果が表示されます。In the right panel are the results of using the IActivityLogger.Write method. 一部のメッセージが表示されない場合は、user_1.log、user_2.log のような名前のログ ファイルがほかにもないか確認します。それ以外の場合、コードは、最後にログにメッセージが記録された後に、失敗した可能性があります。If you don't see all messages, check if you have more log files named: user_1.log, user_2.log etc. Otherwise, the code may have failed after the last logged message.

    さらに、system-0.log では、システム エラー メッセージと例外を確認できます。In addition, check system-0.log for any system error messages and exceptions.

  5. エラーの詳細にエラー発生時のコール スタックなどの情報が含まれるようにするには、zip ファイルに PDB ファイルを含めます。Include the PDB file in the zip file so that the error details have information such as call stack when an error occurs.

  6. カスタム アクティビティの zip ファイル内のファイルは、いずれもサブフォルダーがない 最上位レベル に置く必要があります。All the files in the zip file for the custom activity must be at the top level with no sub folders.

  7. assemblyName (MyDotNetActivity.dll)、entryPoint (MyDotNetActivityNS.MyDotNetActivity)、packageFile (customactivitycontainer/MyDotNetActivity.zip)、packageLinkedService (zip ファイルを含む汎用の Azure Blob Storage を示す必要があります) が正しい値に設定されていることを確認します。Ensure that the assemblyName (MyDotNetActivity.dll), entryPoint(MyDotNetActivityNS.MyDotNetActivity), packageFile (customactivitycontainer/MyDotNetActivity.zip), and packageLinkedService (should point to the general-purposeAzure blob storage that contains the zip file) are set to correct values.

  8. エラーを修正し、スライスを再処理する場合は、 [OutputDataset] ブレードのスライスを右クリックし、 [実行] をクリックします。If you fixed an error and want to reprocess the slice, right-click the slice in the OutputDataset blade and click Run.

  9. 次のエラーが表示される場合は、バージョン 4.3.0 より新しい Azure Storage パッケージを使用しています。If you see the following error, you are using the Azure Storage package of version > 4.3.0. Data Factory サービス起動ツールには、WindowsAzure.Storage の 4.3 バージョンが必要です。Data Factory service launcher requires the 4.3 version of WindowsAzure.Storage. Azure Storage アセンブリの新しいバージョンを使用する必要がある場合の対処法については、「Appdomain の分離」セクションを参照してください。See Appdomain isolation section for a work-around if you must use the later version of Azure Storage assembly.

    Error in Activity: Unknown error in module: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.TypeLoadException: Could not load type 'Microsoft.WindowsAzure.Storage.Blob.CloudBlob' from assembly 'Microsoft.WindowsAzure.Storage, Version=4.3.0.0, Culture=neutral,
    

    Azure Storage パッケージの 4.3.0 バージョンを使用できる場合は、バージョン 4.3.0 より新しい Azure Storage パッケージへの既存の参照を削除します。If you can use the 4.3.0 version of Azure Storage package, remove the existing reference to Azure Storage package of version > 4.3.0. 次に、NuGet パッケージ マネージャー コンソールから、次のコマンドを実行します。Then, run the following command from NuGet Package Manager Console.

    Install-Package WindowsAzure.Storage -Version 4.3.0
    

    プロジェクトをビルドします。Build the project. bin\Debug フォルダーからバージョン 4.3.0 より新しい Azure.Storage アセンブリを削除します。Delete Azure.Storage assembly of version > 4.3.0 from the bin\Debug folder. バイナリと PDB ファイルを含む zip ファイルを作成します。Create a zip file with binaries and the PDB file. BLOB コンテナー (customactivitycontainer) 内で元の zip ファイルをこの zip ファイルで置き換えます。Replace the old zip file with this one in the blob container (customactivitycontainer). 失敗したスライスを再実行します (スライスを右クリックし、[実行] をクリックします)。Rerun the slices that failed (right-click slice, and click Run).

  10. このカスタム アクティビティでは、パッケージ内の app.config ファイルは使用されません。The custom activity does not use the app.config file from your package. そのためこの構成ファイルから接続文字列を読み取るようにコードを記述した場合、実行時に正しく機能しません。Therefore, if your code reads any connection strings from the configuration file, it does not work at runtime. Azure Batch を使用するときは、すべてのシークレットを Azure KeyVault に保持し、証明書ベースのサービス プリンシパルを使用して keyvault を保護したうえで、Azure Batch プールに証明書を配布するのがベスト プラクティスです。The best practice when using Azure Batch is to hold any secrets in an Azure KeyVault, use a certificate-based service principal to protect the keyvault, and distribute the certificate to Azure Batch pool. こうすることで .NET カスタム アクティビティが実行時に KeyVault 内のシークレットにアクセスすることができます。The .NET custom activity then can access secrets from the KeyVault at runtime. これは一般的な手法であり、接続文字列に限らず、あらゆる種類のシークレットに応用できます。This solution is a generic solution and can scale to any type of secret, not just connection string.

    ベスト プラクティスではありませんが、同じことをもっと簡単に行うこともできます。接続文字列設定を使用して Azure SQL のリンクされたサービスを作成し、そのリンクされたサービスを使用するデータセットを作成して、カスタム .NET アクティビティにダミーの入力データセットとして連結します。There is an easier workaround (but not a best practice): you can create an Azure SQL linked service with connection string settings, create a dataset that uses the linked service, and chain the dataset as a dummy input dataset to the custom .NET activity. その後は、カスタム アクティビティのコードで、リンクされたサービスの接続文字列にアクセスできます。You can then access the linked service's connection string in the custom activity code.

カスタム アクティビティを更新するUpdate custom activity

カスタム アクティビティのコードを更新する場合は、カスタム アクティビティを構築し、新しいバイナリを含む zip ファイルを BLOB ストレージにアップロードします。If you update the code for the custom activity, build it, and upload the zip file that contains new binaries to the blob storage.

Appdomain の分離Appdomain isolation

Data Factory ランチャーによって使用されるアセンブリ バージョン (WindowsAzure.Storage v4.3.0、Newtonsoft.Json v6.0.x など) には制約されないカスタム アクティビティを作成する方法を示すクロス AppDomain のサンプルを参照してください。See Cross AppDomain Sample that shows you how to create a custom activity that is not constrained to assembly versions used by the Data Factory launcher (example: WindowsAzure.Storage v4.3.0, Newtonsoft.Json v6.0.x, etc.).

拡張プロパティへのアクセスAccess extended properties

次のサンプルに示すようにアクティビティ JSON の拡張プロパティを宣言できます。You can declare extended properties in the activity JSON as shown in the following sample:

"typeProperties": {
  "AssemblyName": "MyDotNetActivity.dll",
  "EntryPoint": "MyDotNetActivityNS.MyDotNetActivity",
  "PackageLinkedService": "AzureStorageLinkedService",
  "PackageFile": "customactivitycontainer/MyDotNetActivity.zip",
  "extendedProperties": {
    "SliceStart": "$$Text.Format('{0:yyyyMMddHH-mm}', Time.AddMinutes(SliceStart, 0))",
    "DataFactoryName": "CustomActivityFactory"
  }
},

この例には、SliceStartDataFactoryName の 2 つの拡張プロパティが存在します。In the example, there are two extended properties: SliceStart and DataFactoryName. SliceStart の値は、SliceStart システム変数に基づいています。The value for SliceStart is based on the SliceStart system variable. サポートされているシステム変数の一覧については、 システム変数 に関するページをご覧ください。See System Variables for a list of supported system variables. DataFactoryName の値は、CustomActivityFactory にハードコーディングされます。The value for DataFactoryName is hard-coded to CustomActivityFactory.

Execute メソッドでこれらの拡張プロパティにアクセスするには、次のようなコードを使用します。To access these extended properties in the Execute method, use code similar to the following code:

// to get extended properties (for example: SliceStart)
DotNetActivity dotNetActivity = (DotNetActivity)activity.TypeProperties;
string sliceStartString = dotNetActivity.ExtendedProperties["SliceStart"];

// to log all extended properties
IDictionary<string, string> extendedProperties = dotNetActivity.ExtendedProperties;
logger.Write("Logging extended properties if any...");
foreach (KeyValuePair<string, string> entry in extendedProperties)
{
    logger.Write("<key:{0}> <value:{1}>", entry.Key, entry.Value);
}

Azure Batch の自動スケールAuto-scaling of Azure Batch

自動スケール 機能で、Azure Batch プールを作成することもできます。You can also create an Azure Batch pool with autoscale feature. たとえば、専用 VM 数が 0 の Azure Batch プールと、保留中のタスクの数に基づく自動スケールの数式を作成できます。For example, you could create an azure batch pool with 0 dedicated VMs and an autoscale formula based on the number of pending tasks.

このサンプル式は、次の動作を実現します。プールが最初に作成された場合、1 つの VM から開始されます。The sample formula here achieves the following behavior: When the pool is initially created, it starts with 1 VM. $PendingTasks メトリックにより、実行中 + アクティブ (キューに登録済み) 状態のタスク数が定義されます。$PendingTasks metric defines the number of tasks in running + active (queued) state. この数式により、最後の 180 秒間の保留タスク平均数が判明し、TargetDedicated が適宜設定されます。The formula finds the average number of pending tasks in the last 180 seconds and sets TargetDedicated accordingly. それにより、TargetDedicated が 25 台の仮想マシンを超えることはありません。It ensures that TargetDedicated never goes beyond 25 VMs. そのため、新しいタスクが送信されると、プールが自動的に増加します。タスクが完了すると、VM は 1 台ずつ解放され、自動スケールにより VM が減らされます。So, as new tasks are submitted, pool automatically grows and as tasks complete, VMs become free one by one and the autoscaling shrinks those VMs. startingNumberOfVMs と maxNumberofVMs はニーズに合わせて調整できます。startingNumberOfVMs and maxNumberofVMs can be adjusted to your needs.

自動スケールの数式:Autoscale formula:

startingNumberOfVMs = 1;
maxNumberofVMs = 25;
pendingTaskSamplePercent = $PendingTasks.GetSamplePercent(180 * TimeInterval_Second);
pendingTaskSamples = pendingTaskSamplePercent < 70 ? startingNumberOfVMs : avg($PendingTasks.GetSample(180 * TimeInterval_Second));
$TargetDedicated=min(maxNumberofVMs,pendingTaskSamples);

詳細については、「 Azure Batch プール内のコンピューティング ノードの自動スケール 」をご覧ください。See Automatically scale compute nodes in an Azure Batch pool for details.

プールで既定の autoScaleEvaluationIntervalを使用する場合、Batch サービスがカスタム アクティビティを実行する前に VM を準備するのに 15 ~ 30 分かかることがあります。If the pool is using the default autoScaleEvaluationInterval, the Batch service could take 15-30 minutes to prepare the VM before running the custom activity. プールが異なる  autoScaleEvaluationInterval を使用する場合、Batch サービスは autoScaleEvaluationInterval + 10 分を要することがあります。If the pool is using a different autoScaleEvaluationInterval, the Batch service could take autoScaleEvaluationInterval + 10 minutes.

.NET SDK を使ってカスタム アクティビティを作成するCreate a custom activity by using .NET SDK

この記事のチュートリアルでは、Azure ポータルを使って、カスタム アクティビティを使用するパイプラインを備えたデータ ファクトリを作成します。In the walkthrough in this article, you create a data factory with a pipeline that uses the custom activity by using the Azure portal. 次のコードでは、代わりに .NET SDK を使用してデータ ファクトリを作成する方法を示しています。The following code shows you how to create the data factory by using .NET SDK instead. SDK を使ってプログラムによりパイプラインを作成する方法については、「コピー アクティビティがあるパイプラインを .NET API で作成する」をご覧ください。You can find more details about using SDK to programmatically create pipelines in the create a pipeline with copy activity by using .NET API article.

using System;
using System.Configuration;
using System.Collections.ObjectModel;
using System.Threading;
using System.Threading.Tasks;

using Microsoft.Azure;
using Microsoft.Azure.Management.DataFactories;
using Microsoft.Azure.Management.DataFactories.Models;
using Microsoft.Azure.Management.DataFactories.Common.Models;

using Microsoft.IdentityModel.Clients.ActiveDirectory;
using System.Collections.Generic;

namespace DataFactoryAPITestApp
{
    class Program
    {
        static void Main(string[] args)
        {
            // create data factory management client

            // TODO: replace ADFTutorialResourceGroup with the name of your resource group.
            string resourceGroupName = "ADFTutorialResourceGroup";

            // TODO: replace APITutorialFactory with a name that is globally unique. For example: APITutorialFactory04212017
            string dataFactoryName = "APITutorialFactory";

            TokenCloudCredentials aadTokenCredentials = new TokenCloudCredentials(
                ConfigurationManager.AppSettings["SubscriptionId"],
                GetAuthorizationHeader().Result);

            Uri resourceManagerUri = new Uri(ConfigurationManager.AppSettings["ResourceManagerEndpoint"]);

            DataFactoryManagementClient client = new DataFactoryManagementClient(aadTokenCredentials, resourceManagerUri);

            Console.WriteLine("Creating a data factory");
            client.DataFactories.CreateOrUpdate(resourceGroupName,
                new DataFactoryCreateOrUpdateParameters()
                {
                    DataFactory = new DataFactory()
                    {
                        Name = dataFactoryName,
                        Location = "westus",
                        Properties = new DataFactoryProperties()
                    }
                }
            );

            // create a linked service for input data store: Azure Storage
            Console.WriteLine("Creating Azure Storage linked service");
            client.LinkedServices.CreateOrUpdate(resourceGroupName, dataFactoryName,
                new LinkedServiceCreateOrUpdateParameters()
                {
                    LinkedService = new LinkedService()
                    {
                        Name = "AzureStorageLinkedService",
                        Properties = new LinkedServiceProperties
                        (
                            // TODO: Replace <accountname> and <accountkey> with name and key of your Azure Storage account.
                            new AzureStorageLinkedService("DefaultEndpointsProtocol=https;AccountName=<accountname>;AccountKey=<accountkey>")
                        )
                    }
                }
            );

            // create a linked service for output data store: Azure SQL Database
            Console.WriteLine("Creating Azure Batch linked service");
            client.LinkedServices.CreateOrUpdate(resourceGroupName, dataFactoryName,
                new LinkedServiceCreateOrUpdateParameters()
                {
                    LinkedService = new LinkedService()
                    {
                        Name = "AzureBatchLinkedService",
                        Properties = new LinkedServiceProperties
                        (
                            // TODO: replace <batchaccountname> and <yourbatchaccountkey> with name and key of your Azure Batch account
                            new AzureBatchLinkedService("<batchaccountname>", "https://westus.batch.azure.com", "<yourbatchaccountkey>", "myazurebatchpool", "AzureStorageLinkedService")
                        )
                    }
                }
            );

            // create input and output datasets
            Console.WriteLine("Creating input and output datasets");
            string Dataset_Source = "InputDataset";
            string Dataset_Destination = "OutputDataset";

            Console.WriteLine("Creating input dataset of type: Azure Blob");
            client.Datasets.CreateOrUpdate(resourceGroupName, dataFactoryName,

                new DatasetCreateOrUpdateParameters()
                {
                    Dataset = new Dataset()
                    {
                        Name = Dataset_Source,
                        Properties = new DatasetProperties()
                        {
                            LinkedServiceName = "AzureStorageLinkedService",
                            TypeProperties = new AzureBlobDataset()
                            {
                                FolderPath = "adftutorial/customactivityinput/",
                                Format = new TextFormat()
                            },
                            External = true,
                            Availability = new Availability()
                            {
                                Frequency = SchedulePeriod.Hour,
                                Interval = 1,
                            },

                            Policy = new Policy() { }
                        }
                    }
                });

            Console.WriteLine("Creating output dataset of type: Azure Blob");
            client.Datasets.CreateOrUpdate(resourceGroupName, dataFactoryName,
                new DatasetCreateOrUpdateParameters()
                {
                    Dataset = new Dataset()
                    {
                        Name = Dataset_Destination,
                        Properties = new DatasetProperties()
                        {
                            LinkedServiceName = "AzureStorageLinkedService",
                            TypeProperties = new AzureBlobDataset()
                            {
                                FileName = "{slice}.txt",
                                FolderPath = "adftutorial/customactivityoutput/",
                                PartitionedBy = new List<Partition>()
                                {
                                    new Partition()
                                    {
                                        Name = "slice",
                                        Value = new DateTimePartitionValue()
                                        {
                                            Date = "SliceStart",
                                            Format = "yyyy-MM-dd-HH"
                                        }
                                    }
                                }
                            },
                            Availability = new Availability()
                            {
                                Frequency = SchedulePeriod.Hour,
                                Interval = 1,
                            },
                        }
                    }
                });

            Console.WriteLine("Creating a custom activity pipeline");
            DateTime PipelineActivePeriodStartTime = new DateTime(2017, 3, 9, 0, 0, 0, 0, DateTimeKind.Utc);
            DateTime PipelineActivePeriodEndTime = PipelineActivePeriodStartTime.AddMinutes(60);
            string PipelineName = "ADFTutorialPipelineCustom";

            client.Pipelines.CreateOrUpdate(resourceGroupName, dataFactoryName,
                new PipelineCreateOrUpdateParameters()
                {
                    Pipeline = new Pipeline()
                    {
                        Name = PipelineName,
                        Properties = new PipelineProperties()
                        {
                            Description = "Use custom activity",

                            // Initial value for pipeline's active period. With this, you won't need to set slice status
                            Start = PipelineActivePeriodStartTime,
                            End = PipelineActivePeriodEndTime,
                            IsPaused = false,

                            Activities = new List<Activity>()
                            {
                                new Activity()
                                {
                                    Name = "MyDotNetActivity",
                                    Inputs = new List<ActivityInput>()
                                    {
                                        new ActivityInput() {
                                            Name = Dataset_Source
                                        }
                                    },
                                    Outputs = new List<ActivityOutput>()
                                    {
                                        new ActivityOutput()
                                        {
                                            Name = Dataset_Destination
                                        }
                                    },
                                    LinkedServiceName = "AzureBatchLinkedService",
                                    TypeProperties = new DotNetActivity()
                                    {
                                        AssemblyName = "MyDotNetActivity.dll",
                                        EntryPoint = "MyDotNetActivityNS.MyDotNetActivity",
                                        PackageLinkedService = "AzureStorageLinkedService",
                                        PackageFile = "customactivitycontainer/MyDotNetActivity.zip",
                                        ExtendedProperties = new Dictionary<string, string>()
                                        {
                                            { "SliceStart", "$$Text.Format('{0:yyyyMMddHH-mm}', Time.AddMinutes(SliceStart, 0))"}
                                        }
                                    },
                                    Policy = new ActivityPolicy()
                                    {
                                        Concurrency = 2,
                                        ExecutionPriorityOrder = "OldestFirst",
                                        Retry = 3,
                                        Timeout = new TimeSpan(0,0,30,0),
                                        Delay = new TimeSpan()
                                    }
                                }
                            }
                        }
                    }
                });
        }

        public static async Task<string> GetAuthorizationHeader()
        {
            AuthenticationContext context = new AuthenticationContext(ConfigurationManager.AppSettings["ActiveDirectoryEndpoint"] + ConfigurationManager.AppSettings["ActiveDirectoryTenantId"]);
            ClientCredential credential = new ClientCredential(
                ConfigurationManager.AppSettings["ApplicationId"],
                ConfigurationManager.AppSettings["Password"]);
            AuthenticationResult result = await context.AcquireTokenAsync(
                resource: ConfigurationManager.AppSettings["WindowsManagementUri"],
                clientCredential: credential);

            if (result != null)
                return result.AccessToken;

            throw new InvalidOperationException("Failed to acquire token");
        }
    }
}

Visual Studio でカスタム アクティビティをデバッグするDebug custom activity in Visual Studio

GitHub の Azure Data Factory - ローカル環境のサンプルには、Visual Studio 内でカスタム .NET アクティビティをデバッグできるツールが含まれています。The Azure Data Factory - local environment sample on GitHub includes a tool that allows you to debug custom .NET activities within Visual Studio.

GitHub 上のサンプルのカスタム アクティビティSample custom activities on GitHub

サンプルSample カスタム アクティビティの動作What custom activity does
HTTP データ ダウンローダーHTTP Data Downloader. Data Factory のカスタム C# アクティビティを使用して、HTTP エンドポイントから Azure Blob Storage にデータをダウンロードします。Downloads data from an HTTP Endpoint to Azure Blob Storage using custom C# Activity in Data Factory.
Twitter センチメント分析のサンプルTwitter Sentiment Analysis sample Azure Machine Learning Studio モデルを呼び出し、センチメント分析、スコア付け、予測などを行います。Invokes an Azure Machine Learning studio model and do sentiment analysis, scoring, prediction etc.
R スクリプトの実行Run R Script. 既に R がインストールされている HDInsight クラスターで RScript.exe を実行し、R スクリプトを呼び出します。Invokes R script by running RScript.exe on your HDInsight cluster that already has R Installed on it.
クロス AppDomain .NET アクティビティCross AppDomain .NET Activity Data Factory 起動ツールによって使用されているアセンブリ バージョンとは別のバージョンを使用します。Uses different assembly versions from ones used by the Data Factory launcher
Azure Analysis Services でモデルを再処理するReprocess a model in Azure Analysis Services Azure Analysis Services でモデルを再処理します。Reprocesses a model in Azure Analysis Services.