Freigeben über


Einbinden eines virtuellen Dateisystems in einen Batch-Pool

Azure Batch unterstützt die Einbindung von Cloudspeicher oder eines externen Dateisystems auf Windows- oder Linux-Computeknoten in Ihren Batch-Pools. Wenn ein Computeknoten einem Pool beitritt, wird das virtuelle Dateisystem eingebunden und als lokales Laufwerk auf diesem Knoten behandelt. In diesem Artikel erfahren Sie, wie Sie ein virtuelles Dateisystem mithilfe der Batch-Verwaltungsbibliothek für .NET in einen Pool von Computeknoten einbinden.

Durch das Einbinden des Dateisystems in den Pool wird der Zugriff auf Daten einfacher und effizienter im Vergleich zum Abrufen der Daten durch Aufgaben aus einem großen freigegebenen Dataset. Stellen Sie sich ein Szenario vor, in dem mehrere Aufgaben auf einen gemeinsamen Satz von Daten zugreifen müssen. Ein Beispiel hierfür ist das Rendern eines Films. Jede Aufgabe rendert jeweils ein oder mehrere Frames aus den Szenendateien. Durch die Einbindung eines Laufwerks, das die Szenendateien enthält, können Computeknoten einfacher auf die freigegebenen Daten zugreifen.

Darüber hinaus können Sie das zugrunde liegende Dateisystem auswählen, um die Anforderungen an die Leistung, den gesamten Betrieb und IOPS (Eingabe-/Ausgabevorgänge pro Sekunde) zu erfüllen. Sie können das Dateisystem unabhängig von der Anzahl der Computeknoten skalieren, die gleichzeitig auf die Daten zugreifen.

Beispielsweise kann ein verteilter speicherinterner Avere vFXT-Cache verwendet werden, um große Renderings im Kinofilmmaßstab mit Tausenden von gleichzeitigen Renderknoten zu unterstützen, die auf lokal gespeicherte Quelldaten zugreifen. Alternativ können Sie für Daten, die sich bereits im cloudbasierten Blobspeicher befinden, BlobFuse verwenden, um die Daten als lokales Dateisystem einzuhängen. Azure Files bietet einen ähnlichen Workflow wie BlobFuse und ist sowohl unter Windows als auch unter Linux verfügbar.

Unterstützte Konfigurationen

Sie können die folgenden Dateisystemtypen einbinden:

  • Azure Files
  • Azure Blob Storage
  • Network File System (NFS), einschließlich eines Avere vFXT-Caches
  • Common Internet File System (CIFS)

Batch unterstützt die folgenden virtuellen Dateisystemtypen für Knoten-Agents, die für die jeweiligen Herausgeber und Angebote erstellt werden.

Betriebssystemtyp Azure Files-Freigabe Azure-Blobcontainer NFS-Einbindung CIFS-Einbindung
Linux ✔️ ✔️ ✔️ ✔️
Windows ✔️

Hinweis

Das Einbinden eines virtuellen Dateisystems wird nicht in Batch-Pools unterstützt, die vor dem 08. August 2019 erstellt wurden.

Netzwerkanforderungen

Beachten Sie die folgenden Anforderungen, wenn Sie virtuelle Dateibereitstellungen mit Batch-Pools in einem virtuellen Netzwerk verwenden, und achten Sie darauf, dass kein erforderlicher Datenverkehr blockiert wird. Weitere Informationen finden Sie unter Batch-Pools in einem virtuellen Netzwerk.

  • Azure Files-Freigaben erfordern einen offenen TCP-Port 445 für Datenverkehr zum und vom storage-Diensttag. Weitere Informationen finden Sie unter Verwenden einer Azure-Dateifreigabe mit Windows.

  • Azure Blob-Container erfordern einen offenen TCP-Port 443 für Datenverkehr zum und vom storage-Diensttag. Virtuelle Computer (VMs) müssen auf https://packages.microsoft.com zugreifen können, um blobfuse- und gpg-Pakete herunterzuladen. Abhängig von der Konfiguration benötigen Sie u. U. Zugriff auf andere URLs.

  • Network File System (NFS) erfordert standardmäßig Zugriff auf Port 2049. Ihre Konfiguration hat möglicherweise andere Anforderungen. VMs müssen Zugriff auf den entsprechenden Paket-Manager haben, um die nfs-common-Pakete (für Debian oder Ubuntu) herunterzuladen. Die URL kann je nach Betriebssystemversion variieren. Abhängig von der Konfiguration benötigen Sie u. U. auch Zugriff auf andere URLs.

    Das Einbinden von Azure Blob oder Azure Files über NFS kann mehr Netzwerkanforderungen haben. Beispielsweise müssen Ihre Computeknoten möglicherweise dasselbe virtuelle Netzwerksubnetz wie das Speicherkonto verwenden.

  • Common Internet File System (CIFS) erfordert Zugriff auf TCP-Port 445. VMs müssen Zugriff auf den entsprechenden Paket-Manager haben, um das Paket cifs-utils herunterzuladen. Die URL kann je nach Betriebssystemversion variieren.

Einbinden von Konfiguration und Implementierung

Durch die Einbindung eines virtuellen Dateisystems in einen Pool wird das Dateisystem für jeden Computeknoten im Pool verfügbar. Die Konfiguration für das Dateisystem erfolgt, wenn ein Computerknoten einem Pool beitritt, neu gestartet wird oder ein Erneutes Image erstellt wird.

Zum Einbinden eines Dateisystems in einem Pool erstellen Sie ein MountConfiguration-Objekt , das ihrem virtuellen Dateisystem entspricht: AzureBlobFileSystemConfiguration, AzureFileShareConfiguration, NfsMountConfigurationoder CifsMountConfiguration.

Für alle MountConfiguration-Objekte sind die folgenden Basisparameter erforderlich. Einige Einbindungskonfigurationen verfügen über bestimmte Parameter für das jeweilige Dateisystem, die in den Codebeispielen ausführlicher dargestellt werden.

  • Kontoname oder Quelle des Speicherkontos.

  • Relativer Einhängepfad oder Quelle: Der Speicherort des auf dem Rechenknoten eingehängten Dateisystems, relativ zum Standardverzeichnis \fsmounts, das auf dem Knoten über AZ_BATCH_NODE_MOUNTS_DIR zugänglich ist.

    Der genaue Speicherort des \fsmounts-Verzeichnisses variiert je nach Knotenbetriebssystem. Der Speicherort auf einem Ubuntu-Knoten ist beispielsweise mnt\batch\tasks\fsmounts zugeordnet.

  • Einbindungsoptionen oder BlobFuse-Optionen, die bestimmte Parameter für die Einbindung eines Dateisystems beschreiben.

Wenn Sie den Pool und das MountConfiguration-Objekt erstellen, weisen Sie dem Objekt die MountConfigurationList-Eigenschaft zu. Die Konfiguration für das Dateisystem erfolgt, wenn ein Computerknoten dem Pool beitritt, neu gestartet wird oder ein Erneutes Image erstellt wird.

Der Batch-Agent implementiert die Einbindung auf Windows und Linux unterschiedlich.

  • Unter Linux installiert Batch das Paket cifs-utils. Anschließend gibt Batch den Einhängebefehl aus.

  • Auf Windows verwendet Batch cmdkey um Ihre Batch-Kontoanmeldeinformationen hinzuzufügen. Dann gibt Batch den Bereitstellungsbefehl über net use aus. Beispiel:

    net use S: \\<storage-account-name>.file.core.windows.net\<fileshare> /u:AZURE\<storage-account-name> <storage-account-key>
    

Beim Einbinden des Dateisystems wird eine Umgebungsvariable AZ_BATCH_NODE_MOUNTS_DIR erstellt, die auf den Speicherort des bereitgestellten Dateisystems und der Protokolldateien verweist. Sie können die Protokolldateien für die Problembehandlung und das Debuggen verwenden.

Einbinden einer Azure Files-Freigabe mithilfe von PowerShell

Sie können Azure PowerShell verwenden, um eine Azure Files-Freigabe in einem Windows- oder Linux-Batch-Pool einzubinden. Das folgende Verfahren führt Sie durch das Konfigurieren und Einbinden eines Dateisystems für Azure-Dateifreigabe in einem Batch-Pool.

Wichtig

Die maximale Anzahl eingebundener Dateisysteme in einem Pool beträgt 10. Ausführliche Informationen und andere Grenzwerte finden Sie unter Batch-Dienst – Kontingente und Limits.

Voraussetzungen

  • Ein Azure-Konto mit einem aktiven Abonnement.
  • Azure PowerShell installiert, oder verwenden Sie Azure Cloud Shell, und wählen Sie PowerShell für die Schnittstelle aus.
  • Ein vorhandenes Batch-Konto mit einem verknüpften Azure Storage-Konto, das über eine Dateifreigabe verfügt.
  1. Melden Sie sich bei Ihrem Azure-Abonnement an, und ersetzen Sie den Platzhalter durch Ihre Abonnement-ID.

    Connect-AzAccount -Subscription "<subscription-ID>"
    
  2. Abrufen des Kontexts für Ihr Batch-Konto. Ersetzen Sie den Platzhalter <batch-account-name> durch den Namen Ihres Batch-Kontos.

    $context = Get-AzBatchAccount -AccountName <batch-account-name>
    
  3. Erstellen Sie einen Batch-Pool mit den folgenden Einstellungen. Ersetzen Sie die Platzhalter <storage-account-name>, <storage-account-key>und <file-share-name> durch die Werte des Speicherkontos, das mit Ihrem Batch-Konto verknüpft ist. Ersetzen Sie den Platzhalter <pool-name> durch den Namen, den Sie dem Pool geben möchten.

    Das folgende Skript erstellt einen Pool mit einem Windows Server 2016 Datacenter, Standard_D2_V2 Knotengröße, und bindet dann die Azure-Dateifreigabe auf dem Laufwerk S des Knotens ein.

    $fileShareConfig = New-Object -TypeName "Microsoft.Azure.Commands.Batch.Models.PSAzureFileShareConfiguration" -ArgumentList @("<storage-account-name>", "https://<storage-account-name>.file.core.windows.net/batchfileshare1", "S", "<storage-account-key>")
    
    $mountConfig = New-Object -TypeName "Microsoft.Azure.Commands.Batch.Models.PSMountConfiguration" -ArgumentList @($fileShareConfig)
    
    $imageReference = New-Object -TypeName "Microsoft.Azure.Commands.Batch.Models.PSImageReference" -ArgumentList @("WindowsServer", "MicrosoftWindowsServer", "2016-Datacenter", "latest")
    
    $configuration = New-Object -TypeName "Microsoft.Azure.Commands.Batch.Models.PSVirtualMachineConfiguration" -ArgumentList @($imageReference, "batch.node.windows amd64")
    
    New-AzBatchPool -Id "<pool-name>" -VirtualMachineSize "STANDARD_D2_V2" -VirtualMachineConfiguration $configuration -TargetDedicatedComputeNodes 1 -MountConfiguration @($mountConfig) -BatchContext $context
    
  4. Stellen Sie eine Verbindung mit dem Knoten her, und überprüfen Sie, ob die Ausgabedatei korrekt ist.

Zugreifen auf die eingebundenen Dateien

Azure Batch-Tasks können mithilfe des direkten Pfads des Laufwerks auf die bereitgestellten Dateien zugreifen, z. B.:

cmd /c "more S:\folder1\out.txt & timeout /t 90 > NULL"

Der Azure Batch-Agent gewährt nur Zugriff auf Azure Batch-Tasks in Windows. Wenn Sie das Remotedesktopprotokoll (RDP) zum Herstellen einer Verbindung mit dem Knoten verwenden, hat Ihr Benutzerkonto keinen automatischen Zugriff auf das Bereitstellungslaufwerk. Wenn Sie über RDP eine Verbindung mit dem Knoten herstellen, müssen Sie Anmeldeinformationen für das Speicherkonto hinzufügen, um direkt auf das Laufwerk S zuzugreifen.

Verwenden Sie cmdkey, um Ihre Anmeldeinformationen hinzuzufügen. Ersetzen Sie die Platzhalter <storage-account-name> und <storage-account-key> durch Ihre eigenen Informationen.

cmdkey /add:"<storage-account-name>.file.core.windows.net" /user:"Azure\<storage-account-name>" /pass:"<storage-account-key>"

Behandeln von Einbindungsproblemen

Wenn bei einer Einbindungskonfiguration ein Fehler auftritt, führt dies zu einem Fehler des Computeknotens, und der Knoten weist dann den Status Nicht verwendbar auf. Überprüfen Sie zum Diagnostizieren eines Einbindungskonfigurationsfehlers die ComputeNodeError-Eigenschaft auf Details zum Fehler.

Um die Dateien zum Debuggen abzurufen, können Sie die OutputFiles-API verwenden, um die *.log-Dateien hochzuladen. Die *.log-Dateien enthalten Informationen zur Dateisystemeinbindung am Speicherort AZ_BATCH_NODE_MOUNTS_DIR. Eingebundene Protokolldateien haben das Format <type>-<mountDirOrDrive>.log für jede Einbindung. Die zugehörige Einbindungsprotokolldatei einer CIFS-Einbindung im Einbindungsverzeichnis test heißt beispielsweise cifs-test.log.

Untersuchen von Einbindungsfehlern

Sie können über RDP oder SSH eine Verbindung mit dem Knoten herstellen, um die Protokolldateien für Dateisystemeinbindungen zu überprüfen. Die folgende Beispielfehlermeldung kann auftreten, wenn Sie versuchen, eine Azure-Dateifreigabe auf einem Batch-Knoten einzubinden:

Mount Configuration Error | An error was encountered while configuring specified mount(s)
Message: System error (out of memory, cannot fork, no more loop devices)
MountConfigurationPath: S

Wenn dieser Fehler auftritt, stellen Sie eine RDP- oder SSH-Verbindung mit dem Knoten her, um die zugehörigen Protokolldateien zu überprüfen. Der Batch-Agent implementiert die Einbindung für Azure-Dateifreigaben unter Windows und Linux unterschiedlich. Unter Linux installiert Batch das Paket cifs-utils. Anschließend gibt Batch den Einhängebefehl aus. Auf Windows verwendet Batch cmdkey um Ihre Batch-Kontoanmeldeinformationen hinzuzufügen. Dann gibt Batch den Bereitstellungsbefehl über net use aus. Beispiel:

net use S: \\<storage-account-name>.file.core.windows.net\<fileshare> /u:AZURE\<storage-account-name> <storage-account-key>
  1. Verbinden über RDP zum Knoten.

  2. Öffnen Sie die Protokolldatei fshare-S.log unter D:\batch\tasks\fsmounts.

  3. Überprüfen Sie die Fehlermeldungen, z. B.:

    CMDKEY: Credential added successfully.
    System error 86 has occurred.
    
    The specified network password is not correct.
    
  4. Beheben Sie das Problem mithilfe der Problembehandlung für Azure-Dateifreigaben.

Wenn Sie die Protokolldateien auf dem Knoten nicht mit RDP oder SSH überprüfen können, können Sie die Protokolle in Ihr Azure-Speicherkonto hochladen. Diese Methode eignet sich sowohl für Windows- als auch für Linux-Protokolle.

  1. Suchen Sie im Azure-Portal nach dem Batch-Konto mit Ihrem Pool, und wählen Sie es aus.

  2. Wählen Sie auf der Seite des Batch-Kontos im linken Navigationsbereich Pools aus.

  3. Wählen Sie auf der Seite Pools den Namen des Pools aus.

  4. Wählen Sie auf der Seite des Pools im linken Navigationsbereich die Option Knoten aus.

  5. Wählen Sie auf der Seite Knoten den Namen des Knotens aus.

  6. Wählen Sie auf der Seite des Knotens die Option Batch-Protokolle hochladen.

  7. Wählen Sie im Bereich Batch-Protokolle hochladen Ihren Azure-Storage-Container aus.

  8. Wählen Sie auf der Seite Speicherkonten ein Speicherkonto aus.

  9. Wählen Sie auf der Seite Container einen Container aus, in den die Dateien hochgeladen werden sollen, oder erstellen Sie diesen, und wählen Sie Auswählen aus.

  10. Wählen Sie Upload starten aus.

  11. Laden Sie nach Abschluss des Uploads die Dateien herunter, und öffnen Sie agent-debug.log.

  12. Überprüfen Sie die Fehlermeldungen, z. B.:

    ..20210322T113107.448Z.00000000-0000-0000-0000-000000000000.ERROR.agent.mount.filesystems.basefilesystem.basefilesystem.py.run_cmd_persist_output_async.59.2912.MainThread.3580.Mount command failed with exit code: 2, output:
    
    CMDKEY: Credential added successfully.
    
    System error 86 has occurred.
    
    The specified network password is not correct.
    
  13. Beheben Sie das Problem mithilfe der Problembehandlung für Azure-Dateifreigaben.

Manuelles Einbinden einer Dateifreigabe mit PowerShell

Wenn Sie Bereitstellungsfehler nicht diagnostizieren oder beheben können, können Sie die Dateifreigabe stattdessen mithilfe von PowerShell manuell einbinden.

  1. Erstellen Sie einen Pool ohne Einbindungskonfiguration. Beispiel:

    $imageReference = New-Object -TypeName "Microsoft.Azure.Commands.Batch.Models.PSImageReference" -ArgumentList @("WindowsServer", "MicrosoftWindowsServer", "2016-Datacenter", "latest")
    
    $configuration = New-Object -TypeName "Microsoft.Azure.Commands.Batch.Models.PSVirtualMachineConfiguration" -ArgumentList @($imageReference, "batch.node.windows amd64")
    
    New-AzBatchPool -Id "<pool-name>" -VirtualMachineSize "STANDARD_D2_V2" -VirtualMachineConfiguration $configuration -TargetDedicatedComputeNodes 1  -BatchContext $Context
    
  2. Warten Sie, bis sich der Knoten im Leerlaufzustand befindet.

  3. Suchen Sie im Azure-Portal nach dem Speicherkonto mit Ihrer Dateifreigabe, und wählen Sie es aus.

  4. Wählen Sie im Menü der Speicherkontoseite im linken Navigationsbereich Dateifreigaben aus.

  5. Wählen Sie auf der Seite Dateifreigaben die Dateifreigabe aus, die eingebunden werden soll.

  6. Wählen Sie auf der Seite der Dateifreigabe die Option Verbinden aus.

  7. Wählen Sie im Bereich Verbinden die Registerkarte Windows aus.

  8. Geben Sie unter Laufwerkbuchstabedas Laufwerk ein, das Sie verwenden möchten. Der Standardwert ist Z.

  9. Wählen Sie unter Authentifizierungsmethodeaus, wie Sie eine Verbindung mit der Dateifreigabe herstellen möchten.

  10. Wählen Sie Skript anzeigen aus, und kopieren Sie das PowerShell-Skript zum Einbinden der Dateifreigabe.

  11. Verbinden über RDP zum Knoten.

  12. Führen Sie den Befehl aus, den Sie zum Einbinden der Dateifreigabe kopiert haben.

  13. Beachten Sie alle Fehlermeldungen in der Ausgabe. Verwenden Sie diese Informationen, um netzwerkbezogene Probleme zu beheben.

Beispiel für Einbindungskonfigurationen

In den folgenden Codebeispielkonfigurationen wird das Einbinden verschiedener Dateifreigabesysteme in einem Pool von Computerknoten veranschaulicht.

Azure Files-Freigabe

Azure Files ist das Standardangebot für Azure-Clouddateisysteme. Die folgende Konfiguration bindet eine Azure Files-Freigabe namens <file-share-name> auf Laufwerk S ein. Informationen zu den Parametern im Beispiel finden Sie unter Einbinden einer SMB-Azure-Dateifreigabe unter Windows oder Erstellen einer NFS-Azure-Dateifreigabe und Einbinden auf einem virtuellen Linux-Computer über das Azure-Portal.

new PoolAddParameter
{
    Id = poolId,
    MountConfiguration = new[]
    {
        new MountConfiguration
        {
            AzureFileShareConfiguration = new AzureFileShareConfiguration
            {
                AccountName = "<storage-account-name>",
                AzureFileUrl = "https://<storage-account-name>.file.core.windows.net/<file-share-name>",
                AccountKey = "<storage-account-key>",
                RelativeMountPath = "S",
                MountOptions = "-o vers=3.0,dir_mode=0777,file_mode=0777,sec=ntlmssp"
            },
        }
    }
}

Azure-Blobcontainer

Eine andere Option ist die Verwendung von Azure-Blobspeicher über BlobFuse. Das Einbinden eines Blobdateisystems erfordert entweder einen Kontoschlüssel, einen SAS-Schlüssel (Shared Access Signature) oder eine verwaltete Identität mit Zugriff auf Ihr Speicherkonto.

Informationen zum Abrufen dieser Schlüssel oder Identität finden Sie in den folgenden Artikeln:

Die folgende Konfiguration bindet ein Blob-Dateisystem mit BlobFuse-Optionen ein. Zur Veranschaulichung zeigt das Beispiel AccountKey, SasKey und IdentityReference, sie können jedoch nur eine dieser Methoden angeben.

new PoolAddParameter
{
    Id = poolId,
    MountConfiguration = new[]
    {
        new MountConfiguration
        {
            AzureBlobFileSystemConfiguration = new AzureBlobFileSystemConfiguration
            {
                AccountName = "<storage-account-name>",
                ContainerName = "<container-name>",
                // Use only one of the following three lines:
                AccountKey = "<storage-account-key>",
                SasKey = "<sas-key>",
                IdentityReference = new ComputeNodeIdentityReference("/subscriptions/<subscription>/resourceGroups/<resource-group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<identity-name>"),
                RelativeMountPath = "<relative-mount-path>",
                BlobfuseOptions = "-o attr_timeout=240 -o entry_timeout=240 -o negative_timeout=120 "
            },
        }
    }
}

Um Standardzugriff auf das über BlobFuse eingebundene Verzeichnis zu erhalten, müssen Sie die Aufgabe als Administrator ausführen. Blobfuse bindet das Verzeichnis im Benutzerbereich ein, und bei der Poolerstellung wird das Verzeichnis als Stamm eingebunden. Unter Linux sind alle Administratoraufgaben stammbasiert. Auf der FUSE-Referenzseite sind alle Optionen für FUSE-Module beschrieben.

Weitere Informationen und Tipps zur Verwendung von BlobFuse erhalten Sie in den folgenden Referenzen:

NFS

Sie können NFS-Freigaben in Poolknoten einbinden, damit Batch auf herkömmliche Dateisysteme zugreifen kann. Bei der Einrichtung kann es sich um einen einzelnen NFS-Server handeln, der in der Cloud bereitgestellt wird, oder um einen NFS-Server vor Ort, auf den über ein virtuelles Netzwerk zugegriffen wird. NFS-Bereitstellungen unterstützen Avere vFXT, einen verteilten In-Memory-Cache für datenintensive HPC-Aufgaben (High Performance Computing). NFS-Bereitstellungen unterstützen auch andere standardmäßige NFS-konforme Schnittstellen wie NFS für Azure Blob und NFS für Azure Files.

Das folgende Beispiel zeigt eine Konfiguration für eine NFS-Dateisystemeinbindung:

new PoolAddParameter
{
    Id = poolId,
    MountConfiguration = new[]
    {
        new MountConfiguration
        {
            NfsMountConfiguration = new NFSMountConfiguration
            {
                Source = "<source>",
                RelativeMountPath = "<relative-mount-path>",
                MountOptions = "options ver=3.0"
            },
        }
    }
}

CIFS

Das Einbinden von CIFS auf Poolknoten ist eine weitere Möglichkeit, um Zugriff auf herkömmliche Dateisysteme zu ermöglichen. CIFS ist ein Dateifreigabeprotokoll, das einen offenen und plattformübergreifenden Mechanismus zum Anfordern von Netzwerkserverdateien und -diensten bietet. CIFS basiert auf der erweiterten Version des SMB-Protokolls für die gemeinsame Nutzung von Dateien im Internet und Intranet.

Das folgende Beispiel zeigt eine Konfiguration für eine CIFS-Dateieinbindung.

new PoolAddParameter
{
    Id = poolId,
    MountConfiguration = new[]
    {
        new MountConfiguration
        {
            CifsMountConfiguration = new CIFSMountConfiguration
            {
                Username = "<storage-account-name>",
                RelativeMountPath = "<relative-mount-path>",
                Source = "<source>",
                Password = "<storage-account-key>",
                MountOptions = "-o vers=3.0,dir_mode=0777,file_mode=0777,serverino,domain=<domain-name>"
            },
        }
    }
}

Hinweis

Suchen Sie nach einem Beispiel, das PowerShell statt C# verwendet? Ein weiteres großartiges Beispiel finden Sie hier: Bereitstellen von Azure-Datei in Azure Batch Pool.

Nächste Schritte