Share via


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ıyla, 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ğımlı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ğımlı 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 ve üst görev başarısız olsa bile bağımlı görevi çalıştırmak için bir bağımlılık eylemi belirtebilirsiniz.

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 aacağız.

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 bir işlem düğümünde çalışacak şekilde zamanlanacaktır.

Not

Varsayılan olarak, görev tamamlanmış durumdayken 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'in TaskExecutionInformation.ExitCode özellik değerinin olduğu 0anlamına gelir. Bunun 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 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 Illüstrasyon
Bir-bir taskBgöreve bağlıdırA görevA başarıyla tamamlanana

kadargörevB yürütülecek şekilde zamanlanmaz

Bire bir görev bağımlılığı senaryoyu gösteren diyagram.
Bire çok taskC hem göreve bağımlı hem de görevB görevA ve görevB

başarıyla tamamlanana kadar yürütme için zamanlanmaz

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

bağlı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 yararlı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. Varsayılan davranışı geçersiz kılmak için bir bağımlılık eylemi belirterek bir üst görev başarısız olduktan sonra bağımlı bir görevi çalıştırabilirsiniz.

Bir-bir

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

Bire çok

Bire çok ilişkisinde, 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şleminiz 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.

Baştaki sıfırlar aralık bağımlılıklarını değerlendirirken önemli değildir, bu nedenle dize tanımlayıcıları 404 olan görevler ve 004 tümü aralık içinde yer alır, çünkü bunların tümü görev 4olarak kabul edilir, tamamlanacak ilk değer bağımlılığı karşılar.

Bağımlı görevin çalışması için aralıktaki her görevin, başarıyla tamamlanarak veya Tatmin Et olarak ayarlanmış bir bağımlılık eylemiyle 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ı belirten 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 itibaren verileri 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.
  • Karşıya dosya yükleme hatası oluştuğunda. Görevden exitCodes veya exitCodeRanges aracılığıyla belirtilen bir çıkış koduyla çıkılırsa ve sonra dosya karşıya yükleme hatasıyla karşılaşırsa, çıkış kodu tarafından belirtilen eylem öncelikli olur.
  • Görevden çıkış kodu 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ımlanmamış bir çıkış koduyla çıkarsa ya da görev ön işleme hatasıyla çıkarsa ve PreProcessingError özelliği ayarlanmamışsa 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 birine ayarlayın:

  • Karşıla: Üst görev belirtilen bir hatayla çıkarsa bağımlı görevlerin çalışmaya 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ı, çıkış kodu 0 için Satisfy 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 ö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