Azure Data Factory sürüm 1 işlem hattında özel etkinlikler kullanma

Not

Bu makale, Data Factory’nin 1. sürümü için geçerlidir. Data Factory hizmetinin geçerli sürümünü kullanıyorsanız bkz. V2'de özel etkinlikler.

bir Azure Data Factory işlem hattında kullanabileceğiniz iki tür etkinlik vardır.

Data Factory'nin desteklemediği bir veri deposuna/deposundan veri taşımak için kendi veri taşıma mantığınızla özel bir etkinlik oluşturun ve etkinliği bir işlem hattında kullanın. Benzer şekilde, verileri Data Factory tarafından desteklenmeyen bir şekilde dönüştürmek/işlemek için kendi veri dönüştürme mantığınızla özel bir etkinlik oluşturun ve etkinliği bir işlem hattında kullanın.

Sanal makinelerden oluşan bir Azure Batch havuzunda çalıştırılacak özel bir etkinlik yapılandırabilirsiniz. Azure Batch kullanırken, yalnızca mevcut bir Azure Batch havuzunu kullanabilirsiniz.

Aşağıdaki izlenecek yol, özel bir .NET etkinliği oluşturmak ve özel etkinliği bir işlem hattında kullanmak için adım adım yönergeler sağlar. İzlenecek yolda Azure Batch bağlı bir hizmet kullanılır.

Önemli

  • Şirket içi veri kaynaklarına erişmek için özel bir etkinlikten Veri Yönetimi Ağ Geçidi kullanmak mümkün değildir. Şu anda Veri Yönetimi Ağ Geçidi yalnızca Data Factory'deki kopyalama etkinliğini ve saklı yordam etkinliğini destekler.

İzlenecek yol: özel etkinlik oluşturma

Önkoşullar

Azure Batch önkoşulları

İzlenecek yolda, işlem kaynağı olarak Azure Batch kullanarak özel .NET etkinliklerinizi çalıştırırsınız. Azure Batch, büyük ölçekli paralel ve yüksek performanslı bilgi işlem (HPC) uygulamalarını bulutta verimli bir şekilde çalıştırmaya yönelik bir platform hizmetidir. Azure Batch, işlem yoğunluklu çalışmayı yönetilen bir sanal makine koleksiyonunda çalışacak şekilde zamanlar ve işlerinizin gereksinimlerini karşılamak için işlem kaynaklarını otomatik olarak ölçeklendirebilir. Azure Batch hizmetine ayrıntılı bir genel bakış için Azure Batch temel bilgiler makalesine bakın.

Öğretici için vm havuzuna sahip bir Azure Batch hesabı oluşturun. Adımlar aşağıdaki gibidir:

  1. Azure portal kullanarak bir Azure Batch hesabı oluşturun. Yönergeler için Azure Batch hesabı oluşturma ve yönetme makalesine bakın.

  2. Azure Batch hesap adını, hesap anahtarını, URI'yi ve havuz adını not edin. Bir Azure Batch bağlı hizmeti oluşturmaları gerekir.

    1. Azure Batch hesabının giriş sayfasında şu biçimde bir URL görürsünüz: https://myaccount.westus.batch.azure.com. Bu örnekte myaccount, Azure Batch hesabının adıdır. Bağlı hizmet tanımında kullandığınız URI, hesabın adı olmayan URL'dir. Örneğin: https://<region>.batch.azure.com.
    2. Soldaki menüde Anahtarlar'a tıklayın ve BİrİnCİl ERİşİm ANAHTARI'nı kopyalayın.
    3. Var olan bir havuzu kullanmak için, menüde Havuzlar'a tıklayın ve havuzun kimliğini not edin. Mevcut bir havuzunuz yoksa sonraki adıma geçin.
  3. bir Azure Batch havuzu oluşturun.

    1. Azure portal soldaki menüde Gözat'a tıklayın ve ardından Batch Hesapları'na tıklayın.
    2. Batch Hesabı dikey penceresini açmak için Azure Batch hesabınızı seçin.
    3. Havuzlar kutucuğuna tıklayın.
    4. Havuzlar dikey penceresinde, havuz eklemek için araç çubuğundaki Ekle düğmesine tıklayın.
      1. Havuz için bir kimlik girin (Havuz Kimliği). Havuzun kimliğini not edin; Data Factory çözümünü oluştururken buna ihtiyacınız vardır.
      2. İşletim Sistemi Ailesi ayarı için Windows Server 2012 R2 belirtin.
      3. Bir düğüm fiyatlandırma katmanı seçin.
      4. Hedef Ayrılmış ayarı için değer olarak 2 girin.
      5. Düğüm başına en fazla görev ayarı için değer olarak 2 girin.
    5. Havuzu oluşturmak için Tamam'a tıklayın.
    6. Havuzun kimliğini not edin.

Üst düzey adımlar

Bu kılavuzun bir parçası olarak gerçekleştirdiğiniz iki üst düzey adım şunlardır:

  1. Basit veri dönüştürme/işleme mantığı içeren özel bir etkinlik oluşturun.
  2. Özel etkinliği kullanan bir işlem hattı ile Azure veri fabrikası oluşturun.

Özel etkinlik oluşturma

.NET özel etkinliği oluşturmak için, bu IDotNetActivity arabirimini uygulayan bir sınıfla bir .NET Sınıf Kitaplığı projesi oluşturun. Bu arabirimin tek bir yöntemi vardır: Execute ve onun imzası:

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

yöntemi dört parametre alır:

  • linkedServices. Bu özellik, etkinlik için giriş/çıkış veri kümeleri tarafından başvurulan Veri Deposu bağlı hizmetlerinin numaralandırılabilir bir listesidir.
  • veri kümelerini seçin. Bu özellik, etkinliğin giriş/çıkış veri kümelerinin numaralandırılabilir bir listesidir. Giriş ve çıkış veri kümeleri tarafından tanımlanan konumları ve şemaları almak için bu parametreyi kullanabilirsiniz.
  • etkinliğine tıklayın. Bu özellik geçerli etkinliği temsil eder. Özel etkinlikle ilişkili genişletilmiş özelliklere erişmek için kullanılabilir. Ayrıntılar için bkz . Genişletilmiş özelliklere erişme .
  • günlükçü. Bu nesne, işlem hattının kullanıcı günlüğünde görünen hata ayıklama açıklamaları yazmanızı sağlar.

yöntemi, gelecekte özel etkinlikleri birbirine zincirleme amacıyla kullanılabilecek bir sözlük döndürür. Bu özellik henüz uygulanmadığından yönteminden boş bir sözlük döndür.

Yordam

  1. Bir .NET Sınıf Kitaplığı projesi oluşturun.

    1. Visual Studio başlatın.
    2. Dosya’ya tıklayın, Yeni’nin üzerine gelin ve Proje’ye tıklayın.
    3. Şablonlar’ı genişletin ve Visual C# seçeneğini belirleyin. Bu kılavuzda C# kullanırsınız, ancak özel etkinliği geliştirmek için herhangi bir .NET dilini kullanabilirsiniz.
    4. Sağdaki proje türleri listesinden Sınıf Kitaplığı'nı seçin. Visual Studio'da Sınıf Kitaplığı (.NET Framework) öğesini seçin
    5. Ad olarak MyDotNetActivity girin.
    6. Konum olarak C:\ADFGetStarted öğesini seçin.
    7. Projeyi oluşturmak için Tamam'a tıklayın.
  2. Araçlar'a tıklayın, NuGet Paket Yöneticisi'nin üzerine gelin ve ardından Paket Yöneticisi Konsolu'na tıklayın.

  3. Paket Yöneticisi Konsolu'nda aşağıdaki komutu yürüterek Microsoft.Azure.Management.DataFactories dosyasını içeri aktarın.

    Install-Package Microsoft.Azure.Management.DataFactories
    
  4. azure Depolama NuGet paketini projeye aktarın.

    Install-Package WindowsAzure.Storage -Version 4.3.0
    

    Önemli

    Data Factory hizmet başlatıcısı, WindowsAzure'ın 4.3 sürümünü gerektirir. Depolama. Özel etkinlik projenizde Azure Depolama derlemesinin sonraki bir sürümüne başvuru eklerseniz, etkinlik yürütürken bir hata görürsünüz. Hatayı çözmek için appdomain yalıtım bölümüne bakın.

  5. Aşağıdaki using deyimlerini projedeki kaynak dosyaya ekleyin.

    
    // 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. Ad alanının adını MyDotNetActivityNS olarak değiştirin.

    namespace MyDotNetActivityNS
    
  7. Sınıfının adını MyDotNetActivity olarak değiştirin ve aşağıdaki kod parçacığında gösterildiği gibi IDotNetActivity arabiriminden türetin:

    public class MyDotNetActivity : IDotNetActivity
    
  8. MyDotNetActivity sınıfına IDotNetActivity arabiriminin Execute yöntemini uygulayın (Ekle) ve aşağıdaki örnek kodu yöntemine kopyalayın.

    Aşağıdaki örnek, bir veri dilimiyle ilişkili her blobda arama teriminin ("Microsoft") oluşum sayısını sayar.

    /// <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. Aşağıdaki yardımcı yöntemleri ekleyin:

    /// <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 yöntemi, veri kümesinin işaret olduğu klasörün yolunu, GetFileName yöntemi ise veri kümesinin işaret olduğu blob/dosyanın adını döndürür. folderPath'i {Year}, {Month}, {Day} gibi değişkenleri kullanarak tanımlıyorsanız, yöntem dizeyi çalışma zamanı değerleriyle değiştirmeden olduğu gibi döndürür. SliceStart, SliceEnd vb. erişimin ayrıntıları için Genişletilmiş özelliklere erişme bölümüne bakın.

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

    Calculate yöntemi, giriş dosyalarındaki (klasördeki bloblar) Microsoft anahtar sözcüğü örneklerinin sayısını hesaplar. Arama terimi ("Microsoft") kodda sabit kodlanmıştır.

  10. Projeyi derleyin. Menüden Derle'ye tıklayın ve çözüm derle'ye tıklayın.

    Önemli

    projeniz için hedef çerçeve olarak .NET Framework 4.5.2 sürümünü ayarlayın: projeye sağ tıklayın ve hedef çerçeveyi ayarlamak için Özellikler'e tıklayın. Data Factory, 4.5.2'den sonraki .NET Framework sürümlerde derlenen özel etkinlikleri desteklemez.

  11. Windows Gezgini'ni başlatın ve derleme türüne bağlı olarak bin\debug veya bin\release klasörüne gidin.

  12. Proje klasörü\bin\Debug klasöründeki> tüm ikili dosyaları <içeren bir zip dosyası MyDotNetActivity.zip oluşturun. Hata olması durumunda soruna neden olan kaynak kodda satır numarası gibi ek ayrıntılar elde edebilmeniz için MyDotNetActivity.pdb dosyasını ekleyin.

    Önemli

    Özel etkinliğin zip dosyasındaki tüm dosyalar alt klasör olmadan en üst düzeyde olmalıdır.

    Binary output files

  13. Henüz yoksa customactivitycontainer adlı bir blob kapsayıcısı oluşturun.

  14. AzureStorageLinkedService tarafından başvuruda bulunulan genel amaçlı bir Azure blob depolamasında (sık/seyrek erişimli Blob depolama değil) customactivitycontainer'a blob olarak Upload MyDotNetActivity.zip.

Önemli

Bu .NET etkinlik projesini Data Factory projesi içeren bir çözüme Visual Studio ve Data Factory uygulama projesinden .NET etkinlik projesine başvuru eklerseniz, zip dosyasını el ile oluşturma ve genel amaçlı Azure blob depolama alanına yükleme işleminin son iki adımını gerçekleştirmeniz gerekmez. Visual Studio kullanarak Data Factory varlıklarını yayımladığınızda, bu adımlar yayımlama işlemi tarafından otomatik olarak gerçekleştirilir. Daha fazla bilgi için Visual Studio bölümündeki Data Factory projesi bölümüne bakın.

Özel etkinlikle işlem hattı oluşturma

Özel bir etkinlik oluşturdunuz ve ikili dosyalar içeren zip dosyasını genel amaçlı bir Azure Depolama Hesabındaki blob kapsayıcısına yüklediniz. Bu bölümde, özel etkinliği kullanan bir işlem hattı ile bir Azure veri fabrikası oluşturacaksınız.

Özel etkinliğin giriş veri kümesi, blob depolama alanındaki adftutorial kapsayıcısının customactivityinput klasöründeki blobları (dosyaları) temsil eder. Etkinliğin çıkış veri kümesi, blob depolama alanındaki adftutorial kapsayıcısının customactivityoutput klasöründeki çıktı bloblarını temsil eder.

Aşağıdaki içeriğe sahip file.txt dosyası oluşturun ve adftutorial kapsayıcısının customactivityinput klasörüne yükleyin. Henüz yoksa adftutorial kapsayıcısını oluşturun.

test custom activity Microsoft test custom activity Microsoft

Giriş klasörü, klasörde iki veya daha fazla dosya olsa bile Azure Data Factory bir dilime karşılık gelir. Her dilim işlem hattı tarafından işlendiğinde, özel etkinlik söz konusu dilimin giriş klasöründeki tüm bloblarda yinelenir.

adftutorial\customactivityoutput klasöründe bir veya daha fazla satır içeren bir çıkış dosyası görürsünüz (giriş klasöründeki blob sayısıyla aynıdır):

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

Bu bölümde gerçekleştirdiğiniz adımlar şunlardır:

  1. Veri fabrikası oluşturma.
  2. Özel etkinliğin çalıştığı Azure Batch vm havuzu ve giriş/çıkış bloblarını tutan Azure Depolama için Bağlı hizmetler oluşturun.
  3. Özel etkinliğin giriş ve çıkışını temsil eden giriş ve çıkış veri kümeleri oluşturun.
  4. Özel etkinliği kullanan bir işlem hattı oluşturun.

Not

file.txt oluşturun ve henüz yapmadıysanız blob kapsayıcısına yükleyin. Önceki bölümde yer alan yönergelere bakın.

1. Adım: Veri fabrikasını oluşturma

  1. Azure portal oturum açtıktan sonra aşağıdaki adımları uygulayın:

    1. Soldaki menüde Kaynak oluştur'a tıklayın.

    2. Yeni dikey penceresinde Veri + Analiz'e tıklayın.

    3. Veri analizi dikey penceresinde Data Factory’ye tıklayın.

      New Azure Data Factory menu

  2. Yeni veri fabrikası dikey penceresinde Ad için CustomActivityFactory girin. Azure veri fabrikasının adı genel olarak benzersiz olmalıdır. Şu hatayı alırsanız: "CustomActivityFactory" veri fabrikası adı kullanılamıyor, veri fabrikasının adını değiştirin (örneğin, adınızCustomActivityFactory) ve oluşturmayı yeniden deneyin.

    New Azure Data Factory blade

  3. KAYNAK GRUBU ADI'ne tıklayın ve var olan bir kaynak grubunu seçin veya bir kaynak grubu oluşturun.

  4. Veri fabrikasının oluşturulmasını istediğiniz doğru aboneliği ve bölgeyi kullandığınızı doğrulayın.

  5. Yeni data factory dikey penceresinde Oluştur’a tıklayın.

  6. Oluşturulan veri fabrikasını Azure portal Panosu'nda görürsünüz.

  7. Veri fabrikası başarıyla oluşturulduktan sonra, size veri fabrikasının içeriğini gösteren Data Factory dikey penceresini görürsünüz.

    Data Factory blade

2. Adım: Bağlı hizmetler oluşturma

Bağlı hizmetler veri depolarını veya işlem hizmetlerini Azure data factory’ye bağlar. Bu adımda Azure Depolama hesabınızı ve Azure Batch hesabınızı veri fabrikanıza bağlarsınız.

Azure Storage bağlı hizmeti oluşturma

  1. CustomActivityFactory için DATA FACTORY dikey penceresindeki Yazar ve dağıt kutucuğuna tıklayın. Data Factory Düzenleyicisi’ni görürsünüz.

  2. Komut çubuğunda Yeni veri deposu'na tıklayın ve Azure depolama'yı seçin. Düzenleyicide Azure Storage bağlı hizmeti oluşturmak için JSON betiğini görmeniz gerekir.

    New data store - Azure Storage

  3. değerini Azure depolama hesabınızın adıyla ve <accountkey> azure depolama hesabının erişim anahtarıyla değiştirin<accountname>. Depolama erişim anahtarınızı nasıl alacağınızı öğrenmek için bkz. Depolama hesabı erişim anahtarlarını yönetme.

    Azure Storage liked service

  4. Bağlı hizmeti dağıtmak için komut çubuğunda Dağıt’a tıklayın.

bağlı hizmet Azure Batch oluşturma

  1. Data Factory Düzenleyicisi'nde... Komut çubuğunda daha fazla bilgi için Yeni işlem'e tıklayın ve menüden Azure Batch'ı seçin.

    New compute - Azure Batch

  2. JSON betiğinde aşağıdaki değişiklikleri yapın:

    1. accountName özelliği için Azure Batch hesap adını belirtin. Azure Batch hesabı dikey penceresindekiURL şu biçimdedir: http://accountname.region.batch.azure.com. JSON'daki batchUri özelliği için URL'den kaldırmanız accountname. ve JSON için accountName özelliğini kullanmanız accountname gerekir.

    2. accessKey özelliği için Azure Batch hesap anahtarını belirtin.

    3. poolName özelliğinin önkoşullarının bir parçası olarak oluşturduğunuz havuzun adını belirtin. Havuzun adı yerine havuzun kimliğini de belirtebilirsiniz.

    4. batchUri özelliği için Azure Batch URI belirtin. Örnek: https://westus.batch.azure.com.

    5. linkedServiceName özelliği için AzureStorageLinkedService değerini belirtin.

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

      poolName özelliği için havuzun adı yerine havuzun kimliğini de belirtebilirsiniz.

3. Adım: Veri kümeleri oluşturma

Bu adımda, giriş ve çıkış verilerini temsil eden veri kümeleri oluşturursunuz.

Girdi veri kümesi oluşturma

  1. Data Factory Düzenleyicisi'nde... öğesine tıklayın. Komut çubuğunda daha fazla bilgi için Yeni veri kümesi'ne tıklayın ve açılan menüden Azure Blob depolama'yı seçin.

  2. Sağ bölmedeki JSON değerini aşağıdaki JSON kod parçacığıyla değiştirin:

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

    Bu kılavuzun ilerleyen bölümlerinde başlangıç zamanı: 2016-11-16T00:00:00Z ve bitiş saati: 2016-11-16T05:00:00Z ile bir işlem hattı oluşturursunuz. Verileri saatlik olarak üretmek üzere zamanlanmıştır, bu nedenle beş giriş/çıkış dilimi vardır ( 00:00:00 ->05:00:00 arasında).

    Giriş veri kümesinin sıklığı ve aralığıHour ve 1 olarak ayarlanır; bu da giriş diliminin saatlik olarak kullanılabildiği anlamına gelir. Bu örnekte, intputfolder'daki aynı dosyadır (file.txt).

    Yukarıdaki JSON kod parçacığında SliceStart sistem değişkeni tarafından temsil edilen her dilimin başlangıç zamanları aşağıdadır.

  3. InputDataset'i oluşturmak ve dağıtmak için araç çubuğunda Dağıt'a tıklayın. Düzenleyici’nin başlık çubuğunda TABLO BAŞARIYLA OLUŞTURULDU iletisini gördüğünüzü onaylayın.

Çıktı veri kümesi oluşturma

  1. Data Factory düzenleyicisinde... Komut çubuğunda daha fazla bilgi için Yeni veri kümesi'ne tıklayın ve Azure Blob depolama'yı seçin.

  2. Sağ bölmedeki JSON betiğini aşağıdaki JSON betiğiyle değiştirin:

    {
        "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
            }
        }
    }
    

    Çıktı konumu adftutorial/customactivityoutput/ ve çıktı dosyası adı yyyy-MM-dd-HH.txt; burada yyyy-AA-gg-SS, üretilen dilimin yılı, ayı, tarihi ve saatidir. Ayrıntılar için bkz . Geliştirici Başvurusu .

    Her giriş dilimi için bir çıkış blobu/dosyası oluşturulur. Çıkış dosyasının her dilim için nasıl adlandırılıyor olduğu aşağıda açıklanır. Tüm çıkış dosyaları tek bir çıkış klasöründe oluşturulur: adftutorial\customactivityoutput.

    Dilim Başlangıç saati Çıktı dosyası
    1 2016-11-16T00:00:00 2016-11-16-00.txt
    2 2016-11-16T01:00:00 2016-11-16-01.txt
    3 2016-11-16T02:00:00 2016-11-16-02.txt
    4 2016-11-16T03:00:00 2016-11-16-03.txt
    5 2016-11-16T04:00:00 2016-11-16-04.txt

    Giriş klasöründeki tüm dosyaların, yukarıda belirtilen başlangıç zamanlarıyla birlikte bir dilimin parçası olduğunu unutmayın. Bu dilim işlendiğinde, özel etkinlik her dosyada tarar ve çıkış dosyasında arama teriminin oluşum sayısıyla ("Microsoft") bir satır oluşturur. Giriş klasöründe üç dosya varsa, çıkış dosyasında her saatlik dilim için üç satır vardır: 2016-11-16-00.txt, 2016-11-16:01:00:00.txt vb.

  3. OutputDataset'i dağıtmak için komut çubuğunda Dağıt'a tıklayın.

Özel etkinliği kullanan bir işlem hattı oluşturma ve çalıştırma

  1. Data Factory Düzenleyicisi'nde ... öğesine tıklayın. Daha fazla bilgi ve ardından komut çubuğunda Yeni işlem hattı'nı seçin.

  2. Sağdaki bölmedeki JSON değerini aşağıdaki JSON betiğiyle değiştirin:

    {
      "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
      }
    }
    

    Aşağıdaki noktalara dikkat edin:

    • Eşzamanlılık2 olarak ayarlanır, böylece iki dilim Azure Batch havuzundaki 2 VM tarafından paralel olarak işlenir.
    • Etkinlikler bölümünde bir etkinlik vardır ve şu türdedir: DotNetActivity.
    • AssemblyName , DLL adı olarak ayarlanır: MyDotnetActivity.dll.
    • EntryPoint, MyDotNetActivityNS.MyDotNetActivity olarak ayarlanır.
    • PackageLinkedService , özel etkinlik zip dosyasını içeren blob depolamayı işaret eden AzureStorageLinkedService olarak ayarlanır. Giriş/çıkış dosyaları ve özel etkinlik zip dosyası için farklı Azure Depolama hesapları kullanıyorsanız, başka bir Azure Depolama bağlı hizmeti oluşturursunuz. Bu makalede aynı Azure Depolama hesabını kullandığınız varsayılır.
    • PackageFilecustomactivitycontainer/MyDotNetActivity.zipolarak ayarlanır. Şu biçimdedir: containerforthezip/nameofthezip.zip.
    • Özel etkinlik input olarak InputDataset ve çıkış olarak OutputDataset alır.
    • Özel etkinliğin linkedServiceName özelliği, Azure Data Factory özel etkinliğin Azure Batch VM'lerde çalıştırılması gerektiğini bildiren AzureBatchLinkedService'e işaret eder.
    • isPaused özelliği varsayılan olarak false olarak ayarlanır. Dilimler geçmişte başladığı için işlem hattı bu örnekte hemen çalışır. İşlem hattını duraklatmak ve yeniden başlatmak için false olarak ayarlamak için bu özelliği true olarak ayarlayabilirsiniz.
    • Başlangıç saati ile bitiş saatleri arasında beş saat vardır ve dilimler saatlik olarak üretilir, bu nedenle işlem hattı tarafından beş dilim üretilir.
  3. İşlem hattını dağıtmak için komut çubuğunda Dağıt'a tıklayın.

İşlem hattını izleme

  1. Azure portal Data Factory dikey penceresinde Diyagram'a tıklayın.

    Diagram tile

  2. Diyagram Görünümü'nde şimdi OutputDataset'e tıklayın.

    Diagram view

  3. Beş çıkış diliminin Hazır durumda olduğunu görmeniz gerekir. Hazır durumda değilse henüz üretilmemişlerdir.

    Output slices

  4. Çıkış dosyalarının adftutorial kapsayıcısında blob depolama alanında oluşturulduğunu doğrulayın.

    output from custom activity

  5. Çıkış dosyasını açarsanız, aşağıdaki çıkışa benzer bir çıktı görmeniz gerekir:

    2 occurrences(s) of the search term "Microsoft" were found in the file inputfolder/2016-11-16-00/file.txt.
    
  6. Veri fabrikanızı, işlem hatlarınızı ve veri kümelerinizi izlemek için Azure portal veya Azure PowerShell cmdlet'lerini kullanın. Portaldan veya cmdlet'leri kullanarak indirebileceğiniz günlüklerdeki (özellikle user-0.log) özel etkinliğin kodunda ActivityLogger'dan gelen iletileri görebilirsiniz.

    download logs from custom activity

Veri kümelerini ve işlem hatlarını izlemeyle ilgili ayrıntılı adımlar için bkz. Pipelines İzleme ve Yönetme.

Visual Studio'de Data Factory projesi

Data Factory varlıklarını oluşturmak ve yayımlamak için Azure portal yerine Visual Studio kullanabilirsiniz. Visual Studio kullanarak Data Factory varlıkları oluşturma ve yayımlama hakkında ayrıntılı bilgi için bkz. Visual Studio kullanarak ilk işlem hattınızı oluşturma ve Azure Blob'dan Azure SQL makalelere veri kopyalama.

Visual Studio'de Data Factory projesi oluşturuyorsanız aşağıdaki ek adımları uygulayın:

  1. Data Factory projesini özel etkinlik projesini içeren Visual Studio çözümüne ekleyin.

  2. Data Factory projesinden .NET etkinlik projesine bir başvuru ekleyin. Data Factory projesine sağ tıklayın, Ekle'nin üzerine gelin ve Başvuru'ya tıklayın.

  3. Başvuru Ekle iletişim kutusunda MyDotNetActivity projesini seçin ve Tamam'a tıklayın.

  4. Çözümü derleyin ve yayımlayın.

    Önemli

    Data Factory varlıklarını yayımladığınızda, sizin için otomatik olarak bir zip dosyası oluşturulur ve blob kapsayıcısına yüklenir: customactivitycontainer. Blob kapsayıcısı yoksa, otomatik olarak da oluşturulur.

Data Factory ve Batch tümleştirmesi

Data Factory hizmeti, Azure Batch içinde adf-poolname: job-xxx adlı bir iş oluşturur. Soldaki menüden İşler'e tıklayın.

Azure Data Factory - Batch jobs

Bir dilimin her etkinlik çalıştırması için bir görev oluşturulur. İşlenmek üzere hazır beş dilim varsa, bu işte beş görev oluşturulur. Batch havuzunda birden çok işlem düğümü varsa, iki veya daha fazla dilim paralel olarak çalıştırılabilir. İşlem düğümü başına en fazla görev sayısı 1 olarak ayarlandıysa > , aynı işlemde çalışan birden fazla dilime de sahip olabilirsiniz.

Azure Data Factory - Batch job tasks

Aşağıdaki diyagramda Azure Data Factory ve Batch görevleri arasındaki ilişki gösterilmektedir.

Data Factory & Batch

Hataları giderme

Sorun giderme birkaç temel tekniklerden oluşur:

  1. Aşağıdaki hatayı görürseniz genel amaçlı bir Azure blob depolama kullanmak yerine Sık/Seyrek Erişimli blob depolama kullanıyor olabilirsiniz. Zip dosyasını genel amaçlı bir Azure Depolama Hesabına Upload.

    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. Aşağıdaki hatayı görürseniz, CS dosyasındaki sınıfın adının JSON işlem hattındaki EntryPoint özelliği için belirttiğiniz adla eşleşip eşleşmediğini onaylayın. İzlenecek yolda sınıfın adı: MyDotNetActivity ve JSON'daki EntryPoint: MyDotNetActivityNS. MyDotNetActivity.

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

    Adlar eşleşiyorsa, tüm ikili dosyaların zip dosyasının kök klasöründe olduğunu onaylayın. Başka bir ifadeyle, zip dosyasını açtığınızda tüm dosyaları herhangi bir alt klasörde değil kök klasörde görmeniz gerekir.

  3. Giriş dilimi Hazır olarak ayarlanmadıysa, giriş klasörü yapısının doğru olduğunu ve giriş klasörlerinde file.txt olduğunu onaylayın.

  4. Özel etkinliğinizin Execute yönteminde, sorunları gidermenize yardımcı olan bilgileri günlüğe kaydetmek için IActivityLogger nesnesini kullanın. Günlüğe kaydedilen iletiler kullanıcı günlük dosyalarında (user-0.log, user-1.log, user-2.log vb. adlı bir veya daha fazla dosya) gösterilir.

    OutputDataset dikey penceresinde dilime tıklayarak dilime ilişkin VERİ DILIMİ dikey penceresini görüntüleyin. Bu dilim için etkinlik çalıştırmaları görürsünüz. Dilim için bir etkinlik çalıştırması görmeniz gerekir. Komut çubuğunda Çalıştır'a tıklarsanız, aynı dilim için başka bir etkinlik çalıştırması başlatabilirsiniz.

    Etkinlik çalıştırmasını tıklattığınızda, günlük dosyalarının listesini içeren ETKİ ÇALıŞTıRMASI AYRINTILARI dikey penceresini görürsünüz. günlüğe kaydedilen iletileri user_0.log dosyasında görürsünüz. Bir hata oluştuğunda, işlem hattı/etkinlik JSON'unda yeniden deneme sayısı 3 olarak ayarlandığından üç etkinlik çalıştırması görürsünüz. Etkinlik çalıştırmasına tıkladığınızda, hatayı gidermek için gözden geçirebileceğiniz günlük dosyalarını görürsünüz.

    Günlük dosyaları listesinde user-0.log dosyasına tıklayın. Sağ panelde IActivityLogger.Write yöntemini kullanmanın sonuçları yer alır. tüm iletileri görmüyorsanız, adlı daha fazla günlük dosyanız olup olmadığını denetleyin: user_1.log, user_2.log vb. Aksi takdirde, kod son günlüğe kaydedilen iletiden sonra başarısız olmuş olabilir.

    Ayrıca, sistem hata iletileri ve özel durumlar için system-0.log'a bakın.

  5. Hata oluştuğunda hata ayrıntılarında çağrı yığını gibi bilgiler olması için PDB dosyasını zip dosyasına ekleyin.

  6. Özel etkinliğin zip dosyasındaki tüm dosyalar alt klasör olmadan en üst düzeyde olmalıdır.

  7. assemblyName (MyDotNetActivity.dll), entryPoint(MyDotNetActivityNS.MyDotNetActivity), packageFile (customactivitycontainer/MyDotNetActivity.zip) ve packageLinkedService (zip dosyasını içeren genel amaçlıAzure blob depolamaya işaret etmelidir) değerlerinin doğru değerlere ayarlandığından emin olun.

  8. Bir hatayı düzelttiyseniz ve dilimi yeniden işlemek istiyorsanız OutputDataset dikey penceresindeki dilime sağ tıklayın ve Çalıştır’a tıklayın.

  9. Aşağıdaki hatayı görürseniz 4.3.0 sürümünün > Azure Depolama paketini kullanıyorsunuz. Data Factory hizmet başlatıcısı, WindowsAzure'un 4.3 sürümünü gerektirir. Depolama. Azure Depolama derlemesinin sonraki sürümünü kullanmanız gerekiyorsa geçici çözüm için Uygulama etki alanı yalıtımı bölümüne bakın.

    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 Depolama paketinin 4.3.0 sürümünü kullanabilirseniz, 4.3.0 sürümünün > Azure Depolama paketine var olan başvuruyu kaldırın. Ardından NuGet Paket Yöneticisi Konsolu'ndan aşağıdaki komutu çalıştırın.

    Install-Package WindowsAzure.Storage -Version 4.3.0
    

    Projeyi derleyin. Azure'i silin. bin\Debug klasöründen sürüm > 4.3.0'ın derlemesini Depolama. İkili dosyalar ve PDB dosyası ile bir zip dosyası oluşturun. Blob kapsayıcısında eski zip dosyasını bununla değiştirin (customactivitycontainer). Başarısız olan dilimleri yeniden çalıştırın (dilime sağ tıklayın ve Çalıştır'a tıklayın).

  10. Özel etkinlik, paketinizdeki app.config dosyasını kullanmaz. Bu nedenle, kodunuz yapılandırma dosyasından herhangi bir bağlantı dizesini okursa çalışma zamanında çalışmaz. Azure Batch kullanırken en iyi uygulama Azure KeyVault'ta gizli dizileri tutmak, keyvault'u korumak için sertifika tabanlı hizmet sorumlusu kullanmak ve sertifikayı Azure Batch havuzuna dağıtmaktır. Böylece .NET özel etkinliği çalıştırma sırasında KeyVault’tan parolalara erişebilir. Bu çözüm genel bir çözümdür ve yalnızca bağlantı dizesine değil her tür gizli diziye ölçeklendirilebilir.

    Daha kolay bir geçici çözüm vardır (ancak en iyi yöntem değildir): Bağlantı dizesi ayarlarıyla Azure SQL bağlı bir hizmet oluşturabilir, bağlı hizmeti kullanan bir veri kümesi oluşturabilir ve veri kümesini sahte bir giriş veri kümesi olarak özel .NET etkinliğine zincirleyebilirsiniz. Daha sonra özel etkinlik kodunda bağlı hizmetin bağlantı dizesine erişebilirsiniz.

Özel etkinliği güncelleştirme

Özel etkinliğin kodunu güncelleştirirseniz oluşturun ve yeni ikili dosyalar içeren zip dosyasını blob depolamaya yükleyin.

Uygulama etki alanı yalıtımı

Bkz. Data Factory başlatıcısı tarafından kullanılan derleme sürümleriyle kısıtlanmamış özel bir etkinliğin nasıl oluşturulacağını gösteren Çapraz Uygulama Etki Alanı Örneği (örnek: WindowsAzure.Depolama v4.3.0, Newtonsoft.Json v6.0.x vb.).

Genişletilmiş özelliklere erişme

Aşağıdaki örnekte gösterildiği gibi etkinlik JSON'unda genişletilmiş özellikler bildirebilirsiniz:

"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"
  }
},

Örnekte iki genişletilmiş özellik vardır: SliceStart ve DataFactoryName. SliceStart değeri, SliceStart sistem değişkenini temel alır. Desteklenen sistem değişkenlerinin listesi için bkz. Sistem Değişkenleri. DataFactoryName değeri CustomActivityFactory olarak sabit kodlanmıştır.

Execute yönteminde bu genişletilmiş özelliklere erişmek için aşağıdaki koda benzer bir kod kullanın:

// 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 otomatik ölçeklendirme

Otomatik ölçeklendirme özelliğiyle bir Azure Batch havuzu da oluşturabilirsiniz. Örneğin, bekleyen görevlerin sayısına göre 0 ayrılmış VM'ye ve otomatik ölçeklendirme formülüne sahip bir Azure batch havuzu oluşturabilirsiniz.

Buradaki örnek formül şu davranışı gerçekleştirir: Havuz ilk oluşturulduğunda 1 VM ile başlar. $PendingTasks ölçümü, çalışma + etkin (kuyruğa alınmış) durumdaki görev sayısını tanımlar. Formül, son 180 saniye içinde bekleyen görevlerin ortalama sayısını bulur ve TargetDedicated'i buna göre ayarlar. TargetDedicated'ın hiçbir zaman 25 VM'nin ötesine geçmemesini sağlar. Bu nedenle, yeni görevler gönderildikçe havuz otomatik olarak büyür ve görevler tamamlandıkça VM'ler birer birer serbest hale gelir ve otomatik ölçeklendirme bu VM'leri küçültür. startingNumberOfVMs ve maxNumberofVMs gereksinimlerinize göre ayarlanabilir.

Otomatik ölçeklendirme formülü:

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

Ayrıntılar için bkz. Azure Batch havuzunda işlem düğümlerini otomatik olarak ölçeklendirme.

Havuz varsayılan autoScaleEvaluationInterval kullanıyorsa Batch hizmetinin özel etkinliği çalıştırmadan önce VM'yi hazırlaması 15-30 dakika sürebilir. Havuz farklı bir autoScaleEvaluationInterval kullanıyorsa Batch hizmeti autoScaleEvaluationInterval + 10 dakika sürebilir.

.NET SDK kullanarak özel etkinlik oluşturma

Bu makaledeki kılavuzda, Azure portal kullanarak özel etkinliği kullanan bir işlem hattı ile bir veri fabrikası oluşturursunuz. Aşağıdaki kod, bunun yerine .NET SDK'sını kullanarak veri fabrikasının nasıl oluşturulacağını gösterir. .NET API kullanarak kopyalama etkinliğiyle işlem hattı oluşturma makalesinde, işlem hatlarını program aracılığıyla oluşturmak için SDK kullanma hakkında daha fazla ayrıntı bulabilirsiniz.

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'de özel etkinlikte hata ayıklama

GitHub üzerindeki Azure Data Factory - yerel ortam örneği, Visual Studio içinde özel .NET etkinliklerinde hata ayıklamanıza olanak tanıyan bir araç içerir.

GitHub üzerinde örnek özel etkinlikler

Örnek Özel etkinlik ne yapar?
HTTP Veri İndiricisi. Data Factory'deki özel C# Etkinliğini kullanarak http uç noktasından Azure Blob Depolama verileri indirir.
R Betiğini çalıştırın. Üzerinde R Yüklü olan HDInsight kümenizde RScript.exe çalıştırarak R betiğini çağırır.
Çapraz UygulamaEtki Alanı .NET Etkinliği Data Factory başlatıcısı tarafından kullanılanlardan farklı derleme sürümleri kullanır
Azure Analysis Services'de modeli yeniden işleme Modeli Azure Analysis Services'de yeniden işler.