Uzyskiwanie dostępu do danych z magazynu w chmurze platformy Azure podczas programowania interakcyjnego

DOTYCZY: Zestaw PYTHON SDK azure-ai-ml w wersji 2 (bieżąca)

Projekt uczenia maszynowego zwykle rozpoczyna się od eksploracyjnej analizy danych (EDA), przetwarzania wstępnego danych (czyszczenia, inżynierii cech) i obejmuje tworzenie prototypów modeli uczenia maszynowego w celu zweryfikowania hipotez. Ta faza tworzenia prototypów projektu jest wysoce interaktywna i nadaje się do programowania w notesie Jupyter lub środowiska IDE z interaktywną konsolą języka Python. Z tego artykułu dowiesz się, jak wykonywać następujące działania:

  • Uzyskiwanie dostępu do danych z usługi Azure Machine Edukacja Identyfikator URI magazynu danych tak, jakby był to system plików.
  • Materializuj dane do biblioteki Pandas przy użyciu mltable biblioteki języka Python.
  • Materializuj zasoby danych usługi Azure Machine Edukacja do biblioteki Pandas przy użyciu mltable biblioteki języka Python.
  • Materializuj dane za pomocą jawnego pobierania za azcopy pomocą narzędzia .

Wymagania wstępne

Napiwek

Wskazówki zawarte w tym artykule opisują dostęp do danych podczas opracowywania interakcyjnego. Dotyczy to dowolnego hosta, który może uruchomić sesję języka Python. Może to obejmować maszynę lokalną, maszynę wirtualną w chmurze, usługę GitHub Codespace itp. Zalecamy użycie wystąpienia obliczeniowego usługi Azure Machine Edukacja — w pełni zarządzanej i wstępnie skonfigurowanej stacji roboczej w chmurze. Aby uzyskać więcej informacji, zobacz Tworzenie wystąpienia obliczeniowego usługi Azure Machine Edukacja.

Ważne

Upewnij się, że masz zainstalowane najnowsze azure-fsspec biblioteki języka mltable Python w środowisku języka Python:

pip install -U azureml-fsspec mltable

Uzyskiwanie dostępu do danych z identyfikatora URI magazynu danych, takiego jak system plików

Magazyn danych usługi Azure Machine Edukacja jest odwołaniem do istniejącego konta usługi Azure Storage. Zalety tworzenia i używania magazynu danych obejmują:

  • Typowy, łatwy w użyciu interfejs API do interakcji z różnymi typami magazynu (Blob/Files/ADLS).
  • Łatwe odnajdywanie przydatnych magazynów danych w operacjach zespołowych.
  • Obsługa dostępu opartego na poświadczeniach (na przykład tokenu SAS) i opartego na tożsamości (użyj identyfikatora Microsoft Entra ID lub tożsamości manged) w celu uzyskania dostępu do danych.
  • W przypadku dostępu opartego na poświadczeniach informacje o połączeniu są zabezpieczone w celu unieważnienia ujawnienia klucza w skryptach.
  • Przeglądanie danych i wklejanie identyfikatorów URI magazynu danych w interfejsie użytkownika programu Studio.

Identyfikator URI magazynu danych to jednolity identyfikator zasobu, który jest odwołaniemdo lokalizacji magazynu (ścieżki) na koncie usługi Azure Storage. Identyfikator URI magazynu danych ma następujący format:

# Azure Machine Learning workspace details:
subscription = '<subscription_id>'
resource_group = '<resource_group>'
workspace = '<workspace>'
datastore_name = '<datastore>'
path_on_datastore = '<path>'

# long-form Datastore uri format:
uri = f'azureml://subscriptions/{subscription}/resourcegroups/{resource_group}/workspaces/{workspace}/datastores/{datastore_name}/paths/{path_on_datastore}'.

Te identyfikatory URI magazynu danych to znana implementacja specyfikacji systemu plików (fsspec): ujednolicony interfejs języka Python dla lokalnych, zdalnych i osadzonych systemów plików oraz magazynu bajtów. Pakiet i jego pakiet zależności azureml-dataprep można zainstalować w narzędziu azureml-fsspec pip. Następnie możesz użyć implementacji usługi Azure Machine Edukacja Datastorefsspec.

Implementacja magazynu danych fsspec usługi Azure Machine Edukacja automatycznie obsługuje przekazywanie poświadczeń/tożsamości używane przez magazyn danych usługi Azure Machine Edukacja. Można uniknąć ujawnienia klucza konta w skryptach i dodatkowych procedur logowania w wystąpieniu obliczeniowym.

Możesz na przykład bezpośrednio użyć identyfikatorów URI magazynu danych w bibliotece Pandas. W tym przykładzie pokazano, jak odczytać plik CSV:

import pandas as pd

df = pd.read_csv("azureml://subscriptions/<subid>/resourcegroups/<rgname>/workspaces/<workspace_name>/datastores/<datastore_name>/paths/<folder>/<filename>.csv")
df.head()

Napiwek

Zamiast pamiętać format identyfikatora URI magazynu danych, możesz skopiować i wkleić identyfikator URI magazynu danych z poziomu interfejsu użytkownika programu Studio, wykonując następujące kroki:

  1. Wybierz pozycję Dane z menu po lewej stronie, a następnie wybierz kartę Magazyny danych.
  2. Wybierz nazwę magazynu danych, a następnie pozycję Przeglądaj.
  3. Znajdź plik/folder, który chcesz odczytać w bibliotece Pandas, i wybierz obok niego wielokropek (...). Wybierz pozycję Kopiuj identyfikator URI z menu. Możesz wybrać identyfikator URI magazynu danych, aby skopiować go do notesu/skryptu. Screenshot highlighting the copy of the datastore URI.

Możesz również utworzyć wystąpienie systemu plików usługi Azure Machine Edukacja, aby obsługiwać polecenia podobne do systemu plików — na przykład ls, glob, exists, open.

  • Metoda ls() wyświetla listę plików w określonym katalogu. Do wyświetlania listy plików można użyć ls(), ls(.), ls (<<folder_level_1>/<folder_level_2>). Obsługujemy zarówno ścieżki '.', jak i '..', w ścieżkach względnych.
  • Metoda glob() obsługuje globbing "*" i "**".
  • Metoda exists() zwraca wartość logiczną wskazującą, czy określony plik istnieje w bieżącym katalogu głównym.
  • Metoda open() zwraca obiekt podobny do pliku, który można przekazać do dowolnej innej biblioteki, która oczekuje pracy z plikami języka Python. Kod może również używać tego obiektu, tak jakby był to normalny obiekt pliku języka Python. Te obiekty podobne do plików szanują użycie with kontekstów, jak pokazano w tym przykładzie:
from azureml.fsspec import AzureMachineLearningFileSystem

# instantiate file system using following URI
fs = AzureMachineLearningFileSystem('azureml://subscriptions/<subid>/resourcegroups/<rgname>/workspaces/<workspace_name>/datastore*s*/datastorename')

fs.ls() # list folders/files in datastore 'datastorename'

# output example:
# folder1
# folder2
# file3.csv

# use an open context
with fs.open('./folder1/file1.csv') as f:
    # do some process
    process_file(f)

Przekazywanie plików za pośrednictwem narzędzia AzureMachine Edukacja FileSystem

from azureml.fsspec import AzureMachineLearningFileSystem
# instantiate file system using following URI
fs = AzureMachineLearningFileSystem('azureml://subscriptions/<subid>/resourcegroups/<rgname>/workspaces/<workspace_name>/datastores/<datastorename>/paths/')

# you can specify recursive as False to upload a file
fs.upload(lpath='data/upload_files/crime-spring.csv', rpath='data/fsspec', recursive=False, **{'overwrite': 'MERGE_WITH_OVERWRITE'})

# you need to specify recursive as True to upload a folder
fs.upload(lpath='data/upload_folder/', rpath='data/fsspec_folder', recursive=True, **{'overwrite': 'MERGE_WITH_OVERWRITE'})

lpath jest ścieżką lokalną i rpath jest ścieżką zdalną. Jeśli foldery określone w rpath pliku nie istnieją jeszcze, utworzymy dla Ciebie foldery.

Obsługujemy trzy tryby zastępowania:

  • APPEND: jeśli plik o tej samej nazwie istnieje w ścieżce docelowej, spowoduje to zachowanie oryginalnego pliku
  • FAIL_ON_FILE_CONFLICT: jeśli plik o tej samej nazwie istnieje w ścieżce docelowej, zgłasza błąd
  • MERGE_WITH_OVERWRITE: jeśli plik o tej samej nazwie istnieje w ścieżce docelowej, spowoduje to zastąpienie istniejącego pliku nowym plikiem

Pobieranie plików za pośrednictwem narzędzia AzureMachine Edukacja FileSystem

# you can specify recursive as False to download a file
# downloading overwrite option is determined by local system, and it is MERGE_WITH_OVERWRITE
fs.download(rpath='data/fsspec/crime-spring.csv', lpath='data/download_files/, recursive=False)

# you need to specify recursive as True to download a folder
fs.download(rpath='data/fsspec_folder', lpath='data/download_folder/', recursive=True)

Przykłady

W tych przykładach pokazano użycie specyfikacji systemu plików w typowych scenariuszach.

Odczytywanie pojedynczego pliku CSV do biblioteki Pandas

Pojedynczy plik CSV można odczytać w bibliotece Pandas, jak pokazano poniżej:

import pandas as pd

df = pd.read_csv("azureml://subscriptions/<subid>/resourcegroups/<rgname>/workspaces/<workspace_name>/datastores/<datastore_name>/paths/<folder>/<filename>.csv")

Odczytywanie folderu plików CSV w bibliotece Pandas

Metoda Pandas read_csv() nie obsługuje odczytywania folderu plików CSV. Musisz utworzyć glob csv ścieżek i połączyć je z ramką danych za pomocą metody Pandas concat() . W następnym przykładzie kodu pokazano, jak osiągnąć to połączenie za pomocą systemu plików usługi Azure Machine Edukacja:

import pandas as pd
from azureml.fsspec import AzureMachineLearningFileSystem

# define the URI - update <> placeholders
uri = 'azureml://subscriptions/<subid>/resourcegroups/<rgname>/workspaces/<workspace_name>/datastores/<datastore_name>'

# create the filesystem
fs = AzureMachineLearningFileSystem(uri)

# append csv files in folder to a list
dflist = []
for path in fs.glob('/<folder>/*.csv'):
    with fs.open(path) as f:
        dflist.append(pd.read_csv(f))

# concatenate data frames
df = pd.concat(dflist)
df.head()

Odczytywanie plików CSV w języku Dask

W tym przykładzie pokazano, jak odczytać plik CSV do ramki danych dask:

import dask.dd as dd

df = dd.read_csv("azureml://subscriptions/<subid>/resourcegroups/<rgname>/workspaces/<workspace_name>/datastores/<datastore_name>/paths/<folder>/<filename>.csv")
df.head()

Odczytywanie folderu plików parquet do biblioteki Pandas

W ramach procesu ETL pliki Parquet są zwykle zapisywane w folderze, co może następnie emitować pliki istotne dla ETL, takie jak postęp, zatwierdzenia itp. W tym przykładzie pokazano pliki utworzone na podstawie procesu ETL (pliki rozpoczynające się od _), które następnie tworzą plik parquet danych.

Screenshot showing the parquet etl process.

W tych scenariuszach odczytasz tylko pliki parquet w folderze i zignoruj pliki procesów ETL. W tym przykładzie kodu pokazano, jak wzorce glob mogą odczytywać tylko pliki parquet w folderze:

import pandas as pd
from azureml.fsspec import AzureMachineLearningFileSystem

# define the URI - update <> placeholders
uri = 'azureml://subscriptions/<subid>/resourcegroups/<rgname>/workspaces/<workspace_name>/datastores/<datastore_name>'

# create the filesystem
fs = AzureMachineLearningFileSystem(uri)

# append parquet files in folder to a list
dflist = []
for path in fs.glob('/<folder>/*.parquet'):
    with fs.open(path) as f:
        dflist.append(pd.read_parquet(f))

# concatenate data frames
df = pd.concat(dflist)
df.head()

Uzyskiwanie dostępu do danych z systemu plików usługi Azure Databricks (dbfs)

Specyfikacja systemu plików (fsspec) zawiera szereg znanych implementacji, w tym system plików usługi Databricks (dbfs).

Aby uzyskać dostęp do danych z dbfs potrzebnych danych:

Przy użyciu tych wartości należy utworzyć zmienną środowiskową w wystąpieniu obliczeniowym tokenu PAT:

export ADB_PAT=<pat_token>

Następnie możesz uzyskać dostęp do danych w bibliotece Pandas, jak pokazano w tym przykładzie:

import os
import pandas as pd

pat = os.getenv(ADB_PAT)
path_on_dbfs = '<absolute_path_on_dbfs>' # e.g. /folder/subfolder/file.csv

storage_options = {
    'instance':'adb-<some-number>.<two digits>.azuredatabricks.net', 
    'token': pat
}

df = pd.read_csv(f'dbfs://{path_on_dbfs}', storage_options=storage_options)

Odczytywanie obrazów za pomocą polecenia pillow

from PIL import Image
from azureml.fsspec import AzureMachineLearningFileSystem

# define the URI - update <> placeholders
uri = 'azureml://subscriptions/<subid>/resourcegroups/<rgname>/workspaces/<workspace_name>/datastores/<datastore_name>'

# create the filesystem
fs = AzureMachineLearningFileSystem(uri)

with fs.open('/<folder>/<image.jpeg>') as f:
    img = Image.open(f)
    img.show()

Przykład niestandardowego zestawu danych PyTorch

W tym przykładzie utworzysz niestandardowy zestaw danych PyTorch do przetwarzania obrazów. Zakładamy, że plik adnotacji (w formacie CSV) istnieje z tą ogólną strukturą:

image_path, label
0/image0.png, label0
0/image1.png, label0
1/image2.png, label1
1/image3.png, label1
2/image4.png, label2
2/image5.png, label2

Podfoldery przechowują te obrazy zgodnie z ich etykietami:

/
└── 📁images
    ├── 📁0
    │   ├── 📷image0.png
    │   └── 📷image1.png
    ├── 📁1
    │   ├── 📷image2.png
    │   └── 📷image3.png
    └── 📁2
        ├── 📷image4.png
        └── 📷image5.png

Niestandardowa klasa zestawu danych PyTorch musi implementować trzy funkcje: __init__, i __len____getitem__, jak pokazano poniżej:

import os
import pandas as pd
from PIL import Image
from torch.utils.data import Dataset

class CustomImageDataset(Dataset):
    def __init__(self, filesystem, annotations_file, img_dir, transform=None, target_transform=None):
        self.fs = filesystem
        f = filesystem.open(annotations_file)
        self.img_labels = pd.read_csv(f)
        f.close()
        self.img_dir = img_dir
        self.transform = transform
        self.target_transform = target_transform

    def __len__(self):
        return len(self.img_labels)

    def __getitem__(self, idx):
        img_path = os.path.join(self.img_dir, self.img_labels.iloc[idx, 0])
        f = self.fs.open(img_path)
        image = Image.open(f)
        f.close()
        label = self.img_labels.iloc[idx, 1]
        if self.transform:
            image = self.transform(image)
        if self.target_transform:
            label = self.target_transform(label)
        return image, label

Następnie możesz utworzyć wystąpienie zestawu danych, jak pokazano tutaj:

from azureml.fsspec import AzureMachineLearningFileSystem
from torch.utils.data import DataLoader

# define the URI - update <> placeholders
uri = 'azureml://subscriptions/<subid>/resourcegroups/<rgname>/workspaces/<workspace_name>/datastores/<datastore_name>'

# create the filesystem
fs = AzureMachineLearningFileSystem(uri)

# create the dataset
training_data = CustomImageDataset(
    filesystem=fs,
    annotations_file='/annotations.csv', 
    img_dir='/<path_to_images>/'
)

# Prepare your data for training with DataLoaders
train_dataloader = DataLoader(training_data, batch_size=64, shuffle=True)

Materializowanie danych do biblioteki Pandas przy użyciu mltable biblioteki

Biblioteka mltable może również ułatwić dostęp do danych w magazynie w chmurze. Odczytywanie danych do biblioteki Pandas z następującym ogólnym formatem mltable :

import mltable

# define a path or folder or pattern
path = {
    'file': '<supported_path>'
    # alternatives
    # 'folder': '<supported_path>'
    # 'pattern': '<supported_path>'
}

# create an mltable from paths
tbl = mltable.from_delimited_files(paths=[path])
# alternatives
# tbl = mltable.from_parquet_files(paths=[path])
# tbl = mltable.from_json_lines_files(paths=[path])
# tbl = mltable.from_delta_lake(paths=[path])

# materialize to Pandas
df = tbl.to_pandas_dataframe()
df.head()

Obsługiwane ścieżki

Biblioteka mltable obsługuje odczytywanie danych tabelarycznych z różnych typów ścieżek:

Lokalizacja Przykłady
Ścieżka na komputerze lokalnym ./home/username/data/my_data
Ścieżka na publicznym serwerze HTTP https://raw.githubusercontent.com/pandas-dev/pandas/main/doc/data/titanic.csv
Ścieżka w usłudze Azure Storage wasbs://<container_name>@<account_name>.blob.core.windows.net/<path>
abfss://<file_system>@<account_name>.dfs.core.windows.net/<path>
Długi magazyn danych usługi Azure Machine Edukacja azureml://subscriptions/<subid>/resourcegroups/<rgname>/workspaces/<wsname>/datastores/<name>/paths/<path>

Uwaga

mltableprogram wykonuje przekazywanie poświadczeń użytkownika dla ścieżek w usługach Azure Storage i Azure Machine Edukacja magazynach danych. Jeśli nie masz uprawnień dostępu do danych w magazynie bazowym, nie możesz uzyskać dostępu do danych.

Pliki, foldery i globy

mltable program obsługuje odczytywanie z:

  • pliki — na przykład: abfss://<file_system>@<account_name>.dfs.core.windows.net/my-csv.csv
  • foldery — na przykład abfss://<file_system>@<account_name>.dfs.core.windows.net/my-folder/
  • wzorce globu — na przykład abfss://<file_system>@<account_name>.dfs.core.windows.net/my-folder/*.csv
  • kombinacja plików, folderów i/lub wzorców symboli globbingowych

mltable elastyczność umożliwia materializację danych w jedną ramkę danych z kombinacji zasobów magazynu lokalnego i w chmurze oraz kombinacji plików/folderów/globów. Przykład:

path1 = {
    'file': 'abfss://filesystem@account1.dfs.core.windows.net/my-csv.csv'
}

path2 = {
    'folder': './home/username/data/my_data'
}

path3 = {
    'pattern': 'abfss://filesystem@account2.dfs.core.windows.net/folder/*.csv'
}

tbl = mltable.from_delimited_files(paths=[path1, path2, path3])

Obsługiwane formaty plików

mltable program obsługuje następujące formaty plików:

  • Rozdzielany tekst (na przykład: pliki CSV): mltable.from_delimited_files(paths=[path])
  • Parquet: mltable.from_parquet_files(paths=[path])
  • Delta: mltable.from_delta_lake(paths=[path])
  • Format wierszy JSON: mltable.from_json_lines_files(paths=[path])

Przykłady

Odczytywanie pliku CSV

Zaktualizuj symbole zastępcze (<>) w tym fragmencie kodu przy użyciu określonych szczegółów:

import mltable

path = {
    'file': 'abfss://<filesystem>@<account>.dfs.core.windows.net/<folder>/<file_name>.csv'
}

tbl = mltable.from_delimited_files(paths=[path])
df = tbl.to_pandas_dataframe()
df.head()

Odczytywanie plików parquet w folderze

W tym przykładzie pokazano, jak mltable można używać wzorców globu , takich jak symbole wieloznaczne , aby upewnić się, że tylko pliki parquet są odczytywane.

Zaktualizuj symbole zastępcze (<>) w tym fragmencie kodu przy użyciu określonych szczegółów:

import mltable

path = {
    'pattern': 'abfss://<filesystem>@<account>.dfs.core.windows.net/<folder>/*.parquet'
}

tbl = mltable.from_parquet_files(paths=[path])
df = tbl.to_pandas_dataframe()
df.head()

Odczytywanie zasobów danych

W tej sekcji pokazano, jak uzyskać dostęp do zasobów danych usługi Azure Machine Edukacja w bibliotece Pandas.

Zasób tabeli

Jeśli wcześniej utworzono zasób tabeli w usłudze Azure Machine Edukacja (lub mltablev1TabularDataset), możesz załadować ten zasób tabeli do biblioteki Pandas przy użyciu tego kodu:

import mltable
from azure.ai.ml import MLClient
from azure.identity import DefaultAzureCredential

ml_client = MLClient.from_config(credential=DefaultAzureCredential())
data_asset = ml_client.data.get(name="<name_of_asset>", version="<version>")

tbl = mltable.load(f'azureml:/{data_asset.id}')
df = tbl.to_pandas_dataframe()
df.head()

Zasób pliku

Jeśli zarejestrowano zasób pliku (na przykład plik CSV), możesz odczytać ten zasób do ramki danych biblioteki Pandas przy użyciu następującego kodu:

import mltable
from azure.ai.ml import MLClient
from azure.identity import DefaultAzureCredential

ml_client = MLClient.from_config(credential=DefaultAzureCredential())
data_asset = ml_client.data.get(name="<name_of_asset>", version="<version>")

path = {
    'file': data_asset.path
}

tbl = mltable.from_delimited_files(paths=[path])
df = tbl.to_pandas_dataframe()
df.head()

Zasób folderu

Jeśli zarejestrowano zasób folderu (uri_folder lub V1 FileDataset) — na przykład folder zawierający plik CSV — możesz odczytać ten zasób do ramki danych biblioteki Pandas przy użyciu następującego kodu:

import mltable
from azure.ai.ml import MLClient
from azure.identity import DefaultAzureCredential

ml_client = MLClient.from_config(credential=DefaultAzureCredential())
data_asset = ml_client.data.get(name="<name_of_asset>", version="<version>")

path = {
    'folder': data_asset.path
}

tbl = mltable.from_delimited_files(paths=[path])
df = tbl.to_pandas_dataframe()
df.head()

Uwaga dotycząca odczytywania i przetwarzania dużych woluminów danych za pomocą biblioteki Pandas

Napiwek

Biblioteka Pandas nie jest przeznaczona do obsługi dużych zestawów danych — biblioteka Pandas może przetwarzać tylko dane, które mogą mieścić się w pamięci wystąpienia obliczeniowego.

W przypadku dużych zestawów danych zalecamy użycie usługi Azure Machine Edukacja zarządzanej platformy Spark. Zapewnia to interfejs API biblioteki Pandas PySpark.

Przed skalowaniem w górę do zdalnego zadania asynchronicznego warto szybko wykonać iterację w mniejszym podzestawie dużego zestawu danych. mltable udostępnia wbudowane funkcje umożliwiające pobieranie przykładów dużych danych przy użyciu metody take_random_sample :

import mltable

path = {
    'file': 'https://raw.githubusercontent.com/pandas-dev/pandas/main/doc/data/titanic.csv'
}

tbl = mltable.from_delimited_files(paths=[path])
# take a random 30% sample of the data
tbl = tbl.take_random_sample(probability=.3)
df = tbl.to_pandas_dataframe()
df.head()

Możesz również wziąć podzbióry dużych danych za pomocą następujących operacji:

Pobieranie danych przy użyciu azcopy narzędzia

azcopy Użyj narzędzia , aby pobrać dane do lokalnego dysku SSD hosta (maszyny lokalnej, maszyny wirtualnej w chmurze, usługi Azure Machine Edukacja wystąpienia obliczeniowego) do lokalnego systemu plików. Narzędzieazcopy, które jest wstępnie zainstalowane na maszynie azure Edukacja wystąpieniu obliczeniowym, obsłuży to. Jeśli nie używasz wystąpienia obliczeniowego usługi Azure Machine Edukacja lub maszyny wirtualnej Nauka o danych (DSVM), może być konieczne zainstalowanie programu azcopy. Aby uzyskać więcej informacji, zobacz azcopy .

Uwaga

Nie zalecamy pobierania danych do lokalizacji w wystąpieniu /home/azureuser/cloudfiles/code obliczeniowym. Ta lokalizacja jest przeznaczona do przechowywania artefaktów notesu i kodu, a nie danych. Odczytywanie danych z tej lokalizacji spowoduje znaczne obciążenie związane z wydajnością podczas trenowania. Zamiast tego zalecamy magazyn danych w obiekcie home/azureuser, który jest lokalnym dyskiem SSD węzła obliczeniowego.

Otwórz terminal i utwórz nowy katalog, na przykład:

mkdir /home/azureuser/data

Zaloguj się do narzędzia azcopy przy użyciu:

azcopy login

Następnie możesz skopiować dane przy użyciu identyfikatora URI magazynu

SOURCE=https://<account_name>.blob.core.windows.net/<container>/<path>
DEST=/home/azureuser/data
azcopy cp $SOURCE $DEST

Następne kroki