Sdílet prostřednictvím


Ingestování dat azure HPC Cache – metoda ručního kopírování

Tento článek obsahuje podrobné pokyny pro ruční kopírování dat do kontejneru úložiště objektů blob pro použití se službou Azure HPC Cache. K optimalizaci rychlosti kopírování používá paralelní operace s více vlákny.

Další informace o přesunu dat do úložiště objektů blob pro službu Azure HPC Cache najdete v tématu Přesun dat do služby Azure Blob Storage.

Příklad jednoduché kopie

V klientovi můžete ručně vytvořit vícevláknovou kopii spuštěním více příkazů kopírování najednou na pozadí s předdefinovanými sadami souborů nebo cest.

Příkaz Linux/systém UNIX cp obsahuje argument -p pro zachování vlastnictví a metadat mtime. Přidání tohoto argumentu do níže uvedených příkazů je volitelné. (Přidání argumentu zvyšuje počet volání systému souborů odesílaných z klienta do cílového systému souborů pro úpravy metadat.)

Tento jednoduchý příklad paralelně zkopíruje dva soubory:

cp /mnt/source/file1 /mnt/destination1/ & cp /mnt/source/file2 /mnt/destination1/ &

Po vydání tohoto příkazu jobs příkaz zobrazí, že jsou spuštěna dvě vlákna.

Kopírování dat s předvídatelnými názvy souborů

Pokud jsou názvy souborů předvídatelné, můžete pomocí výrazů vytvořit paralelní vlákna kopírování.

Pokud například adresář obsahuje 1000 souborů, které jsou očíslovány postupně od 0001 do 1000, můžete pomocí následujících výrazů vytvořit 10 paralelních vláken, které každý kopíruje 100 souborů:

cp /mnt/source/file0* /mnt/destination1/ & \
cp /mnt/source/file1* /mnt/destination1/ & \
cp /mnt/source/file2* /mnt/destination1/ & \
cp /mnt/source/file3* /mnt/destination1/ & \
cp /mnt/source/file4* /mnt/destination1/ & \
cp /mnt/source/file5* /mnt/destination1/ & \
cp /mnt/source/file6* /mnt/destination1/ & \
cp /mnt/source/file7* /mnt/destination1/ & \
cp /mnt/source/file8* /mnt/destination1/ & \
cp /mnt/source/file9* /mnt/destination1/

Kopírování dat s nestrukturovanými názvy souborů

Pokud struktura pojmenování souboru není předvídatelná, můžete soubory seskupit podle názvů adresářů.

Tento příklad shromažďuje celé adresáře, které se posílají příkazům cp spustit jako úlohy na pozadí:

/root
|-/dir1
| |-/dir1a
| |-/dir1b
| |-/dir1c
   |-/dir1c1
|-/dir1d

Po shromáždění souborů můžete spustit příkazy paralelního kopírování, které rekurzivně zkopírují podadresáře a veškerý jejich obsah:

cp /mnt/source/* /mnt/destination/
mkdir -p /mnt/destination/dir1 && cp /mnt/source/dir1/* mnt/destination/dir1/ &
cp -R /mnt/source/dir1/dir1a /mnt/destination/dir1/ &
cp -R /mnt/source/dir1/dir1b /mnt/destination/dir1/ &
cp -R /mnt/source/dir1/dir1c /mnt/destination/dir1/ & # this command copies dir1c1 via recursion
cp -R /mnt/source/dir1/dir1d /mnt/destination/dir1/ &

Kdy přidat přípojné body

Jakmile budete mít dostatek paralelních vláken směřujících na jeden přípojný bod systému souborů, bude existovat bod, kdy přidání dalších vláken neposkytuje větší propustnost. (Propustnost se bude měřit v souborech, sekundách nebo bajtech za sekundu v závislosti na typu dat.) Nebo horší může snížení propustnosti způsobit nadměrné podprocesy.

V takovém případě můžete přidat přípojné body na straně klienta do jiných adres připojení služby Azure HPC Cache pomocí stejné cesty připojení vzdáleného systému souborů:

10.1.0.100:/nfs on /mnt/sourcetype nfs (rw,vers=3,proto=tcp,addr=10.1.0.100)
10.1.1.101:/nfs on /mnt/destination1type nfs (rw,vers=3,proto=tcp,addr=10.1.1.101)
10.1.1.102:/nfs on /mnt/destination2type nfs (rw,vers=3,proto=tcp,addr=10.1.1.102)
10.1.1.103:/nfs on /mnt/destination3type nfs (rw,vers=3,proto=tcp,addr=10.1.1.103)

Přidáním přípojných bodů na straně klienta můžete zvětšovat další příkazy kopírování do dalších /mnt/destination[1-3] přípojných bodů a dosáhnout dalšího paralelismu.

Pokud jsou například vaše soubory velmi velké, můžete definovat příkazy kopírování pro použití odlišných cílových cest, paralelní odesílání dalších příkazů z klienta provádějícího kopírování.

cp /mnt/source/file0* /mnt/destination1/ & \
cp /mnt/source/file1* /mnt/destination2/ & \
cp /mnt/source/file2* /mnt/destination3/ & \
cp /mnt/source/file3* /mnt/destination1/ & \
cp /mnt/source/file4* /mnt/destination2/ & \
cp /mnt/source/file5* /mnt/destination3/ & \
cp /mnt/source/file6* /mnt/destination1/ & \
cp /mnt/source/file7* /mnt/destination2/ & \
cp /mnt/source/file8* /mnt/destination3/ & \

V předchozím příkladu jsou všechny tři cílové přípojné body cílem procesy kopírování klientského souboru.

Kdy přidat klienty

Pokud jste dosáhli schopností klienta, přidání dalších vláken kopírování nebo dalších přípojných bodů nezvýší žádné další soubory za sekundu ani bajty za sekundu. V takovém případě můžete nasadit dalšího klienta se stejnou sadou přípojných bodů, na kterých budou spuštěny vlastní sady procesů kopírování souborů.

Příklad:

Client1: cp -R /mnt/source/dir1/dir1a /mnt/destination/dir1/ &
Client1: cp -R /mnt/source/dir2/dir2a /mnt/destination/dir2/ &
Client1: cp -R /mnt/source/dir3/dir3a /mnt/destination/dir3/ &

Client2: cp -R /mnt/source/dir1/dir1b /mnt/destination/dir1/ &
Client2: cp -R /mnt/source/dir2/dir2b /mnt/destination/dir2/ &
Client2: cp -R /mnt/source/dir3/dir3b /mnt/destination/dir3/ &

Client3: cp -R /mnt/source/dir1/dir1c /mnt/destination/dir1/ &
Client3: cp -R /mnt/source/dir2/dir2c /mnt/destination/dir2/ &
Client3: cp -R /mnt/source/dir3/dir3c /mnt/destination/dir3/ &

Client4: cp -R /mnt/source/dir1/dir1d /mnt/destination/dir1/ &
Client4: cp -R /mnt/source/dir2/dir2d /mnt/destination/dir2/ &
Client4: cp -R /mnt/source/dir3/dir3d /mnt/destination/dir3/ &

Vytváření manifestů souborů

Po pochopení výše uvedených přístupů (více vláken kopírování na cíl, více cílů na klienta, více klientů na zdrojový systém souborů s podporou sítě), zvažte toto doporučení: Sestavení manifestů souborů a jejich následné použití s příkazy kopírování napříč více klienty.

Tento scénář používá příkaz systém UNIX find k vytvoření manifestů souborů nebo adresářů:

user@build:/mnt/source > find . -mindepth 4 -maxdepth 4 -type d
./atj5b55c53be6-01/support/gsi/2018-07-22T21:12:06EDT
./atj5b55c53be6-01/support/pcap/2018-07-23T01:34:57UTC
./atj5b55c53be6-01/support/trace/rolling
./atj5b55c53be6-03/support/gsi/2018-07-22T21:12:06EDT
./atj5b55c53be6-03/support/pcap/2018-07-23T01:34:57UTC
./atj5b55c53be6-03/support/trace/rolling
./atj5b55c53be6-02/support/gsi/2018-07-22T21:12:06EDT
./atj5b55c53be6-02/support/pcap/2018-07-23T01:34:57UTC
./atj5b55c53be6-02/support/trace/rolling

Přesměrujte tento výsledek na soubor: find . -mindepth 4 -maxdepth 4 -type d > /tmp/foo

Pak můžete iterovat manifest pomocí příkazů BASH ke zjištění počtu souborů a určení velikostí podadresářů:

ben@xlcycl1:/sps/internal/atj5b5ab44b7f > for i in $(cat /tmp/foo); do echo " `find ${i} |wc -l` `du -sh ${i}`"; done
244    3.5M    ./atj5b5ab44b7f-02/support/gsi/2018-07-18T00:07:03EDT
9      172K    ./atj5b5ab44b7f-02/support/gsi/stats_2018-07-18T05:01:00UTC
124    5.8M    ./atj5b5ab44b7f-02/support/gsi/stats_2018-07-19T01:01:01UTC
152    15M     ./atj5b5ab44b7f-02/support/gsi/stats_2018-07-20T01:01:00UTC
131    13M     ./atj5b5ab44b7f-02/support/gsi/stats_2018-07-20T21:59:41UTC_partial
789    6.2M    ./atj5b5ab44b7f-02/support/gsi/2018-07-20T21:59:41UTC
134    12M     ./atj5b5ab44b7f-02/support/gsi/stats_2018-07-20T22:22:55UTC_hpccache_catchup
7      16K     ./atj5b5ab44b7f-02/support/pcap/2018-07-18T17:12:19UTC
8      83K     ./atj5b5ab44b7f-02/support/pcap/2018-07-18T17:17:17UTC
575    7.7M    ./atj5b5ab44b7f-02/support/cores/armada_main.2000.1531980253.gsi
33     4.4G    ./atj5b5ab44b7f-02/support/trace/rolling
281    6.6M    ./atj5b5ab44b7f-01/support/gsi/2018-07-18T00:07:03EDT
15     182K    ./atj5b5ab44b7f-01/support/gsi/stats_2018-07-18T05:01:00UTC
244    17M     ./atj5b5ab44b7f-01/support/gsi/stats_2018-07-19T01:01:01UTC
299    31M     ./atj5b5ab44b7f-01/support/gsi/stats_2018-07-20T01:01:00UTC
256    29M     ./atj5b5ab44b7f-01/support/gsi/stats_2018-07-20T21:59:41UTC_partial
889    7.7M    ./atj5b5ab44b7f-01/support/gsi/2018-07-20T21:59:41UTC
262    29M     ./atj5b5ab44b7f-01/support/gsi/stats_2018-07-20T22:22:55UTC_hpccache_catchup
11     248K    ./atj5b5ab44b7f-01/support/pcap/2018-07-18T17:12:19UTC
11     88K     ./atj5b5ab44b7f-01/support/pcap/2018-07-18T17:17:17UTC
645    11M     ./atj5b5ab44b7f-01/support/cores/armada_main.2019.1531980253.gsi
33     4.0G    ./atj5b5ab44b7f-01/support/trace/rolling
244    2.1M    ./atj5b5ab44b7f-03/support/gsi/2018-07-18T00:07:03EDT
9      158K    ./atj5b5ab44b7f-03/support/gsi/stats_2018-07-18T05:01:00UTC
124    5.3M    ./atj5b5ab44b7f-03/support/gsi/stats_2018-07-19T01:01:01UTC
152    15M     ./atj5b5ab44b7f-03/support/gsi/stats_2018-07-20T01:01:00UTC
131    12M     ./atj5b5ab44b7f-03/support/gsi/stats_2018-07-20T21:59:41UTC_partial
789    8.4M    ./atj5b5ab44b7f-03/support/gsi/2018-07-20T21:59:41UTC
134    14M     ./atj5b5ab44b7f-03/support/gsi/stats_2018-07-20T22:25:58UTC_hpccache_catchup
7      159K    ./atj5b5ab44b7f-03/support/pcap/2018-07-18T17:12:19UTC
7      157K    ./atj5b5ab44b7f-03/support/pcap/2018-07-18T17:17:17UTC
576    12M     ./atj5b5ab44b7f-03/support/cores/armada_main.2013.1531980253.gsi
33     2.8G    ./atj5b5ab44b7f-03/support/trace/rolling

Nakonec musíte pro klienty vytvořit skutečné příkazy pro kopírování souborů.

Pokud máte čtyři klienty, použijte tento příkaz:

for i in 1 2 3 4 ; do sed -n ${i}~4p /tmp/foo > /tmp/client${i}; done

Pokud máte pětklientůch

for i in 1 2 3 4 5; do sed -n ${i}~5p /tmp/foo > /tmp/client${i}; done

A pro šest.... Extrapolovat podle potřeby.

for i in 1 2 3 4 5 6; do sed -n ${i}~6p /tmp/foo > /tmp/client${i}; done

Zobrazí se výsledné soubory N , jeden pro každého klienta N , který má názvy cest k adresářům úrovně čtyři získané jako součást výstupu find příkazu.

Pomocí každého souboru sestavte příkaz pro kopírování:

for i in 1 2 3 4 5 6; do for j in $(cat /tmp/client${i}); do echo "cp -p -R /mnt/source/${j} /mnt/destination/${j}" >> /tmp/client${i}_copy_commands ; done; done

Výše uvedené soubory vám poskytnou N soubory, každý s příkazem pro kopírování na řádek, který lze spustit jako skript BASH v klientovi.

Cílem je souběžně spouštět více vláken těchto skriptů na jednotlivých klientech paralelně na více klientech.