Diğer görevlere bağımlı görevleri çalıştırmak için görev bağımlılıkları oluşturma

Batch görev bağımlılıkları ile, bir veya daha fazla üst görev tamamlandıktan sonra işlem düğümlerinde yürütülmeye zamanlanmış görevler oluşturursunuz. Örneğin, bir 3B filmin her karesini ayrı, paralel görevlerle işleyen bir iş oluşturabilirsiniz. Son görev, yalnızca tüm kareler başarıyla işlendikten sonra işlenen kareleri tam filmle birleştirir. Başka bir deyişle, son görev önceki üst görevlere bağlıdır.

Görev bağımlılıklarının yararlı olduğu bazı senaryolar şunlardır:

  • Bulutta MapReduce stili iş yükleri.
  • Veri işleme görevleri yönlendirilmiş bir döngüsel grafik (DAG) olarak ifade edilebilen işler.
  • Bir sonraki görevin başlayabilmesi için her görevin tamamlanması gereken ön işleme ve işleme sonrası işlemler.
  • Aşağı akış görevlerinin yukarı akış görevlerinin çıkışına bağlı olduğu diğer tüm işler.

Varsayılan olarak, bağımlı görevler yalnızca üst görev başarıyla tamamlandıktan sonra yürütülmeye zamanlanır. İsteğe bağlı olarak, varsayılan davranışı geçersiz kılmak için bir bağımlılık eylemi belirtebilir ve üst görev başarısız olsa bile bağımlı görevi çalıştırabilirsiniz.

Bu makalede, Batch .NET kitaplığını kullanarak görev bağımlılıklarının nasıl yapılandırılacağı açıklanmaktadır. Önce işlerinizde görev bağımlılığını etkinleştirmeyi ve ardından bağımlılıkları olan bir görevi yapılandırmayı gösteririz. Ayrıca, üst öğe başarısız olursa bağımlı görevleri çalıştırmak için bir bağımlılık eyleminin nasıl belirtileceğini de açıklıyoruz. Son olarak Batch'in desteklediği bağımlılık senaryolarını ele alıyoruz.

Görev bağımlılıklarını etkinleştirme

Batch uygulamanızda görev bağımlılıklarını kullanmak için önce işi görev bağımlılıklarını kullanacak şekilde yapılandırmanız gerekir. Batch .NET'te, UsesTaskDependencies özelliğini trueolarak ayarlayarak CloudJob'unuzda etkinleştirin:

CloudJob unboundJob = batchClient.JobOperations.CreateJob( "job001",
    new PoolInformation { PoolId = "pool001" });

// IMPORTANT: This is REQUIRED for using task dependencies.
unboundJob.UsesTaskDependencies = true;

Yukarıdaki kod parçacığında , "batchClient" BatchClient sınıfının bir örneğidir.

Bağımlı görevler oluşturma

Bir veya daha fazla üst görevin tamamlanmasına bağlı bir görev oluşturmak için, görevin diğer görevlere "bağımlı" olduğunu belirtebilirsiniz. Batch .NET'te CloudTask.DependsOn özelliğini TaskDependencies sınıfının bir örneğiyle yapılandırın:

// Task 'Flowers' depends on completion of both 'Rain' and 'Sun'
// before it is run.
new CloudTask("Flowers", "cmd.exe /c echo Flowers")
{
    DependsOn = TaskDependencies.OnIds("Rain", "Sun")
},

Bu kod parçacığı, "Flowers" görev kimliğine sahip bağımlı bir görev oluşturur. "Çiçekler" görevi "Yağmur" ve "Güneş" görevlerine bağlıdır. "Çiçekler" görevi yalnızca "Yağmur" ve "Güneş" görevleri başarıyla tamamlandıktan sonra işlem düğümünde çalışacak şekilde zamanlanır.

Not

Varsayılan olarak, bir görev tamamlandı durumundayken ve çıkış kodu olduğunda başarıyla tamamlandığı kabul edilir 0. Batch .NET'te bu, CloudTask.State özellik değerinin olduğu Completed ve CloudTask'ın TaskExecutionInformation.ExitCode özellik değerinin olduğu 0anlamına gelir. Bunu nasıl değiştireceğinizi öğrenmek için Bağımlılık eylemleri bölümüne bakın.

Bağımlılık senaryoları

Azure Batch'te kullanabileceğiniz üç temel görev bağımlılığı senaryosu vardır: bire bir, bire çok ve görev kimliği aralığı bağımlılığı. Bu üç senaryo dördüncü bir senaryo sağlamak için birleştirilebilir: çoka çok.

Senaryo Örnek Çizim
Bire taskB göreve bağlıdırBir

görevA başarıyla tamamlanana kadar görevB yürütme için zamanlanmayacaktır

Bire bir görev bağımlılığı senaryoyu gösteren diyagram.
Bir-çok taskC hem taskA'ya hem de taskB'ye bağımlıdır. Hem görevA hem de görevB

başarıyla tamamlanana kadar görevB görevC yürütme için zamanlanmayacaktır

Bire çok görev bağımlılığı senaryoyu gösteren diyagram.
Görev Kimliği aralığı taskD, 1 ile 10 arasında kimlikleri olan görevler başarıyla tamamlanana kadar yürütülecek görev aralığına

bağımlıdır.

Görev kimliği aralığı görev bağımlılığı senaryoyu gösteren diyagram.

İpucu

C, D, E ve F görevlerinin A ve B görevlerine bağımlı olduğu durumlar gibi çoka çok ilişkiler oluşturabilirsiniz. Bu, örneğin, aşağı akış görevlerinizin birden çok yukarı akış görevinin çıkışına bağlı olduğu paralel ön işleme senaryolarında kullanışlıdır.

Bu bölümdeki örneklerde, bağımlı bir görev yalnızca üst görevler başarıyla tamamlandıktan sonra çalışır. Bu davranış, bağımlı bir görev için varsayılan davranıştır. Bir üst görev başarısız olduktan sonra, varsayılan davranışı geçersiz kılmak için bir bağımlılık eylemi belirterek bağımlı bir görevi çalıştırabilirsiniz.

Bire

Bire bir ilişkide görev, bir üst görevin başarıyla tamamlanmasına bağlıdır. Bağımlılığı oluşturmak için, CloudTask.DependsOn özelliğini doldururken TaskDependencies.OnId statik yöntemine tek bir görev kimliği sağlayın.

// Task 'taskA' doesn't depend on any other tasks
new CloudTask("taskA", "cmd.exe /c echo taskA"),

// Task 'taskB' depends on completion of task 'taskA'
new CloudTask("taskB", "cmd.exe /c echo taskB")
{
    DependsOn = TaskDependencies.OnId("taskA")
},

Bir-çok

Bire çok ilişkisinde, bir görev birden çok üst görevin tamamlanmasına bağlıdır. Bağımlılığı oluşturmak için, CloudTask.DependsOn özelliğini doldururken TaskDependencies.OnIds statik yöntemine belirli görev kimliklerinden oluşan bir koleksiyon sağlayın.

// 'Rain' and 'Sun' don't depend on any other tasks
new CloudTask("Rain", "cmd.exe /c echo Rain"),
new CloudTask("Sun", "cmd.exe /c echo Sun"),

// Task 'Flowers' depends on completion of both 'Rain' and 'Sun'
// before it is run.
new CloudTask("Flowers", "cmd.exe /c echo Flowers")
{
    DependsOn = TaskDependencies.OnIds("Rain", "Sun")
},

Önemli

Üst görev kimliklerinin birleşik uzunluğu 64000 karakterden büyükse bağımlı görev oluşturma işlemi başarısız olur. Çok sayıda üst görev belirtmek için bunun yerine bir Görev Kimliği aralığı kullanmayı göz önünde bulundurun.

Görev Kimliği aralığı

Üst görev aralığındaki bir bağımlılıkta, bir görev, kimlikleri belirttiğiniz bir aralıkta yer alan görevlerin tamamlanmasına bağlıdır.

Bağımlılığı oluşturmak için, CloudTask.DependsOn özelliğini doldururken TaskDependencies.OnIdRange statik yöntemine aralıktaki ilk ve son görev kimliklerini sağlayın.

Önemli

Bağımlılıklarınız için görev kimliği aralıklarını kullandığınızda, aralık tarafından yalnızca tamsayı değerlerini temsil eden kimliklere sahip görevler seçilir. Örneğin, aralık 1..10 görevleri 3 ve 7öğesini seçer, ancak seçmez 5flamingoes.

Aralık bağımlılıkları değerlendirilirken baştaki sıfırlar önemli değildir, bu nedenle dize tanımlayıcılarına 404 sahip görevler ve 004 tümü aralık içinde yer alır. Bunların tümü görev olarak ele alınacağı için, tamamlanacak ilk değer 4bağımlılığı karşılar.

Bağımlı görevin çalışması için, aralıktaki her görevin başarıyla tamamlanarak veya Karşıla olarak ayarlanmış bir bağımlılık eylemine eşlenen bir hatayla tamamlanarak bağımlılığı karşılaması gerekir.

// Tasks 1, 2, and 3 don't depend on any other tasks. Because
// we will be using them for a task range dependency, we must
// specify string representations of integers as their ids.
new CloudTask("1", "cmd.exe /c echo 1"),
new CloudTask("2", "cmd.exe /c echo 2"),
new CloudTask("3", "cmd.exe /c echo 3"),

// Task 4 depends on a range of tasks, 1 through 3
new CloudTask("4", "cmd.exe /c echo 4")
{
    // To use a range of tasks, their ids must be integer values.
    // Note that we pass integers as parameters to TaskIdRange,
    // but their ids (above) are string representations of the ids.
    DependsOn = TaskDependencies.OnIdRange(1, 3)
},

Bağımlılık eylemleri

Varsayılan olarak, bağımlı bir görev veya görev kümesi yalnızca üst görev başarıyla tamamlandıktan sonra çalışır. Bazı senaryolarda, üst görev başarısız olsa bile bağımlı görevleri çalıştırmak isteyebilirsiniz. Bağımlı bir görevin çalıştırılmaya uygun olup olmadığını gösteren bir bağımlılık eylemi belirterek varsayılan davranışı geçersiz kılabilirsiniz.

Örneğin, bağımlı bir görevin yukarı akış görevinin tamamlanmasından veri beklediğini varsayalım. Yukarı akış görevi başarısız olursa, bağımlı görev eski verileri kullanarak çalışmaya devam edebilir. Bu durumda bağımlılık eylemi, üst görevin başarısız olmasına rağmen bağımlı görevin çalıştırılmaya uygun olduğunu belirtebilir.

Bağımlılık eylemi, üst görevin çıkış koşulunu temel alır. Aşağıdaki çıkış koşullarından herhangi biri için bir bağımlılık eylemi belirtebilirsiniz:

  • Ön işleme hatası oluştuğunda.
  • Dosya karşıya yükleme hatası oluştuğunda. Görevden exitCodes veya exitCodeRanges aracılığıyla belirtilen bir çıkış koduyla çıkılırsa ve sonra bir dosya karşıya yükleme hatasıyla karşılaşırsa, çıkış kodu tarafından belirtilen eylem öncelikli olur.
  • Görev ExitCodes özelliği tarafından tanımlanan bir çıkış koduyla çıktığında.
  • Görev, ExitCodeRanges özelliği tarafından belirtilen bir aralık içinde yer alan bir çıkış koduyla çıktığında.
  • Varsayılan durum, görev ExitCodes veya ExitCodeRanges tarafından tanımlanmayan bir çıkış koduyla çıkılırsa ya da görev ön işleme hatasıyla çıkar ve PreProcessingError özelliği ayarlanmazsa veya görev bir dosya yükleme hatasıyla başarısız olursa ve FileUploadError özelliği ayarlanmamışsa.

.NET için bu koşullar ExitConditions sınıfının özellikleri olarak tanımlanır.

Bağımlılık eylemi belirtmek için çıkış koşulunun ExitOptions.DependencyAction özelliğini aşağıdakilerden biri olarak ayarlayın:

  • Karşılama: Üst görev belirtilen bir hatayla çıkarsa bağımlı görevlerin çalıştırılmaya uygun olduğunu gösterir.
  • Engelle: Bağımlı görevlerin çalıştırılmaya uygun olmadığını gösterir.

DependencyAction özelliğinin varsayılan ayarı, 0 çıkış kodu için Karşıla ve diğer tüm çıkış koşulları için Engelle'dir.

Aşağıdaki kod parçacığı, üst görev için DependencyAction özelliğini ayarlar. Üst görev bir ön işleme hatasıyla veya belirtilen hata kodlarıyla çıkarsa, bağımlı görev engellenir. Üst görev sıfır olmayan başka bir hatayla çıkarsa, bağımlı görev çalıştırılmaya uygundur.

// Task A is the parent task.
new CloudTask("A", "cmd.exe /c echo A")
{
    // Specify exit conditions for task A and their dependency actions.
    ExitConditions = new ExitConditions
    {
        // If task A exits with a pre-processing error, block any downstream tasks (in this example, task B).
        PreProcessingError = new ExitOptions
        {
            DependencyAction = DependencyAction.Block
        },
        // If task A exits with the specified error codes, block any downstream tasks (in this example, task B).
        ExitCodes = new List<ExitCodeMapping>
        {
            new ExitCodeMapping(10, new ExitOptions() { DependencyAction = DependencyAction.Block }),
            new ExitCodeMapping(20, new ExitOptions() { DependencyAction = DependencyAction.Block })
        },
        // If task A succeeds or fails with any other error, any downstream tasks become eligible to run 
        // (in this example, task B).
        Default = new ExitOptions
        {
            DependencyAction = DependencyAction.Satisfy
        }
    }
},
// Task B depends on task A. Whether it becomes eligible to run depends on how task A exits.
new CloudTask("B", "cmd.exe /c echo B")
{
    DependsOn = TaskDependencies.OnId("A")
},

Kod örneği

GitHub'da TaskDependencies örnek projesi aşağıdakileri gösterir:

  • Bir işte görev bağımlılığını etkinleştirme.
  • Diğer görevlere bağlı görevleri oluşturma.
  • Bu görevleri bir işlem düğümleri havuzunda yürütme.

Sonraki adımlar