Batch havuzlarında Linux işlem düğümleri sağlama

Hem Linux hem de Windows sanal makinelerinde paralel işlem iş yüklerini çalıştırmak için Azure Batch'i kullanabilirsiniz. Bu makale, Batch hizmetinde Linux işlem düğümü havuzlarının hem Batch Python hem de Azure.Compute.Batch istemci kitaplıkları kullanılarak nasıl oluşturulacağını ayrıntılı olarak açıklar.

Sanal Makine Yapılandırması

Batch'te işlem düğümleri havuzu oluşturduğunuzda, düğüm boyutunu ve işletim sistemini seçebileceğiniz iki seçeneğiniz vardır: Cloud Services Yapılandırması ve Sanal Makine Yapılandırması. Sanal Makine Yapılandırma havuzları, Linux veya Windows görüntülerinden oluşturulabilen Azure VM'lerinden oluşur. Sanal Makine Yapılandırması ile bir havuz oluşturduğunuzda, kullanılabilir bir işlem düğümü boyutu, düğümlere yüklenecek sanal makine görüntüsü başvurusu ve Batch düğüm aracısı SKU'su (her düğümde çalışan ve düğüm ile Batch hizmeti arasında bir arabirim sağlayan bir program) belirtirsiniz.

Sanal makine görüntü başvurusu

Batch hizmeti, Sanal Makine Yapılandırması'nda işlem düğümleri sağlamak için sanal makine ölçek kümelerini kullanır. Azure Marketi'nden bir görüntü belirtebilir veya özel bir görüntü hazırlamak için Azure İşlem Galerisi'ni kullanabilirsiniz.

Bir sanal makine görüntüsü başvurusu oluştururken aşağıdaki özellikleri belirtmeniz gerekir:

Görüntü referansı özelliği Örnek
Yayımlayıcı kanonik
Teklif 0001-com-ubuntu-server-focal
SKU 20_04-lts
Sürüm latest

İpucu

Bu özellikler ve Azure Marketi görüntülerinin nasıl belirtileceği hakkında daha fazla bilgiyi Azure CLI ile Azure Marketi'nde Linux VM görüntülerini bulma başlıklı makalede edinebilirsiniz. Bazı Market görüntülerinin şu anda Batch ile uyumlu olmadığını unutmayın.

Sanal makine görüntülerinin listesi

Tüm Marketplace imajları şu anda mevcut olan Batch düğüm aracılarıyla uyumlu değildir. Batch hizmeti için desteklenen tüm Marketplace sanal makine görüntülerini ve bunlara karşılık gelen düğüm aracısı SKU'larını listelemek için list_supported_images (Python), BatchClient.GetSupportedImagesAsync (Azure.Compute.Batch) veya başka bir dildeki SDK'daki karşılık gelen API'yi kullanın.

Düğüm aracısı SKU’su

Batch düğümü aracısı, havuzdaki her düğümde çalışan ve düğüm ile Batch hizmeti arasında komut ve denetim arabirimi sağlayan bir programdır. Farklı işletim sistemleri için düğüm aracısının SKU'lar olarak bilinen farklı uygulamaları vardır. Esasen, bir Sanal Makine Yapılandırması oluşturduğunuzda, önce sanal makine görüntüsü başvurusunu, ardından da görüntüye yüklenecek düğüm aracısını belirtirsiniz. Genellikle her düğüm aracısı SKU'su birden çok sanal makine görüntüsüyle uyumludur. Desteklenen düğüm aracısı SKU'larını ve sanal makine görüntüsü uyumluluklarını görüntülemek için Azure Batch CLI komutunu kullanabilirsiniz:

az batch pool supported-images list

Daha fazla bilgi için Hesap - Desteklenen Görüntüleri Listele - REST API (Azure Batch Service) | Microsoft Docs.

Linux havuzu oluşturma: Batch Python

Aşağıdaki kod parçacığında, Ubuntu Server işlem düğümleri havuzu oluşturmak üzere Python için Microsoft Azure Batch İstemci Kitaplığı'nın nasıl kullanılacağına ilişkin bir örnek gösterilmektedir. Batch Python modülü hakkında daha fazla ayrıntı için başvuru belgelerini görüntüleyin.

Bu kod parçacığı açıkça bir BatchVmImageReference oluşturur ve özelliklerinin her birini (yayımcı, teklif, SKU, sürüm) belirtir. Ancak üretim kodunda, çalışma zamanındaki kullanılabilir görüntü ve düğüm aracısı SKU bileşimleri arasından seçim yapmak için list_supported_images yöntemini kullanmanızı öneririz.

# Import the required modules from the
# Azure Batch Client Library for Python
from azure.batch import BatchClient, models
from azure.core.credentials import AzureNamedKeyCredential

# Specify Batch account credentials
account = "<batch-account-name>"
key = "<batch-account-key>"
account_endpoint = "<batch-account-url>"

# Pool settings
pool_id = "LinuxNodesSamplePoolPython"
vm_size = "STANDARD_D2_V3"
node_count = 1

# Initialize the Batch client
creds = AzureNamedKeyCredential(account, key)
client = BatchClient(endpoint=account_endpoint, credential=creds)

# Configure the start task for the pool
start_task = models.BatchStartTask(
    command_line="printenv AZ_BATCH_NODE_STARTUP_DIR",
    user_identity=models.UserIdentity(
        auto_user=models.AutoUserSpecification(
            elevation_level=models.ElevationLevel.ADMIN,
            scope=models.AutoUserScope.POOL,
        )
    ),
)

# Create an ImageReference which specifies the Marketplace
# virtual machine image to install on the nodes
ir = models.BatchVmImageReference(
    publisher="canonical",
    offer="0001-com-ubuntu-server-focal",
    sku="20_04-lts",
    version="latest")

# Create the VirtualMachineConfiguration, specifying
# the VM image reference and the Batch node agent
# to install on the node
vmc = models.VirtualMachineConfiguration(
    image_reference=ir,
    node_agent_sku_id="batch.node.ubuntu 20.04")

# Create the unbound pool
new_pool = models.BatchPoolCreateOptions(
    id=pool_id,
    vm_size=vm_size,
    target_dedicated_nodes=node_count,
    virtual_machine_configuration=vmc,
    start_task=start_task,
)

# Create pool in the Batch service
client.create_pool(pool=new_pool)

Daha önce belirtildiği gibi, şu anda desteklenen düğüm aracısı/Market görüntü birleşimleri arasından dinamik olarak seçim yapmak için list_supported_images yöntemini kullanmanızı öneririz ( batchvmImageReference'ı açıkça oluşturmak yerine). Aşağıdaki Python kod parçacığında bu yöntemin nasıl kullanılacağı gösterilmektedir.

# Get the list of supported images from the Batch service
images = list(client.list_supported_images())

# Obtain the desired image reference
image = None
for img in images:
  if (img.image_reference.publisher.lower() == "canonical" and
        img.image_reference.offer.lower() == "0001-com-ubuntu-server-focal" and
        img.image_reference.sku.lower() == "20_04-lts"):
    image = img
    break

if image is None:
  raise RuntimeError('invalid image reference for desired configuration')

# Create the VirtualMachineConfiguration, specifying the VM image
# reference and the Batch node agent to be installed on the node
vmc = models.VirtualMachineConfiguration(
    image_reference=image.image_reference,
    node_agent_sku_id=image.node_agent_sku_id)

Linux havuzu oluşturma: Batch .NET

Aşağıdaki kod parçacığı, Ubuntu Server işlem düğümlerinden oluşan bir havuz oluşturmak için Azure.Compute.Batch ve Azure.ResourceManager.Batch istemci kitaplıklarının nasıl kullanılacağına ilişkin bir örnek gösterir. Diğer ayrıntılar için başvuru belgelerine bakın.

Aşağıdaki kod parçacığı, şu anda desteklenen Market görüntüsü ve düğüm aracısı SKU bileşimleri listesinden seçim yapmak için BatchClient.GetSupportedImages yöntemini kullanır. Desteklenen birleşimlerin listesi zaman zaman değişebileceğinden bu teknik önerilir. En yaygın olarak desteklenen birleşimler eklenir.

// Pool settings
const string poolId = "LinuxNodesSamplePoolDotNet";
const string vmSize = "STANDARD_D2_V3";
const int nodeCount = 1;

// Obtain a collection of all available node agent SKUs.
// This allows us to select from a list of supported
// VM image/node agent combinations.
List<BatchSupportedImage> images = new List<BatchSupportedImage>();
await foreach (BatchSupportedImage img in batchClient.GetSupportedImagesAsync())
{
    images.Add(img);
}

// Find the appropriate image information
BatchSupportedImage image = null;
foreach (var img in images)
{
    if (img.ImageReference.Publisher == "canonical" &&
        img.ImageReference.Offer == "0001-com-ubuntu-server-focal" &&
        img.ImageReference.Sku == "20_04-lts")
    {
        image = img;
        break;
    }
}

// Create the BatchVmConfiguration for use when actually creating the pool.
// Note that the data-plane discovery uses Azure.Compute.Batch.BatchVmImageReference
// but the ARM pool data type uses Azure.ResourceManager.Batch.Models.BatchImageReference.
BatchVmConfiguration vmConfiguration = new BatchVmConfiguration(
    imageReference: new BatchImageReference()
    {
        Publisher = image.ImageReference.Publisher,
        Offer = image.ImageReference.Offer,
        Sku = image.ImageReference.Sku,
        Version = image.ImageReference.Version
    },
    nodeAgentSkuId: image.NodeAgentSkuId);

BatchAccountPoolData poolData = new BatchAccountPoolData()
{
    VmSize = vmSize,
    DeploymentConfiguration = new BatchDeploymentConfiguration() { VmConfiguration = vmConfiguration },
    ScaleSettings = new BatchAccountPoolScaleSettings()
    {
        FixedScale = new BatchAccountFixedScaleSettings() { TargetDedicatedNodes = nodeCount }
    }
};

// Commit the pool to the Batch service via Azure.ResourceManager.Batch.
await batchAccount.GetBatchAccountPools().CreateOrUpdateAsync(WaitUntil.Completed, poolId, poolData);

Önceki kod parçacığı, desteklenen görüntü ve düğüm aracısı SKU bileşimlerini dinamik olarak listelemek ve bunlar arasından seçim yapmak için BatchClient.GetSupportedImages yöntemini kullansa da (önerilen), BatchVmImageReference'ı açıkça yapılandırabilirsiniz:

BatchImageReference imageReference = new BatchImageReference()
{
    Publisher = "canonical",
    Offer = "0001-com-ubuntu-server-focal",
    Sku = "20_04-lts",
    Version = "latest"
};

SSH kullanarak Linux düğümlerine bağlanma

Geliştirme veya sorun giderme sırasında, havuzunuzdaki düğümlere oturum açmanız gerekebilir. Windows işlem düğümlerinin aksine, Linux düğümlerine bağlanmak için Uzak Masaüstü Protokolü'nü (RDP) kullanamazsınız. Bunun yerine, Batch hizmeti uzak bağlantı için her düğümde SSH erişimini etkinleştirir.

Aşağıdaki Python kod parçacığı, bir havuzdaki her düğümde uzak bağlantı için gerekli olan bir kullanıcı oluşturur. Ardından her düğüm için güvenli kabuk (SSH) bağlantı bilgilerini yazdırır.

import datetime
import getpass
from azure.batch import BatchClient, models
from azure.core.credentials import AzureNamedKeyCredential

# Specify your own account credentials
batch_account_name = ''
batch_account_key = ''
batch_account_url = ''

# Specify the ID of an existing pool containing Linux nodes
# currently in the 'idle' state
pool_id = ''

# Specify the username and prompt for a password
username = 'linuxuser'
password = getpass.getpass()

# Create a BatchClient
credentials = AzureNamedKeyCredential(
    batch_account_name,
    batch_account_key
)
batch_client = BatchClient(
    endpoint=batch_account_url,
    credential=credentials
)

# Create the user that will be added to each node in the pool
user = models.BatchNodeUserCreateOptions(
    name=username,
    password=password,
    is_admin=True,
    expiry_time=(datetime.datetime.utcnow() + datetime.timedelta(days=30)),
)

# Get the list of nodes in the pool
nodes = batch_client.list_nodes(pool_id=pool_id)

# Add the user to each node in the pool and print
# the connection information for the node
for node in nodes:
    # Add the user to the node
    batch_client.create_node_user(pool_id=pool_id, node_id=node.id, user=user)

    # Obtain SSH login information for the node
    login = batch_client.get_node_remote_login_settings(pool_id=pool_id,
                                                        node_id=node.id)

    # Print the connection info for the node
    print("{0} | {1} | {2} | {3}".format(node.id,
                                         node.state,
                                         login.remote_login_ip_address,
                                         login.remote_login_port))

Bu kod aşağıdaki örneğe benzer bir çıkışa sahip olacaktır. Bu durumda havuz dört Linux düğümü içerir.

Password:
tvm-1219235766_1-20160414t192511z | ComputeNodeState.idle | 13.91.7.57 | 50000
tvm-1219235766_2-20160414t192511z | ComputeNodeState.idle | 13.91.7.57 | 50003
tvm-1219235766_3-20160414t192511z | ComputeNodeState.idle | 13.91.7.57 | 50002
tvm-1219235766_4-20160414t192511z | ComputeNodeState.idle | 13.91.7.57 | 50001

Bir düğümde kullanıcı oluştururken parola yerine SSH ortak anahtarı belirtebilirsiniz.

Python SDK'sında BatchNodeUserCreateOptions üzerinde ssh_public_key parametresini kullanın.

.NET BatchNodeUserCreateOptions.SshPublicKey özelliğini kullanın.

Fiyatlandırma

Azure Batch, Azure Cloud Services ve Azure Sanal Makineler teknolojisi üzerine kurulmuştur. Batch hizmetinin kendisi ücretsiz olarak sunulur, yani yalnızca Batch çözümlerinizin tükettiği işlem kaynakları (ve ilgili maliyetler) için ücretlendirilirsiniz. Sanal Makine Yapılandırması'nı seçtiğinizde Sanal Makineler fiyatlandırma yapısına göre ücretlendirilirsiniz.

Uygulama paketlerini kullanarak Batch düğümlerinize uygulama dağıtırsanız, uygulama paketlerinizin kullandığı Azure Depolama kaynakları için de ücretlendirilirsiniz.

Sonraki adımlar