Pozyskiwanie danych usługi Azure HPC Cache — metoda ręcznego kopiowania
Ten artykuł zawiera szczegółowe instrukcje ręcznego kopiowania danych do kontenera usługi Blob Storage do użycia z usługą Azure HPC Cache. Używa ona wielowątowych operacji równoległych do optymalizacji szybkości kopiowania.
Aby dowiedzieć się więcej na temat przenoszenia danych do usługi Blob Storage dla usługi Azure HPC Cache, przeczytaj Przenoszenie danych do usługi Azure Blob Storage.
Przykład prostego kopiowania
Możesz ręcznie utworzyć kopię wielowątkową na kliencie, uruchamiając jednocześnie więcej niż jedno polecenie kopiowania w tle względem wstępnie zdefiniowanych zestawów plików lub ścieżek.
Polecenie Linux/system UNIX cp
zawiera argument -p
umożliwiający zachowanie własności i metadanych mtime. Dodanie tego argumentu do poniższych poleceń jest opcjonalne. (Dodanie argumentu zwiększa liczbę wywołań systemu plików wysyłanych z klienta do docelowego systemu plików w celu modyfikacji metadanych).
Ten prosty przykład kopiuje dwa pliki równolegle:
cp /mnt/source/file1 /mnt/destination1/ & cp /mnt/source/file2 /mnt/destination1/ &
Po wydaniu jobs
tego polecenia polecenie pokaże, że dwa wątki są uruchomione.
Kopiowanie danych z przewidywalnymi nazwami plików
Jeśli nazwy plików są przewidywalne, możesz użyć wyrażeń do tworzenia równoległych wątków kopiowania.
Jeśli na przykład katalog zawiera 1000 plików, które są numerowane sekwencyjnie z 0001
do 1000
, możesz użyć następujących wyrażeń, aby utworzyć 10 równoległych wątków, które każdy kopiuje 100 plików:
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/
Kopiowanie danych z nazwami plików bez struktury
Jeśli struktura nazewnictwa plików nie jest przewidywalna, możesz grupować pliki według nazw katalogów.
W tym przykładzie zbierane są całe katalogi do wysyłania do cp
poleceń uruchamianych jako zadania w tle:
/root
|-/dir1
| |-/dir1a
| |-/dir1b
| |-/dir1c
|-/dir1c1
|-/dir1d
Po zebraniu plików można uruchamiać równoległe polecenia kopiowania, aby rekursywnie kopiować podkatalogi i całą ich zawartość:
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/ &
Kiedy dodać punkty instalacji
Po dokonaniu wystarczającej liczby równoległych wątków w jednym docelowym punkcie instalacji systemu plików będzie istnieć punkt, w którym dodanie większej liczby wątków nie zapewnia większej przepływności. (Przepływność będzie mierzona w plikach/sekundach lub bajtach/sekundach w zależności od typu danych). Co gorsza, nadmierne wątkowanie może czasami spowodować obniżenie przepływności.
W takim przypadku można dodać punkty instalacji po stronie klienta do innych adresów instalacji usługi Azure HPC Cache przy użyciu tej samej ścieżki instalacji zdalnego systemu plików:
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)
Dodanie punktów instalacji po stronie klienta umożliwia rozwidlenie dodatkowych poleceń kopiowania do dodatkowych /mnt/destination[1-3]
punktów instalacji, co zapewnia dalszy równoległość.
Jeśli na przykład pliki są bardzo duże, możesz zdefiniować polecenia kopiowania, aby używać odrębnych ścieżek docelowych, wysyłając równolegle więcej poleceń od klienta wykonującego kopię.
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/ & \
W powyższym przykładzie wszystkie trzy punkty instalacji docelowej są objęte procesami kopiowania plików klienta.
Kiedy dodać klientów
Na koniec po osiągnięciu możliwości klienta dodanie kolejnych wątków kopiowania lub dodatkowych punktów instalacji nie spowoduje zwiększenia liczby dodatkowych plików/s lub bajtów na sekundę. W takiej sytuacji można wdrożyć innego klienta z tym samym zestawem punktów instalacji, które będą uruchamiać własne zestawy procesów kopiowania plików.
Przykład:
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/ &
Tworzenie manifestów plików
Po zrozumieniu powyższych podejść (wiele wątków kopiowania na miejsce docelowe, wiele miejsc docelowych na klienta, wielu klientów na system plików źródłowych dostępnych dla sieci), rozważ następujące zalecenie: Kompilowanie manifestów plików, a następnie używanie ich z poleceniami kopiowania w wielu klientach.
W tym scenariuszu użyto polecenia system UNIX find
w celu utworzenia manifestów plików lub katalogów:
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
Przekieruj ten wynik do pliku: find . -mindepth 4 -maxdepth 4 -type d > /tmp/foo
Następnie można iterować za pośrednictwem manifestu, używając poleceń BASH do zliczenia plików i określenia rozmiarów podkatalogów:
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
Na koniec należy utworzyć rzeczywiste polecenia kopiowania plików do klientów.
Jeśli masz czterech klientów, użyj następującego polecenia:
for i in 1 2 3 4 ; do sed -n ${i}~4p /tmp/foo > /tmp/client${i}; done
Jeśli masz pięciu klientów, użyj czegoś podobnego do następującego:
for i in 1 2 3 4 5; do sed -n ${i}~5p /tmp/foo > /tmp/client${i}; done
I na sześć.... Ekstrapoluj zgodnie z potrzebami.
for i in 1 2 3 4 5 6; do sed -n ${i}~6p /tmp/foo > /tmp/client${i}; done
Otrzymasz N plików wynikowych, po jednym dla każdego klienta N, który ma nazwy ścieżek do poziomów czterech katalogów uzyskanych w ramach danych wyjściowych polecenia find
.
Użyj każdego pliku, aby skompilować polecenie kopiowania:
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
Powyższe polecenie da N plików, z których każdy ma polecenie kopiowania w każdym wierszu, które można uruchomić jako skrypt powłoki BASH na kliencie.
Celem jest jednoczesne uruchamianie wielu wątków tych skryptów na klienta równolegle na wielu klientach.