2011-09-20 19 views
23

Używam gałęzi nad EMR, i trzeba skopiować niektóre pliki do wszystkich instancji EMR.Jak skopiować pliki z S3 do Amazon EMR HDFS?

Jednym ze sposobów, jak rozumiem, jest po prostu skopiowanie plików do lokalnego systemu plików na każdym węźle, drugi jest do kopiowania plików do HDFS, jednak nie znalazłem prostego sposobu na kopiowanie Stright z S3 do HDFS.

Jaki jest najlepszy sposób na rozwiązanie tego problemu?

Odpowiedz

26

najlepszym sposobem, aby to zrobić, jest użycie polecenia distcp Hadoop. Przykład (w jednym z węzłów w klastrze)

% ${HADOOP_HOME}/bin/hadoop distcp s3n://mybucket/myfile /root/myfile

To kopiowanie plików zwanego mójplik z S3 wiadra nazwie mybucket do /root/myfile w HDFS. Zauważ, że ten przykład zakłada, że ​​używasz systemu plików S3 w trybie "natywnym"; oznacza to, że Hadoop widzi każdy obiekt w S3 jako plik. Jeśli użyjesz S3 w trybie blokowym, zastąpisz s3n s3 w powyższym przykładzie. Aby uzyskać więcej informacji na temat różnic między natywnym S3 i trybem bloku, a także omówienie na powyższym przykładzie, zobacz http://wiki.apache.org/hadoop/AmazonS3.

Odkryłem, że distcp jest bardzo potężnym narzędziem. Oprócz tego, że można go używać do kopiowania dużej liczby plików zi do S3, można również wykonywać szybkie kopie klastra z dużymi zestawami danych. Zamiast przesyłać wszystkie dane przez jeden węzeł, distcp używa wielu węzłów równolegle do wykonania transferu. To sprawia, że ​​distcp jest znacznie szybszy przy transferze dużych ilości danych, w porównaniu z alternatywą kopiowania wszystkiego do lokalnego systemu plików jako pośrednika.

+0

nadal pojawia się błąd podczas przenoszenia s3 do hdfs za pomocą distcp. w moim przypadku staram się przesuwać bardzo duży plik (ponad 300GB) po przeniesieniu 40 lub 50% na początek, nie wiem dlaczego. dowolny pomysł?? – rht

3

Należy zauważyć, że zgodnie z Amazon, w http://docs.amazonwebservices.com/ElasticMapReduce/latest/DeveloperGuide/FileSystemConfig.html „Amazon Elastic MapReduce - plik konfiguracyjny systemu”, Blok S3 FileSystem jest przestarzała i jego przedrostek URI jest teraz s3bfs: // i oni specjalnie zniechęcić go używać, ponieważ „może wyzwolić stan wyścigu, który może spowodować, że twój przepływ pracy się nie powiedzie ".

Zgodnie z tą samą stroną, HDFS jest teraz systemem plików "pierwszej klasy" pod S3, chociaż jest efemeryczny (znika po zakończeniu zadań Hadoop).

15

Teraz sama Amazon posiada owijkę zaimplementowaną przez distcp, a mianowicie: s3distcp.

S3DistCp jest przedłużeniem DistCp który jest zoptymalizowany do pracy z Amazon Web Services (AWS), zwłaszcza Amazon Simple Service Storage (Amazon S3). Używasz S3DistCp, dodając go jako krok w przepływie pracy. Korzystając z S3DistCp, można efektywnie kopiować duże ilości danych z Amazon S3 do HDFS, gdzie można je przetwarzać przez kolejne kroki w przebiegu pracy Amazon Elastic MapReduce (Amazon EMR). Można również użyć S3DistCp skopiować dane między wiadra Amazon S3 lub HDFS Amazon S3 plików

Przykład skopiować log z Amazon S3 do HDFS

Ten Poniższy przykład ilustruje sposób kopiowania plików dziennika przechowywane w wiadrze Amazon S3 w HDFS. W tym przykładzie opcja --srcPattern służy do ograniczenia danych skopiowanych do logów demona.

elastic-mapreduce --jobflow j-3GY8JC4179IOJ --jar \ 
s3://us-east-1.elasticmapreduce/libs/s3distcp/1.latest/s3distcp.jar \ 
--args '--src,s3://myawsbucket/logs/j-3GY8JC4179IOJ/node/,\ 
--dest,hdfs:///output,\ 
--srcPattern,.*daemons.*-hadoop-.*'