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
Visual Studio 2017 atau yang lebih baru, atau .NET Core SDK untuk Linux, macOS, atau Windows.
Akun Batch dan akun Azure Storage tertaut. Untuk membuat akun ini, lihat panduan mulai cepat Batch untuk portal Azure atau Azure CLI.
Unduh versi ffmpeg yang sesuai untuk kasus penggunaan ke komputer lokal Anda. Tutorial ini dan aplikasi sampel terkait menggunakan versi build penuh Windows 64-bit dari ffmpeg 4.3.1. Untuk tutorial ini, Anda hanya membutuhkan file zip. Anda tidak perlu membuka file zip atau memasangnya secara lokal.
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.
Di portal Azure, klik Akun Batch layanan>lainnya, dan pilih nama akun Batch Anda.
Klik Aplikasi>Tambahkan.
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.
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.)
Pilih Semua layanan>Akun Batch, lalu pilih nama akun Batch Anda.
Untuk melihat kredensial Batch, pilih Kunci. Salin nilai akun Batch, URL, dan Kunci akses primer ke editor teks.
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.
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:
Klik kanan solusi di Penjelajah Solusi dan pilih Bangun Solusi.
Konfirmasi pemulihan paket NuGet apa pun, jika Anda diminta. Jika Anda perlu mengunduh paket yang hilang, pastikan Manajer Paket NuGet terinstal.
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:
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.
- Klik Semua layanan>Akun Storage, lalu klik nama akun penyimpanan Anda.
- Klik Blob>output.
- Klik kanan salah satu file MP3 output, lalu klik Unduh. Ikuti perintah di browser Anda untuk membuka atau menyimpan 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 menggunakan Pustaka Azure.Storage.Blobs untuk .NET. Menggunakan kelas BlobServiceClient yang mengambil referensi ke Uri akun dan mengautentikasi Token seperti DefaultAzureCredential.
// TODO: Replace <storage-account-name> with your actual storage account name
Uri accountUri = new Uri("https://<storage-account-name>.blob.core.windows.net/");
BlobServiceClient blobClient = new BlobServiceClient(accountUri, new DefaultAzureCredential());
Aplikasi ini membuat referensi ke BatchAccountResource melalui ArmClient Resource manager untuk membuat kumpulan di layanan Batch. Klien Arm dalam sampel menggunakan autentikasi DefaultAzureCredential .
ArmClient _armClient = new ArmClient(new DefaultAzureCredential());
var batchAccountIdentifier = ResourceIdentifier.Parse(BatchAccountResourceID);
BatchAccountResource batchAccount = await _armClient.GetBatchAccountResource(batchAccountIdentifier).GetAsync();
Aplikasi ini membuat objek BatchClient untuk membuat dan pekerjaan dan tugas di layanan Batch. Klien Batch dalam sampel menggunakan autentikasi DefaultAzureCredential .
// TODO: Replace <batch-account-name> with your actual storage account name
Uri batchUri = new Uri("https://<batch-account-name>t.eastus.batch.azure.com");
BatchClient _batchClient = new BatchClient(batchUri, new DefaultAzureCredential());
Mengunggah file input
Aplikasi ini meneruskan objek blobServerClient
ke metode CreateContainerIfNotExist
untuk membuat kontainer penyimpanan untuk file input (format MP4) dan kontainer untuk output tugas.
CreateContainerIfNotExist(blobClient, inputContainerName);
CreateContainerIfNotExist(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 kumpulanResourceFile
objek dan panggilanUploadResourceFileToContainerAsync
internal untuk mengunggah setiap file yang diteruskan dalaminputFilePaths
parameter . -
UploadResourceFileToContainerAsync
: Mengunggah setiap file sebagai blob ke kontainer input. Setelah mengunggah file, file mendapatkan tanda tangan akses bersama (SAS) untuk blob dan mengembalikanResourceFile
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 BatchAccountResource.GetBatchAccountPools(). Metode CreateOrUpdateAsync untuk mengatur jumlah simpul, ukuran VM, dan konfigurasi kumpulan. Di sini, objek BatchVmConfiguration menentukan BatchImageReference ke gambar Windows Server yang diterbitkan dalam Marketplace Azure. 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.
var credential = new DefaultAzureCredential();
ArmClient _armClient = new ArmClient(credential);
var batchAccountIdentifier = ResourceIdentifier.Parse(BatchAccountResourceID);
BatchAccountResource batchAccount = await _armClient.GetBatchAccountResource(batchAccountIdentifier).GetAsync();
BatchAccountPoolCollection collection = batchAccount.GetBatchAccountPools();
if (collection.Exists(poolId) == false)
{
var poolName = poolId;
var imageReference = new BatchImageReference()
{
Publisher = "MicrosoftWindowsServer",
Offer = "WindowsServer",
Sku = "2019-datacenter-smalldisk",
Version = "latest"
};
string nodeAgentSku = "batch.node.windows amd64";
ArmOperation<BatchAccountPoolResource> armOperation = await batchAccount.GetBatchAccountPools().CreateOrUpdateAsync(
WaitUntil.Completed, poolName, new BatchAccountPoolData()
{
VmSize = "Standard_DS1_v2",
DeploymentConfiguration = new BatchDeploymentConfiguration()
{
VmConfiguration = new BatchVmConfiguration(imageReference, nodeAgentSku)
},
ScaleSettings = new BatchAccountPoolScaleSettings()
{
FixedScale = new BatchAccountFixedScaleSettings()
{
TargetDedicatedNodes = DedicatedNodeCount,
TargetLowPriorityNodes = LowPriorityNodeCount
}
},
Identity = new ManagedServiceIdentity(ManagedServiceIdentityType.UserAssigned)
{
UserAssignedIdentities =
{
[new ResourceIdentifier(ManagedIdentityId)] = new Azure.ResourceManager.Models.UserAssignedIdentity(),
},
},
ApplicationPackages =
{
new Azure.ResourceManager.Batch.Models.BatchApplicationPackageReference(new ResourceIdentifier(appPackageResourceID))
{
Version = appPackageVersion,
}
},
});
BatchAccountPoolResource pool = armOperation.Value;
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.CreateJobAsync untuk membuat pekerjaan di kumpulan Anda.
BatchJobCreateContent batchJobCreateContent = new BatchJobCreateContent(jobId, new BatchPoolInfo { PoolId = poolId });
await batchClient.CreateJobAsync(batchJobCreateContent);
Membuat tugas
Sampel membuat tugas dalam pekerjaan dengan panggilan ke AddTasksAsync
metode , yang membuat daftar objek BatchTask . Setiap BatchTask
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. 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 CreateTaskAsync , yang mengantrekannya untuk dijalankan pada simpul 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<BatchTaskCreateContent> tasks = new List<BatchTaskCreateContent>();
for (int i = 0; i < inputFiles.Count; i++)
{
// Assign a task ID for each iteration
string taskId = String.Format("Task{0}", i);
// Define task command line to convert the video format from MP4 to MP3 using ffmpeg.
// Note that ffmpeg syntax specifies the format as the file extension of the input file
// and the output file respectively. In this case inputs are MP4.
string appPath = String.Format("%AZ_BATCH_APP_PACKAGE_{0}#{1}%", appPackageId, appPackageVersion);
string inputMediaFile = inputFiles[i].StorageContainerUrl;
string outputMediaFile = String.Format("{0}{1}",
System.IO.Path.GetFileNameWithoutExtension(inputMediaFile),
".mp3");
string taskCommandLine = String.Format("cmd /c {0}\\ffmpeg-4.3.1-2020-11-08-full_build\\bin\\ffmpeg.exe -i {1} {2}", appPath, inputMediaFile, outputMediaFile);
// Create a batch task (with the task ID and command line) and add it to the task list
BatchTaskCreateContent batchTaskCreateContent = new BatchTaskCreateContent(taskId, taskCommandLine);
batchTaskCreateContent.ResourceFiles.Add(inputFiles[i]);
// Task output file will be uploaded to the output container in Storage.
// TODO: Replace <storage-account-name> with your actual storage account name
OutputFileBlobContainerDestination outputContainer = new OutputFileBlobContainerDestination("https://<storage-account-name>.blob.core.windows.net/output/" + outputMediaFile)
{
IdentityReference = inputFiles[i].IdentityReference,
};
OutputFile outputFile = new OutputFile(outputMediaFile,
new OutputFileDestination() { Container = outputContainer },
new OutputFileUploadConfig(OutputFileUploadCondition.TaskSuccess));
batchTaskCreateContent.OutputFiles.Add(outputFile);
tasks.Add(batchTaskCreateContent);
}
// Call BatchClient.CreateTaskCollectionAsync() to add the tasks as a collection rather than making a
// separate call for each. Bulk task submission helps to ensure efficient underlying API
// calls to the Batch service.
await batchClient.CreateTaskCollectionAsync(jobId, new BatchTaskGroup(tasks));
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. BatchClient memiliki metode untuk menghapus pekerjaan DeleteJobAsync dan menghapus kumpulan DeletePoolAsync, 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.