Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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. Nihai görev, yalnızca tüm kareler başarıyla işlendikten sonra işlenen kareleri tamamlanmış 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üsüz 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ı süreçler.
- 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 olacak şekilde ayarlayarak true'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 0 olduğunda başarıyla tamamlandığı kabul edilir. 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 |
|---|---|---|
| Birebir |
taskB, görevA 'ya bağlıdır. Bir görevA başarıyla tamamlanana kadar görevB yürütme için zamanlanmayacaktır. |
|
| Bire-çok |
taskC hem taskA'ya hem de taskB'yebağlı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 |
|
| Görev Kimliği aralığı | taskD bir dizi göreve bağlıdır ve kimlikleri 1 ile 10 arasında olan görevler başarıyla tamamlanana kadar taskD yürütülecek şekilde planlanmayacaktır. |
|
İ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. Ö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, 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 bir
Bire bir ilişkide görev, bir ebeveyn görevinin 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, 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 64.000 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ıkta yalnızca tamsayı değerlerini temsil eden kimliklere sahip görevler seçilir. Örneğin, 1..10 aralığı, 3 ve 7 öğesini seçer, ancak 5flamingoes öğesini seçmez.
Aralık bağımlılıkları değerlendirilirken baştaki sıfırlar önemli değildir, bu nedenle dize tanımlayıcıları 4, 04ve 004 olan görevler aralık içindedir , çünkü bunların tümü görev 4olarak kabul edilir, tamamlayan ilk görev bağı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 tamamlama 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.
- Bir 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ış kodu ile sona erdiğinde.
- Görev, ExitCodeRanges özelliği tarafından belirtilen bir aralıkta yer alan bir çıkış koduyla çıktığında.
- Varsayılan durum, görev ExitCodes veya ExitCodeRanges tarafından tanımlanmayan bir çıkış koduyla çıkarsa ya da görev ön işleme hatasıyla çıkar 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.
Bir bağımlılık eylemi belirtmek için çıkış koşulunun ExitOptions.DependencyAction özelliğini aşağıdaki seçeneklerden 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 ön işleme hatasıyla veya belirtilen hata kodlarıyla çıkarsa, bağımlı görev engellenir. Üst görev herhangi bir sıfır dışı hatayla çıkarsa, bağımlı görev çalıştırılabilir.
// 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 kümesinde nasıl yürütürsünüz.
Sonraki adımlar
- Görevlerinizin işlem düğümlerinde yürüttüğü uygulamaları dağıtmak ve sürüme almak için kolay bir yol sağlayan Batch'in uygulama paketleri özelliği hakkında bilgi edinin.
- İşler ve görevler için hata denetimi hakkında bilgi edinin.