Jaki jest najszybszy sposób na skopiowanie 400G plików z woluminu magazynu elastycznych bloków ec2 na s3?


21

Muszę skopiować 400G plików z elastycznego magazynu bloków do wiadra s3 ... To około 300 tysięcy plików ~ 1Mb

Próbowałem s3cmd i s3fuse , oba są naprawdę, bardzo powolne .. s3cmd działał przez cały dzień, powiedział, że skończył kopiowanie, a kiedy sprawdziłem wiadro, nic się nie stało (przypuszczam, że coś poszło nie tak, ale przynajmniej s3cmd nigdy na nic nie narzekał)

S3Fuse pracuje przez kolejny pełny dzień i skopiował mniej niż 10% plików ...

Czy jest na to lepsze rozwiązanie?

Oczywiście używam Linuksa (ubuntu 12.04)


2
Wiele testów porównawczych (np. Ten ) wykazało 3 czynniki decydujące o przepustowości do S3: 1) rozmiar pliku 2) liczba równoległych wątków i 3) rozmiar wystąpienia. Od 64 do 128 równoległych (równoczesnych) przesyłania obiektów o wielkości 1 MB powinno nasycić łącze wysyłające 1 Gb / s, które ma m1.xlarge, a nawet nasycić łącze wysyłające 10 Gb / s instancji obliczeń klastra (cc1.4xlarge). Mając to na uwadze, powinno być wiele skryptów (np. Ta lub modyfikacja
s3cmd

1
s3-parallel-put załatwiło sprawę!
aseba

Odpowiedzi:


20

Istnieje kilka kluczowych czynników, które określają przepustowość z EC2 do S3:

  • Rozmiar pliku - mniejsze pliki wymagają większej liczby żądań oraz większego obciążenia i transferu wolniej. Przyrost rozmiaru pliku (gdy pochodzi z EC2) jest nieistotny dla plików większych niż 256kB. (Podczas gdy przenoszenie z odległej lokalizacji, z większym opóźnieniem, wykazuje tendencję do dalszego wykazywania znacznej poprawy aż do poziomu między 1MiB a 2MiB).
  • Liczba równoległych wątków - pojedynczy wątek wysyłania zwykle ma dość niski poziom - często poniżej 5 Mb / s. Przepustowość wzrasta wraz z liczbą współbieżnych wątków i ma tendencję szczytową między 64 a 128 wątków. Należy zauważyć, że większe instancje są w stanie obsłużyć większą liczbę współbieżnych wątków.
  • Rozmiar instancji - zgodnie ze specyfikacją instancji , większe instancje mają więcej dedykowanych zasobów, w tym większą (i mniej zmienną) alokację przepustowości sieci (i ogólnie We / Wy - łącznie z odczytem z dysków efemerycznych / EBS - które są podłączone do sieci. Wartości liczbowe dla każdej kategorii to:
    • Bardzo wysoka: Teoretyczna: 10 Gb / s = 1250 MB / s; Realistyczny: 8,8 Gb / s = 1100 MB / s
    • Wysoka: Teoretyczna: 1 Gb / s = 125 MB / s; Realistyczny: 750 Mb / s = 95 MB / s
    • Umiarkowany: Teoretyczny: 250 Mb / s; Realistyczny: 80 Mb / s = 10 MB / s
    • Niski: Teoretyczny: 100 Mb / s; Realistyczne: 10-15 Mb / s = 1-2 MB / s

W przypadku przesyłania dużych ilości danych może być ekonomicznie praktyczne zastosowanie instancji obliczeń klastrowych, ponieważ efektywny wzrost przepustowości (> 10x) jest większy niż różnica kosztów (2-3x).

Chociaż powyższe pomysły są dość logiczne (chociaż ograniczenie liczby wątków może nie być), dość łatwo jest znaleźć wzorce, które je popierają. Jeden szczególnie szczegółowy można znaleźć tutaj .

Używanie od 64 do 128 równoległych (równoczesnych) przesyłanych obiektów 1 MB powinno nasycić łącze wysyłające 1 Gb / s, które ma m1.xlarge, a nawet nasycić łącze wysyłające 10 Gb / s instancji obliczeń klastra (cc1.4xlarge).

Chociaż zmiana wielkości instancji jest dość łatwa, pozostałe dwa czynniki mogą być trudniejsze do zarządzania.

  • Rozmiar pliku jest zazwyczaj ustalony - nie możemy łączyć plików w EC2 i rozdzielać je na S3 (więc niewiele możemy zrobić z małymi plikami). Duże pliki możemy jednak rozdzielić po stronie EC2 i ponownie złożyć po stronie S3 (przy użyciu przesyłania częściowego S3). Zazwyczaj jest to korzystne w przypadku plików większych niż 100 MB.
  • Równoległe wątki są nieco trudniejsze do zaspokojenia. Najprostsze podejście sprowadza się do napisania opakowania dla istniejącego skryptu przesyłania, który będzie uruchamiał wiele jego kopii jednocześnie. Lepsze podejścia wykorzystują API bezpośrednio do osiągnięcia czegoś podobnego. Pamiętając, że kluczem są równoległe żądania, nie jest trudno zlokalizować kilka potencjalnych skryptów, na przykład:
    • modyfikacja s3cmd - rozwidlenie wczesnej wersji s3cmd, która dodała tę funkcjonalność, ale nie była aktualizowana od kilku lat.
    • s3-parallel-put - stosunkowo nowy skrypt Pythona, który działa dobrze

8

Tak więc, po wielu testach s3-równolegle postawiony sposób zadziałał niesamowicie. Oczywiście rozwiązanie, jeśli musisz przesłać wiele plików do S3. Dzięki cyberx86 za komentarze.


3
Z ciekawości a) ile czasu zajęło przesłanie 400 GB b) ile wątków użyłeś c) jakiego rozmiaru instancji użyłeś?
cyberx86

1
@ Cyberx86 Ostatnio użyłem s3-równolegle w dużej instancji Ec2. Użyłem 5 wątków i skopiowałem 288,73 GB w 10,49 godziny.
Gortron


2

W tym celu napisałem zoptymalizowaną aplikację konsolową w języku C # ( CopyFasterToS3 ). Użyłem w EBS vol, i moim przypadku miał 5 folderów z ponad 2 milionami plików w ilości 20 GB. Skrypt został wykonany w mniej niż 30 minut.

W tym artykule pokazałem, jak korzystać z funkcji rekurencyjnej równolegle. Możesz zapisać go na inny język.

Powodzenia!




Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.