Tutorial: Menjalankan beban kerja paralel Azure Batch menggunakan .NET API

Gunakan Azure Batch untuk menjalankan tugas batch komputasi paralel dan kinerja tinggi (HPC) skala besar secara efisien di Azure. Tutorial ini memandu contoh C# menjalankan beban kerja paralel menggunakan Batch. Anda mempelajari alur kerja aplikasi Batch umum dan cara berinteraksi secara terprogram dengan sumber daya Batch dan Storage.

  • Tambahkan paket aplikasi ke akun Batch Anda.
  • Autentikasi dengan akun Batch dan Storage.
  • Unggah file input ke Storage.
  • Buat kumpulan simpul komputasi untuk menjalankan aplikasi.
  • Buat pekerjaan dan tugas untuk memproses file input.
  • Pantau eksekusi tugas.
  • Mengambil file output.

Dalam tutorial ini, Anda mengonversi file media MP4 ke format MP3, secara paralel, dengan menggunakan alat sumber terbuka ffmpeg .

Jika Anda tidak memiliki Langganan Azure, buat Akun gratis Azure sebelum memulai.

Prasyarat

Masuk ke Azure

Masuk ke portal Azure.

Menambahkan paket aplikasi

Gunakan portal Microsoft Azure untuk menambahkan ffmpeg ke akun Batch Anda sebagai paket aplikasi. Paket aplikasi membantu Anda mengelola aplikasi tugas dan penerapannya ke node komputasi dalam kumpulan Anda.

  1. Di portal Azure, klik Akun Batch layanan>lainnya, dan pilih nama akun Batch Anda.

  2. Klik Aplikasi>Tambahkan.

    Screenshot of the Applications section of the batch account.

  3. Masukkan ffmpeg di bidang Id Aplikasi, dan versi paket 4.3.1 di bidang Versi . Pilih file zip ffmpeg yang Anda unduh, lalu pilih Kirim. Paket aplikasi ffmpeg ditambahkan ke akun Batch Anda.

    Screenshot of the ID and version fields in the Add application section.

Mendapatkan kredensial akun

Untuk contoh ini, Anda harus memberikan kredensial untuk akun Batch dan Storage Anda. Cara mudah untuk mendapatkan kredensial yang diperlukan ada di portal Microsoft Azure. (Anda juga bisa mendapatkan kredensial ini menggunakan Azure API atau alat baris perintah.)

  1. Pilih Semua layanan>Akun Batch, lalu pilih nama akun Batch Anda.

  2. Untuk melihat kredensial Batch, pilih Kunci. Salin nilai akun Batch, URL, dan Kunci akses primer ke editor teks.

  3. Untuk melihat nama dan kunci akun Storage, pilih Akun Storage. Salin nilai nama akun Storage dan Key1 ke editor teks.

Unduh dan jalankan aplikasi sampel

Mengunduh aplikasi sampel

Unduh atau klon aplikasi contoh dari GitHub. Untuk mengkloning repo aplikasi sampel dengan klien Git, gunakan perintah berikut:

git clone https://github.com/Azure-Samples/batch-dotnet-ffmpeg-tutorial.git

Navigasi ke direktori yang berisi file solusi Visual Studio BatchDotNetFfmpegTutorial.sln.

Buka file solusi di Visual Studio, dan perbarui string kredensial di Program.cs dengan nilai yang Anda peroleh untuk akun Anda. Contoh:

// Batch account credentials
private const string BatchAccountName = "yourbatchaccount";
private const string BatchAccountKey  = "xxxxxxxxxxxxxxxxE+yXrRvJAqT9BlXwwo1CwF+SwAYOxxxxxxxxxxxxxxxx43pXi/gdiATkvbpLRl3x14pcEQ==";
private const string BatchAccountUrl  = "https://yourbatchaccount.yourbatchregion.batch.azure.com";

// Storage account credentials
private const string StorageAccountName = "yourstorageaccount";
private const string StorageAccountKey  = "xxxxxxxxxxxxxxxxy4/xxxxxxxxxxxxxxxxfwpbIC5aAWA8wDu+AFXZB827Mt9lybZB1nUcQbQiUrkPtilK5BQ==";

Catatan

Untuk menyederhanakan contoh, informasi masuk akun Batch dan Storage muncul dalam teks yang jelas. Dalam praktiknya, sebaiknya batasi akses ke informasi masuk dan rujuk informasi masuk tersebut dalam kode Anda menggunakan variabel lingkungan atau file konfigurasi. Misalnya, lihat repositori sampel kode Azure Batch.

Selain itu, pastikan bahwa referensi paket aplikasi ffmpeg dalam solusi sesuai dengan pengidentifikasi dan versi paket ffmpeg yang Anda unggah ke akun Azure Batch Anda. Misalnya, ffmpeg dan 4.3.1.

const string appPackageId = "ffmpeg";
const string appPackageVersion = "4.3.1";

Membuat dan menjalankan proyek sampel

Buat dan jalankan aplikasi di Visual Studio, atau di baris perintah dengan perintah dotnet build dan dotnet run. Setelah menjalankan aplikasi, tinjau kode untuk mempelajari apa yang dilakukan setiap bagian aplikasi. Misalnya, di Visual Studio:

  1. Klik kanan solusi di Penjelajah Solusi dan pilih Bangun Solusi.

  2. Konfirmasi pemulihan paket NuGet apa pun, jika Anda diminta. Jika Anda perlu mengunduh paket yang hilang, pastikan Manajer Paket NuGet terinstal.

  3. Jalankan solusi tersebut. Saat Anda menjalankan aplikasi sampel, output konsol serupa dengan yang berikut ini. Selama eksekusi, Anda mengalami jeda pada Monitoring all tasks for 'Completed' state, timeout in 00:30:00... ketika node komputasi kumpulan dimulai.

Sample start: 11/19/2018 3:20:21 PM

Container [input] created.
Container [output] created.
Uploading file LowPriVMs-1.mp4 to container [input]...
Uploading file LowPriVMs-2.mp4 to container [input]...
Uploading file LowPriVMs-3.mp4 to container [input]...
Uploading file LowPriVMs-4.mp4 to container [input]...
Uploading file LowPriVMs-5.mp4 to container [input]...
Creating pool [WinFFmpegPool]...
Creating job [WinFFmpegJob]...
Adding 5 tasks to job [WinFFmpegJob]...
Monitoring all tasks for 'Completed' state, timeout in 00:30:00...
Success! All tasks completed successfully within the specified timeout period.
Deleting container [input]...

Sample end: 11/19/2018 3:29:36 PM
Elapsed time: 00:09:14.3418742

Buka akun Batch Anda di portal Microsoft Azure untuk memantau kumpulan, node komputasi, pekerjaan, dan tugas. Misalnya, untuk melihat peta panas node komputasi di kumpulan Anda, klik Kumpulan>WinFFmpegPool.

Saat tugas berjalan, peta panas serupa dengan yang berikut ini:

Screenshot of the pool heat map in the Azure portal.

Waktu eksekusi umum adalah sekitar 10 menit ketika Anda menjalankan aplikasi dalam konfigurasi defaultnya. Pembuatan kumpulan membutuhkan waktu paling lama.

Mengambil file output

Anda dapat menggunakan portal Microsoft Azure untuk mengunduh file MP3 output yang dihasilkan oleh tugas ffmpeg.

  1. Klik Semua layanan>Akun Storage, lalu klik nama akun penyimpanan Anda.
  2. Klik Blob>output.
  3. Klik kanan salah satu file MP3 output, lalu klik Unduh. Ikuti perintah di browser Anda untuk membuka atau menyimpan file.

Download output file

Meskipun tidak ditampilkan dalam sampel ini, Anda juga dapat mengunduh file secara terprogram dari node komputasi atau dari kontainer penyimpanan.

Mengulas kode

Bagian berikut ini memecah aplikasi sampel ke dalam langkah-langkah yang dijalankan untuk memproses beban kerja di layanan Batch. Lihat file Program.cs dalam solusi saat Anda membaca sisa artikel ini, karena tidak setiap baris kode dalam sampel dibahas.

Mengautentikasi klien Blob dan Batch

Untuk berinteraksi dengan akun penyimpanan tertaut, aplikasi ini menggunakan Pustaka Klien Azure Storage untuk .NET. Ini membuat referensi ke akun dengan CloudStorageAccount, mengautentikasi menggunakan autentikasi kunci bersama. Lalu, membuat CloudBlobClient.

// Construct the Storage account connection string
string storageConnectionString = String.Format("DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}",
                                StorageAccountName, StorageAccountKey);

// Retrieve the storage account
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(storageConnectionString);

CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

Aplikasi ini membuat objek BatchClient untuk membuat dan mengelola kumpulan, pekerjaan, dan tugas dalam layanan Batch. Klien Batch dalam sampel ini menggunakan autentikasi kunci bersama. Batch juga mendukung autentikasi melalui ID Microsoft Entra untuk mengautentikasi pengguna individual atau aplikasi tanpa pengawas.

BatchSharedKeyCredentials sharedKeyCredentials = new BatchSharedKeyCredentials(BatchAccountUrl, BatchAccountName, BatchAccountKey);

using (BatchClient batchClient = BatchClient.Open(sharedKeyCredentials))
...

Mengunggah file input

Aplikasi ini meneruskan objek blobClient ke metode CreateContainerIfNotExistAsync untuk membuat kontainer penyimpanan untuk file input (format MP4) dan kontainer untuk output tugas.

CreateContainerIfNotExistAsync(blobClient, inputContainerName);
CreateContainerIfNotExistAsync(blobClient, outputContainerName);

Kemudian, file diunggah ke kontainer input dari folder InputFiles lokal. File dalam penyimpanan didefinisikan sebagai objek Batch ResourceFile yang nantinya dapat diunduh Batch ke node komputasi.

Dua metode dalam Program.cs terlibat dalam mengunggah file:

  • UploadFilesToContainerAsync: Mengembalikan kumpulan ResourceFile objek dan panggilan UploadResourceFileToContainerAsync internal untuk mengunggah setiap file yang diteruskan dalam inputFilePaths parameter .
  • UploadResourceFileToContainerAsync: Mengunggah setiap file sebagai blob ke kontainer input. Setelah mengunggah file, file mendapatkan tanda tangan akses bersama (SAS) untuk blob dan mengembalikan ResourceFile objek untuk mewakilinya.
string inputPath = Path.Combine(Environment.CurrentDirectory, "InputFiles");

List<string> inputFilePaths = new List<string>(Directory.GetFileSystemEntries(inputPath, "*.mp4",
    SearchOption.TopDirectoryOnly));

List<ResourceFile> inputFiles = await UploadFilesToContainerAsync(
  blobClient,
  inputContainerName,
  inputFilePaths);

Untuk detail tentang cara mengunggah file sebagai blob ke akun penyimpanan dengan .NET, lihat Mengunggah, mengunduh, dan mencantumkan gumpalan menggunakan .NET.

Membuat kumpulan simpul komputasi

Selanjutnya, sampel membuat kumpulan node komputasi di akun Batch dengan panggilan ke CreatePoolIfNotExistAsync. Metode yang ditentukan ini menggunakan BatchClient.PoolOperations.CreatePool untuk mengatur jumlah node, ukuran VM, dan konfigurasi kumpulan. Di sini, objek VirtualMachineConfiguration menentukan ImageReference ke citra Windows Server yang diterbitkan di Azure Marketplace. Batch mendukung berbagai citra VM di Azure Marketplace, serta citra VM kustom.

Jumlah node dan ukuran VM diatur menggunakan konstanta yang ditentukan. Batch mendukung node khusus dan node Spot, dan Anda dapat menggunakan salah satu atau keduanya di kumpulan Anda. Simpul khusus dicadangkan untuk kumpulan Anda. Node Spot ditawarkan dengan harga lebih murah dari kelebihan kapasitas mesin virtual di Azure. Node Spot tidak tersedia jika Azure tidak memiliki kapasitas yang cukup. Sampel secara default membuat kumpulan yang berisi hanya 5 node Spot dengan ukuran Standard_A1_v2.

Catatan

Pastikan Anda memeriksa kuota node Anda. Lihat Kuota dan batas layanan Batch untuk petunjuk tentang cara membuat permintaan kuota.

Aplikasi ffmpeg diterapkan ke node komputasi dengan menambahkan ApplicationPackageReference ke konfigurasi kumpulan.

Metode CommitAsync mengirimkan kumpulan ke layanan Batch.

ImageReference imageReference = new ImageReference(
    publisher: "MicrosoftWindowsServer",
    offer: "WindowsServer",
    sku: "2016-Datacenter-smalldisk",
    version: "latest");

VirtualMachineConfiguration virtualMachineConfiguration =
    new VirtualMachineConfiguration(
    imageReference: imageReference,
    nodeAgentSkuId: "batch.node.windows amd64");

pool = batchClient.PoolOperations.CreatePool(
    poolId: poolId,
    targetDedicatedComputeNodes: DedicatedNodeCount,
    targetLowPriorityComputeNodes: LowPriorityNodeCount,
    virtualMachineSize: PoolVMSize,
    virtualMachineConfiguration: virtualMachineConfiguration);

pool.ApplicationPackageReferences = new List<ApplicationPackageReference>
    {
    new ApplicationPackageReference {
    ApplicationId = appPackageId,
    Version = appPackageVersion}};

await pool.CommitAsync();  

Membuat pekerjaan

Tugas Batch menentukan kumpulan untuk menjalankan tugas dan pengaturan opsional seperti prioritas dan jadwal untuk pekerjaan. Sampel membuat pekerjaan dengan panggilan ke CreateJobAsync. Metode yang ditentukan ini menggunakan metode BatchClient.JobOperations.CreateJob untuk membuat pekerjaan di kumpulan Anda.

Metode CommitAsync mengirimkan pekerjaan ke layanan Batch. Awalnya pekerjaan tersebut tidak memiliki tugas.

CloudJob job = batchClient.JobOperations.CreateJob();
job.Id = JobId;
job.PoolInformation = new PoolInformation { PoolId = PoolId };

await job.CommitAsync();

Buat tugas

Sampel membuat tugas dalam pekerjaan dengan panggilan ke metode AddTasksAsync, yang membuat daftar objek CloudTask. Setiap CloudTask menjalankan ffmpeg untuk memproses objek ResourceFile input menggunakan properti CommandLine. ffmpeg telah diinstal sebelumnya pada setiap node ketika kumpulan dibuat. Di sini, baris perintah menjalankan ffmpeg untuk mengonversi setiap file MP4 (video) input ke file MP3 (audio).

Sampel membuat objek OutputFile untuk file MP3 setelah menjalankan baris perintah. Setiap file output tugas (satu, dalam kasus ini) diunggah ke kontainer di akun penyimpanan tertaut, menggunakan properti OutputFiles tugas. Sebelumnya dalam sampel kode, URL tanda tangan akses bersama (outputContainerSasUrl) diperoleh untuk memberikan akses tulis ke kontainer output. Perhatikan kondisi yang ditetapkan pada objek outputFile. File output dari tugas hanya diunggah ke kontainer setelah tugas berhasil diselesaikan (OutputFileUploadCondition.TaskSuccess). Lihat sampel kode lengkap di GitHub untuk detail implementasi lebih lanjut.

Kemudian, sampel menambahkan tugas ke pekerjaan dengan metode AddTaskAsync, yang mengurutkan tugas untuk berjalan pada node komputasi.

Ganti jalur file yang dapat dieksekusi dengan nama versi yang Anda unduh. Kode sampel ini menggunakan contoh ffmpeg-4.3.1-2020-11-08-full_build.

 // Create a collection to hold the tasks added to the job.
List<CloudTask> tasks = new List<CloudTask>();

for (int i = 0; i < inputFiles.Count; i++)
{
    string taskId = String.Format("Task{0}", i);

    // Define task command line to convert each input file.
    string appPath = String.Format("%AZ_BATCH_APP_PACKAGE_{0}#{1}%", appPackageId, appPackageVersion);
    string inputMediaFile = inputFiles[i].FilePath;
    string outputMediaFile = String.Format("{0}{1}",
        System.IO.Path.GetFileNameWithoutExtension(inputMediaFile),
        ".mp3");
    string taskCommandLine = String.Format("cmd /c {0}\\ffmpeg-4.3.1-2020-09-21-full_build\\bin\\ffmpeg.exe -i {1} {2}", appPath, inputMediaFile, outputMediaFile);

    // Create a cloud task (with the task ID and command line)
    CloudTask task = new CloudTask(taskId, taskCommandLine);
    task.ResourceFiles = new List<ResourceFile> { inputFiles[i] };

    // Task output file
    List<OutputFile> outputFileList = new List<OutputFile>();
    OutputFileBlobContainerDestination outputContainer = new OutputFileBlobContainerDestination(outputContainerSasUrl);
    OutputFile outputFile = new OutputFile(outputMediaFile,
       new OutputFileDestination(outputContainer),
       new OutputFileUploadOptions(OutputFileUploadCondition.TaskSuccess));
    outputFileList.Add(outputFile);
    task.OutputFiles = outputFileList;
    tasks.Add(task);
}

// Add tasks as a collection
await batchClient.JobOperations.AddTaskAsync(jobId, tasks);
return tasks

Memantau tugas

Ketika Batch menambahkan tugas ke pekerjaan, layanan secara otomatis mengurutkan dan menjadwalkannya untuk dieksekusi pada node komputasi dalam kumpulan terkait. Berdasarkan pengaturan yang Anda tentukan, Batch menangani semua antrean tugas, penjadwalan, upaya untuk mencoba kembali, dan tugas administrasi tugas lainnya.

Ada banyak pendekatan untuk memantau eksekusi tugas. Sampel ini mendefinisikann metode MonitorTasks untuk melaporkan hanya pada penyelesaian dan kegagalan tugas atau status keberhasilan. Kode MonitorTasks menentukan ODATADetailLevel untuk secara efisien memilih hanya informasi minimal tentang tugas. Kemudian, kode tersebut membuat TaskStateMonitor, yang menyediakan utilitas pembantu untuk memantau status tugas. Dalam MonitorTasks, sampel menunggu semua tugas untuk mencapai TaskState.Completed dalam batas waktu. Kemudian mengakhiri pekerjaan dan laporan pada tugas apa pun yang selesai tetapi mungkin mengalami kegagalan seperti kode keluar bukan nol.

TaskStateMonitor taskStateMonitor = batchClient.Utilities.CreateTaskStateMonitor();
try
{
    await taskStateMonitor.WhenAll(addedTasks, TaskState.Completed, timeout);
}
catch (TimeoutException)
{
    batchClient.JobOperations.TerminateJob(jobId);
    Console.WriteLine(incompleteMessage);
    return false;
}
batchClient.JobOperations.TerminateJob(jobId);
 Console.WriteLine(completeMessage);
...

Membersihkan sumber daya

Setelah menjalankan tugas, aplikasi secara otomatis menghapus kontainer penyimpanan input yang dibuatnya, dan memberi Anda opsi untuk menghapus kumpulan dan pekerjaan Batch. Kelas JobOperations dan PoolOperations BatchClient memiliki metode penghapusan yang sesuai, yang dipanggil jika Anda mengonfirmasi penghapusan. Meskipun Anda tidak perlu membayar untuk pekerjaan dan tugas tersebut, node komputasi akan dikenakan biaya. Oleh karenanya, kami menyarankan Anda untuk mengalokasikan kumpulan hanya jika diperlukan. Saat Anda menghapus kumpulan, semua output tugas di simpul akan dihapus. Akan tetapi, file output tetap berada di akun penyimpanan.

Saat tidak lagi diperlukan, hapus grup sumber daya, akun Batch, dan akun penyimpanan. Untuk melakukannya di portal Microsoft Azure, pilih grup sumber daya untuk akun Batch dan klik Hapus grup sumber daya.

Langkah berikutnya

Dalam tutorial ini, Anda mempelajari cara:

  • Tambahkan paket aplikasi ke akun Batch Anda.
  • Autentikasi dengan akun Batch dan Storage.
  • Unggah file input ke Storage.
  • Buat kumpulan simpul komputasi untuk menjalankan aplikasi.
  • Buat pekerjaan dan tugas untuk memproses file input.
  • Pantau eksekusi tugas.
  • Mengambil file output.

Untuk contoh selengkapnya tentang menggunakan .NET API untuk menjadwalkan dan memproses beban kerja Batch, lihat sampel Batch C# di GitHub.