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 frame yang dirender menjadi film utuh hanya setelah semua frame 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.

Artikel ini menjelaskan cara mengonfigurasi dependensi tugas dengan menggunakan pustaka .NET Batch. Ini menunjukkan cara mengaktifkan dependensi tugas pada pekerjaan Anda, cara mengonfigurasi tugas dengan dependensi, dan cara menentukan tindakan dependensi untuk menjalankan tugas dependen jika induk gagal. Ini juga menjelaskan 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. Dalam Batch .NET, aktifkan fitur tersebut pada BatchJobCreateOptions Anda dengan mengatur properti UsesTaskDependencies ke true:

BatchJobCreateOptions unboundJob = new BatchJobCreateOptions("job001", new BatchPoolInfo() { PoolId = "pool001" })
{
    // IMPORTANT: This is REQUIRED for using task dependencies.
    UsesTaskDependencies = true
};
await batchClient.CreateJobAsync(unboundJob);

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. Dalam Batch .NET, konfigurasikan properti BatchTaskCreateOptions.DependsOn dengan instans kelas BatchTaskDependencies:

// Task 'Flowers' depends on completion of both 'Rain' and 'Sun'
// before it is run.
BatchTaskCreateOptions flowers = new BatchTaskCreateOptions("Flowers", "cmd.exe /c echo Flowers")
{
    DependsOn = new BatchTaskDependencies()
    {
        TaskIds = { "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 .NET Batch, ini berarti nilai properti BatchTask.StateCompleted dan nilai properti batchTask BatchTaskExecutionInfo.ExitCode 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, atur BatchTaskDependencies.TaskIds dengan SATU ID tugas saat Anda mengisi properti BatchTaskCreateOptions.DependsOn .

IList<BatchTaskCreateOptions> tasks = new List<BatchTaskCreateOptions>
{
    // Task 'taskA' doesn't depend on any other tasks
    new BatchTaskCreateOptions("taskA", "cmd.exe /c echo taskA"),

    // Task 'taskB' depends on completion of task 'taskA'
    new BatchTaskCreateOptions("taskB", "cmd.exe /c echo taskB")
    {
        DependsOn = new BatchTaskDependencies() { TaskIds = { "taskA" } }
    },
};

Satu ke Banyak

Dalam hubungan satu ke banyak, tugas bergantung pada penyelesaian beberapa tugas induk. Untuk membuat dependensi, isi BatchTaskDependencies.TaskIds dengan ID tugas induk saat Anda mengisi properti BatchTaskCreateOptions.DependsOn .

IList<BatchTaskCreateOptions> tasks = new List<BatchTaskCreateOptions>
{
    // 'Rain' and 'Sun' don't depend on any other tasks
    new BatchTaskCreateOptions("Rain", "cmd.exe /c echo Rain"),
    new BatchTaskCreateOptions("Sun", "cmd.exe /c echo Sun"),

    // Task 'Flowers' depends on completion of both 'Rain' and 'Sun'
    // before it is run.
    new BatchTaskCreateOptions("Flowers", "cmd.exe /c echo Flowers")
    {
        DependsOn = new BatchTaskDependencies() { TaskIds = { "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, isi BatchTaskDependencies.TaskIdRanges dengan BatchTaskIdRange saat Anda mengisi properti BatchTaskCreateOptions.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 , 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.

IList<BatchTaskCreateOptions> tasks = new List<BatchTaskCreateOptions>
{
    // 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 BatchTaskCreateOptions("1", "cmd.exe /c echo 1"),
    new BatchTaskCreateOptions("2", "cmd.exe /c echo 2"),
    new BatchTaskCreateOptions("3", "cmd.exe /c echo 3"),

    // Task 4 depends on a range of tasks, 1 through 3
    new BatchTaskCreateOptions("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 BatchTaskIdRange,
        // but their ids (above) are string representations of the ids.
        DependsOn = new BatchTaskDependencies()
        {
            TaskIdRanges = { new BatchTaskIdRange(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.

IList<BatchTaskCreateOptions> tasks = new List<BatchTaskCreateOptions>
{
    // Task A is the parent task.
    new BatchTaskCreateOptions("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 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).
            DefaultExitOptions = new ExitOptions()
            {
                DependencyAction = DependencyAction.Satisfy
            }
        }
    },
    // Task B depends on task A. Whether it becomes eligible to run depends on how task A exits.
    new BatchTaskCreateOptions("B", "cmd.exe /c echo B")
    {
        DependsOn = new BatchTaskDependencies() { TaskIds = { "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