Bagikan melalui


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 proses yang merender setiap bingkai film 3D dengan tugas-tugas paralel yang terpisah. Tugas terakhir menggabungkan bingkai yang dirender menjadi film yang utuh 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 cloud.
  • Pekerjaan yang tugas pemrosesan datanya dapat dinyatakan sebagai grafik asiklik terarah (DAG).
  • Proses pra-penyajian dan pasca-penyajian, di mana 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 Ketergantungan

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
Satu lawan satu 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 hingga taskA dan taskB berhasil diselesaikan

Diagram memperlihatkan skenario dependensi tugas satu ke banyak.
Rentang ID Tugas taskD bergantung pada rentang tugas

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

Diagram memperlihatkan skenario dependensi dari rentang ID tugas.

Tips

Anda dapat membuat hubungan banyak ke banyak, seperti di mana tugas C, D, E, dan F masing-masing bergantung pada tugas A dan B. Ini berguna, misalnya, dalam skenario pra-pemrosesan paralel di mana tugas hilir Anda bergantung pada output beberapa tugas upstream.

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

Satu lawan satu

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

Satu ke Banyak

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 gagal jika panjang gabungan ID tugas induk lebih besar dari 64.000 karakter. Untuk menentukan sejumlah besar tugas induk, pertimbangkan untuk menggunakan rentang ID Tugas sebagai gantinya.

Rentang ID Tugas

Dalam ketergantungan pada rentang tugas induk, tugas tergantung 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 Anda menggunakan rentang ID tugas untuk dependensi Anda, hanya tugas dengan ID yang mewakili nilai bilangan bulat yang dipilih oleh rentang. Misalnya, rentang 1..10 memilih tugas 3 dan 7, tetapi tidak 5flamingoes.

Nol di depan tidak signifikan saat mengevaluasi dependensi rentang, sehingga tugas dengan pengidentifikasi string 4, 04, dan 004 berada dalam rentang, karena semuanya diperlakukan sebagai tugas 4, yang pertama selesai 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 Ketergantungan

Secara default, tugas dependen atau sekumpulan 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 setiap kondisi keluar berikut:

  • Setiap kali terjadi kesalahan pra-pemrosesan.
  • Setiap kali terjadi kesalahan unggahan file. Jika tugas keluar dengan kode keluar yang ditentukan melalui exitCodes atau exitCodeRanges, lalu menemukan galat pengunggahan file, tindakan yang ditentukan oleh kode keluar tersebut lebih diutamakan.
  • Setiap kali tugas selesai dengan kode keluar yang ditentukan oleh properti ExitCodes.
  • Setiap kali tugas berakhir dengan kode keluaran yang ada 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 kesalahan pra-pemrosesan dan properti PreProcessingError tidak diatur, atau jika tugas gagal dengan kesalahan 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 opsi berikut:

  • Memenuhi: Menunjukkan bahwa tugas dependen memenuhi syarat untuk dijalankan jika tugas induk keluar dengan galat yang ditentukan.
  • Blok: Menunjukkan bahwa tugas dependen tidak dapat 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-pemrosesan, atau dengan kode kesalahan yang ditentukan, tugas dependen diblokir. Jika tugas induk keluar dengan kesalahan nonzero 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 ketergantungan tugas pada pekerjaan.
  • Cara membuat tugas yang bergantung pada tugas lain.
  • Cara menjalankan tugas-tugas tersebut pada kumpulan simpul komputasi.

Langkah berikutnya