2014-05-20 9 views
5

Chcę skopiować plik test.tar.gz z S3 na HDFS. Można to zrobić za pomocą distcp lub s3distcp. Ale moim wymaganiem jest to, że podczas przesyłania plików do HDFS powinienem wyodrębnić je w locie, aw HDFS powinienem mieć tylko wyodrębnione pliki nie tar.gz.Skopiuj i rozpakuj pliki z s3 na HDFS

Wszelkie sugestie proszę.

Odpowiedz

0

Na czym polega problem z używaniem skryptu bash? Mam na myśli:

s3distcp --src [file-location] --dst . #Without the hdfs prefix 
tar -zxvf test.tar.gz 
hadoop fs -mkdir /input 
hadoop fs -mkdir /input/test 
hadoop fs -copyFromLocal test/ /input/test 
+0

To jest dobra opcja. Ale nie powinienem używać żadnego lokalnego systemu plików do umieszczania pliku tar.gz. Jest to plik tar.gz w S3 i wyodrębniona struktura katalogów z plikami tylko w HDFS. – Ilango

+1

tak i nie jest to również skalowalne – mtariq

2

Podczas transferu przez sieć zazwyczaj najlepiej jest, gdy pliki pozostają skompresowane. Wyobraź sobie, że zamiast przesyłać skompresowany plik bz2 o pojemności 20 GB, przesyłasz 100 GB. Proponuję użyć kodu opartego na API Hadoop lub programu MapReduce do wypakowania skompresowanych plików po przeniesieniu do HDFS. Raz w HDFS, masz wszystko, aby wyodrębnić pliki bez kopiowania ich do lokalnego systemu plików.

  1. Jednym rozwiązaniem mogłoby być użycie prostego kodu Hadoop API based lub MapReduce code (updated) że dekompresji równolegle.

    Dodatek: W przypadku ZIP można śledzić numer this link. I możesz wymyślić coś podobnego do tar.gz.

  2. W przypadku, gdy rozmiar pliku jest ogromna 100GB.zip, prawdopodobnie można użyć Hadoop API based program który odczytuje strumień archiwum ZIP, Ekstrakty (check this link dla jak to miało miejsce w ZipFileRecordReader w uzupełnieniu wyżej), a następnie zapisać go z powrotem do HDFS. Myślę, że pojedynczy plik ZIP nie jest rozdzielany i można go wyodrębnić równolegle (jeśli się nie mylę). Tak więc, jeśli masz archiwum zip 100 GB, prawdopodobnie nie będziesz w stanie wykorzystać pełnego potencjału programu MapReduce. Dlatego nie używaj go.

  3. Innym rozwiązaniem jest nie dekompresja. Dla różnych wbudowanych skompresowanych formatów, Hadoop ma narzędzie wiersza poleceń, które pomaga przeglądać skompresowane pliki, tak jak jest to, jeśli masz zamiar zachować to nieskompresowane w HDFS.

    Hadoop fs -text /path/fileinHDFS.bz2"

+0

Nie można uzyskać dostępu do kodu MapReduce. Formaty kompresji nie działają z plikami tar ani zip. Dekompresja na HDFS jest świetna, ale możesz udostępnić kod dla tar/zip. (istniała metoda unTar, ale nie wydaje się działać na HDFS). – mtariq

+0

Dodałem aneks powyżej. Proszę sprawdzić. –

+0

Nie przydatne, ponieważ mój przypadek to 100-y suwaka GB (wyodrębnionego do 600GB), więc potrzebuję możliwego sposobu rozpakowania w HDFS (jako pobieranie pliku z distcp do HDFS) – mtariq

0

Powinieneś być w stanie osiągnąć to z jakiegoś sprytnego rurociągów ...

Coś jak ten (całkowicie niesprawdzone):

s3cmd get [s3 path] - | tar -zxfO | hadoop dfs -put - [hadoop path] 

s3cmd get [s3 path] - pobiera plik z S3 i rur to na stdout (-). tar -zxfO pobiera potokową zawartość pliku ze standardowego wejścia i wypakowuje ją na standardowe wyjście (opcja -O). hadoop dfs -put - [hadoop path] umieszcza potok w danych pochodzących ze stdin (-) w podanym pliku HDFS.

+0

Potok nie będzie działał z suwakiem, a drugi, jeśli tar ma więcej niż jeden plik, to się połączy i stanie się nim. – mtariq

Powiązane problemy