Buat dependensi tugas untuk menjalankan tugas yang bergantung pada tugas lain

Dengan dependensi tugas Batch, Anda membuat tugas yang dijadwalkan untuk dieksekusi pada simpul komputasi setelah menyelesaikan satu atau beberapa tugas induk. Misalnya, Anda dapat membuat pekerjaan yang merender setiap bingkai film 3D dengan tugas paralel yang terpisah. Tugas terakhir menggabungkan bingkai yang dirender ke dalam film lengkap hanya setelah semua bingkai berhasil dirender. Dengan kata lain, tugas akhir bergantung pada tugas induk sebelumnya.

Beberapa skenario kektika dependensi tugas berguna meliputi:

  • Beban kerja bergaya MapReduce di awan.
  • Pekerjaan yang tugas pemrosesan datanya dapat dinyatakan sebagai grafik asiklik terarah (DAG).
  • Proses pra-rendering dan pasca-rendering, ketika setiap tugas harus diselesaikan sebelum tugas berikutnya dapat dimulai.
  • Pekerjaan lain ketika tugas hilir bergantung pada output tugas hulu.

Secara default, tugas dependen dijadwalkan untuk eksekusi hanya setelah tugas induk berhasil diselesaikan. Anda memiliki pilihan untuk menentukan tindakan dependensi untuk mengganti perilaku default dan menjalankan tugas dependen meskipun tugas induk gagal.

Dalam artikel ini, kita membahas cara mengonfigurasi dependensi tugas dengan menggunakan pustaka .NET Batch. Kami pertama-tama menunjukkan cara mengaktifkan dependensi tugas pada pekerjaan Anda, lalu menunjukkan cara mengonfigurasi tugas dengan dependensi. Kami juga menjelaskan cara menentukan tindakan dependensi untuk menjalankan tugas dependen jika induk gagal. Terakhir, kami membahas skenario dependensi yang didukung Batch.

Aktifkan dependensi tugas

Untuk menggunakan dependensi tugas di aplikasi Batch, Anda harus terlebih dahulu mengonfigurasi tugas untuk menggunakan dependensi tugas. Di Batch .NET, aktifkan di CloudJob Anda dengan mengatur properti UsesTaskDependencies menjadi true:

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

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

Dalam cuplikan kode sebelumnya, "batchClient" adalah instans kelas BatchClient.

Buat tugas dependen

Untuk membuat tugas yang bergantung pada penyelesaian satu atau beberapa tugas induk, Anda bisa menentukan suatu tugas "bergantung pada" tugas lainnya. Di Batch .NET, konfigurasikan properti CloudTask.DependsOn dengan contoh kelas TaskDependencies:

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

Cuplikan kode ini membuat tugas dependen dengan ID tugas "Bunga". Tugas "Bunga" bergantung pada tugas "Hujan" dan "Matahari". Tugas "Bunga" akan dijadwalkan untuk berjalan pada simpul komputasi hanya setelah tugas "Hujan" dan "Matahari" berhasil diselesaikan.

Catatan

Secara default, tugas dianggap berhasil diselesaikan ketika dalam keadaan selesai dan kode keluarnya adalah 0. Dalam Batch .NET, ini berarti nilai properti CloudTask.State adalah Completed dan nilai properti TaskExecutionInformation.ExitCode CloudTask adalah 0. Untuk mempelajari cara mengubah ini, lihat bagian Tindakan dependensi.

Skenario dependensi

Ada tiga skenario dasar dependensi tugas yang bisa Anda gunakan di Azure Batch: dependensi satu ke satu, satu ke banyak, dan rentang ID tugas. Ketiga skenario ini dapat digabungkan untuk memberikan skenario keempat: banyak ke banyak.

Skenario Contoh Ilustrasi
One-to-one taskB bergantung pada taskA

taskB tidak akan dijadwalkan untuk eksekusi sampai taskA berhasil diselesaikan

Diagram memperlihatkan skenario dependensi tugas satu ke satu.
One-to-many taskC bergantung pada taskA dan taskB

taskC tidak akan dijadwalkan untuk eksekusi sampai taskA dan taskB berhasil diselesaikan

Diagram memperlihatkan skenario dependensi tugas satu ke banyak.
Task ID range taskD bergantung pada rentang tugas

taskD tidak akan dijadwalkan untuk eksekusi sampai tugas dengan ID 1 hingga 10 berhasil diselesaikan

Diagram memperlihatkan skenario dependensi rentang ID tugas.

Tip

Anda bisa membuat hubungan banyak ke banyak, seperti tugas C, D, E, dan F yang bergantung pada tugas A dan B. Ini berguna, misalnya, dalam skenario praproses paralel ketika tugas hilir Anda bergantung pada output beberapa tugas hulu.

Dalam contoh di bagian ini, tugas dependen hanya berjalan setelah tugas induk berhasil diselesaikan. Perilaku ini adalah perilaku default untuk tugas dependen. Anda bisa menjalankan tugas dependen setelah tugas induk gagal dengan menentukan tindakan dependensi untuk menimpa perilaku default.

One-to-one

Dalam hubungan satu ke satu, tugas bergantung pada keberhasilan penyelesaian satu tugas induk. Untuk membuat dependensi, berikan satu ID tugas ke metode statik TaskDependencies.OnId saat Anda mengisi properti CloudTask.DependsOn.

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

One-to-many

Dalam hubungan satu ke banyak, tugas bergantung pada penyelesaian beberapa tugas induk. Untuk membuat dependensi, berikan kumpulan ID tugas tertentu ke metode statis TaskDependencies.OnIds saat Anda mengisi properti CloudTask.DependsOn.

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

Penting

Pembuatan tugas dependen Anda akan gagal jika panjang gabungan ID tugas induk lebih dari 64.000 karakter. Untuk menentukan sejumlah besar tugas induk, pertimbangkan untuk menggunakan rentang ID Tugas sebagai gantinya.

Task ID range

Dalam dependensi pada rentang tugas induk, tugas bergantung pada penyelesaian tugas yang ID-nya berada dalam rentang yang Anda tentukan.

Untuk membuat dependensi, berikan ID tugas pertama dan terakhir dalam rentang ke metode statis TaskDependencies.OnIdRange saat Anda mengisi properti CloudTask.DependsOn.

Penting

Saat menggunakan rentang ID tugas untuk dependensi Anda, hanya tugas dengan ID yang mewakili nilai bilangan bulat yang akan dipilih oleh rentang. Misalnya, rentang 1..10 akan memilih tugas 3 dan 7, tetapi tidak 5flamingoes.

Angka nol di depan tidak signifikan saat mengevaluasi dependensi rentang, jadi tugas dengan pengidentifikasi string 4, 04, dan 004 semuanya akan dalam rentang, Karena semuanya akan diperlakukan sebagai tugas 4, yang pertama selesai akan memenuhi dependensi.

Untuk menjalankan tugas dependen, setiap tugas dalam rentang harus memenuhi dependensi, baik selesai dengan sukses atau selesai dengan kegagalan yang dipetakan ke tindakan dependensi yang diatur ke Memenuhi.

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

Tindakan dependensi

Secara default, tugas dependen atau kumpulan tugas hanya berjalan setelah tugas induk berhasil diselesaikan. Dalam beberapa skenario, Anda mungkin ingin menjalankan tugas dependen meskipun tugas induk gagal. Anda dapat mengganti perilaku default dengan menetapkan tindakan dependensi yang menunjukkan apakah tugas dependen memenuhi syarat untuk dijalankan.

Misalnya, anggap tugas dependen sedang menunggu data dari penyelesaian tugas hulu. Jika tugas hulu gagal, tugas dependen mungkin masih dapat berjalan menggunakan data yang lebih lama. Dalam hal ini, tindakan dependensi dapat menentukan bahwa tugas dependen memenuhi syarat untuk dijalankan meskipun ada kegagalan tugas induk.

Tindakan dependensi didasarkan pada kondisi keluar untuk tugas induk. Anda dapat menentukan tindakan dependensi untuk salah satu kondisi keluar berikut:

  • Saat terjadi galat pra-proses.
  • Saat terjadi galat pengunggahan file. Jika tugas keluar dengan kode keluar yang ditentukan melalui exitCode atau exitCodeRanges, lalu menemukan galat pengunggahan file, tindakan yang ditentukan oleh kode keluar lebih diutamakan.
  • Saat tugas keluar dengan kode keluar yang ditentukan oleh properti ExitCodes.
  • Saat tugas keluar dengan kode keluar yang berada dalam rentang yang ditentukan oleh properti ExitCodeRanges.
  • Kasus default, jika tugas keluar dengan kode keluar yang tidak ditentukan oleh ExitCodes atau ExitCodeRanges, atau jika tugas keluar dengan galat pra-proses dan properti PreProcessingError tidak diatur, atau jika tugas gagal dengan galat pengunggahan file dan properti FileUploadError tidak diatur.

Untuk .NET, kondisi ini didefinisikan sebagai properti kelas ExitConditions.

Untuk menentukan tindakan dependensi, atur properti ExitOptions.DependencyAction untuk kondisi keluar ke salah satu dari berikut ini:

  • Memenuhi: Menunjukkan bahwa tugas dependen memenuhi syarat untuk dijalankan jika tugas induk keluar dengan galat yang ditentukan.
  • Blokir: Menunjukkan bahwa tugas dependen tidak memenuhi syarat untuk dijalankan.

Pengaturan default untuk properti DependencyAction adalah Memenuhi untuk kode keluar 0, dan Blokir untuk semua kondisi keluar lainnya.

Cuplikan kode berikut ini mengatur properti DependencyAction untuk tugas induk. Jika tugas induk keluar dengan kesalahan pra-proses, atau dengan kode galat yang ditentukan, tugas dependen diblokir. Jika tugas induk keluar dengan kesalahan non-nol lainnya, tugas dependen memenuhi syarat untuk dijalankan.

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

Sampel kode

Proyek sampel TaskDependencies di GitHub menunjukkan:

  • Cara mengaktifkan dependensi tugas pada pekerjaan.
  • Cara membuat tugas yang bergantung pada tugas lain.
  • Cara menjalankan tugas-tugas tersebut pada kumpulan simpul komputasi.

Langkah berikutnya