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 makalede Hem Batch Python hem de Batch .NET istemci kitaplıklarını kullanarak Batch hizmetinde Linux işlem düğümleri havuzlarının nasıl oluşturulacağı açıklanır.

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üsü 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 Market bir görüntü belirtebilir veya özel 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ü başvurusu özelliği Örnek
Publisher Kurallı
Sunduğu 0001-com-ubuntu-server-focal
SKU 20_04-lts
Sürüm latest

İpucu

Azure CLI ile Azure Market Linux VM görüntülerini bulma bölümünde bu özellikler ve Market görüntülerini belirtme hakkında daha fazla bilgi 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 Market görüntüleri şu anda kullanılabilir olan Batch düğümü aracılarıyla uyumlu değildir. Batch hizmeti ve ilgili düğüm aracısı SKU'ları için desteklenen tüm Market sanal makine görüntülerini listelemek için list_supported_images (Python), ListSupportedImages (Batch .NET) veya başka bir dil SDK'sında ilgili API'yi kullanın.

Düğüm aracısı SKU

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. Temel olarak, bir Sanal Makine Yapılandırması oluşturduğunuzda, önce sanal makine görüntüsü başvuruyu belirtirsiniz ve ardından 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 ImageReference 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
import azure.batch.batch_service_client as batch
import azure.batch.batch_auth as batchauth
import azure.batch.models as batchmodels

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

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

# Initialize the Batch client
creds = batchauth.SharedKeyCredentials(account, key)
config = batch.BatchServiceClientConfiguration(creds, batch_url)
client = batch.BatchServiceClient(creds, batch_url)

# Create the unbound pool
new_pool = batchmodels.PoolAddParameter(id=pool_id, vm_size=vm_size)
new_pool.target_dedicated = node_count

# Configure the start task for the pool
start_task = batchmodels.StartTask()
start_task.run_elevated = True
start_task.command_line = "printenv AZ_BATCH_NODE_STARTUP_DIR"
new_pool.start_task = start_task

# Create an ImageReference which specifies the Marketplace
# virtual machine image to install on the nodes
ir = batchmodels.ImageReference(
    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 = batchmodels.VirtualMachineConfiguration(
    image_reference=ir,
    node_agent_sku_id="batch.node.ubuntu 20.04")

# Assign the virtual machine configuration to the pool
new_pool.virtual_machine_configuration = vmc

# Create pool in the Batch service
client.pool.add(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 (açıkça ImageReference oluşturmak yerine) list_supported_images yöntemini kullanmanızı öneririz. 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 = client.account.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 = batchmodels.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ığı, Batch .NET istemci kitaplığını kullanarak Ubuntu Server işlem düğümleri havuzu oluşturma işleminin bir örneğini gösterir. Batch .NET hakkında daha fazla ayrıntı için başvuru belgelerini görüntüleyin.

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 PoolOperations.ListSupportedImages 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<ImageInformation> images =
    batchClient.PoolOperations.ListSupportedImages().ToList();

// Find the appropriate image information
ImageInformation 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 VirtualMachineConfiguration for use when actually
// creating the pool
VirtualMachineConfiguration virtualMachineConfiguration =
    new VirtualMachineConfiguration(image.ImageReference, image.NodeAgentSkuId);

// Create the unbound pool object using the VirtualMachineConfiguration
// created above
CloudPool pool = batchClient.PoolOperations.CreatePool(
    poolId: poolId,
    virtualMachineSize: vmSize,
    virtualMachineConfiguration: virtualMachineConfiguration,
    targetDedicatedComputeNodes: nodeCount);

// Commit the pool to the Batch service
await pool.CommitAsync();

Ö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 PoolOperations.istSupportedImages yöntemini kullansa da (önerilen), imagereference'ı açıkça yapılandırabilirsiniz:

ImageReference imageReference = new ImageReference(
    publisher: "canonical",
    offer: "0001-com-ubuntu-server-focal",
    sku: "20_04-lts",
    version: "latest");

SSH kullanarak Linux düğümlerine bağlanma

Geliştirme sırasında veya sorun giderme sırasında, havuzunuzdaki düğümlerde oturum açmayı gerekli bulabilirsiniz. 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
import azure.batch.batch_service_client as batch
import azure.batch.batch_auth as batchauth
import azure.batch.models as batchmodels

# 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 = batchauth.SharedKeyCredentials(
    batch_account_name,
    batch_account_key
)
batch_client = batch.BatchServiceClient(
    credentials,
    base_url=batch_account_url
)

# Create the user that will be added to each node in the pool
user = batchmodels.ComputeNodeUser(username)
user.password = password
user.is_admin = True
user.expiry_time = \
    (datetime.datetime.today() + datetime.timedelta(days=30)).isoformat()

# Get the list of nodes in the pool
nodes = batch_client.compute_node.list(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.compute_node.add_user(pool_id, node.id, user)

    # Obtain SSH login information for the node
    login = batch_client.compute_node.get_remote_login_settings(pool_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 ComputeNodeUser üzerindeki ssh_public_key parametresini kullanın.

.NET'te ComputeNodeUser.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