2013-05-21 8 views
9

Przechowuję pliki w HDFS w formacie kompresji Snappy. Chciałbym móc przeanalizować te pliki w lokalnym systemie plików systemu Linux, aby upewnić się, że proces Hadoop, który je utworzył, działał poprawnie.Jak mogę odczytać skompresowane pliki Snappy na HDFS bez korzystania z Hadoop?

Po skopiowaniu ich lokalnie i podjęciu próby ich usunięcia przy użyciu standardowej libary Google, oznacza to, że w pliku brakuje identyfikatora Snappy. Kiedy próbuję to obejść, wstawiając identyfikator Snappy, uruchamia on sumę kontrolną.

Co mogę zrobić, aby przeczytać te pliki bez konieczności pisania osobnego programu Hadoop lub przekazywania go przez coś podobnego do Hive?

Odpowiedz

20

I w końcu okazało się, że mogę użyć następującego polecenia, aby odczytać zawartość skompresowanego pliku Snappy na HDFS:

hadoop fs -text filename 

Jeżeli intencją jest, aby pobrać plik w formacie tekstowym do przeprowadzenia dodatkowej analizy i przetwarzania , wyjście tej komendy może zostać podłączone do pliku w systemie lokalnym. Możesz także użyć nagłówka, aby wyświetlić tylko kilka pierwszych wierszy pliku.

+0

Jak mogę to zrobić programowo w scala lub java? – Bunder

+0

Aby programowo zapisywać do pliku Snappy, należy zaimportować klasę kodek Snappy i pobrać instancję tej klasy w ramach konfiguracji odwzorowania lub reduktora. Musisz przekazać swój strumień wyjściowy przez funkcję "createOutputStream" kodeka, aby uzyskać zakodowany strumień wyjściowy. Oto fragment. Odczyt jest taki sam na odwrocie: kodek = (CompressionCodec) ReflectionUtils.newInstance (codecClass, conf); fileOut = fs.create (targetPath, false); thiswriter = new LineRecordWriter (new DataOutputStream (codec.createOutputStream (fileOut))); –

2

Proszę spojrzeć na this post on Cloudera blog. Wyjaśnia, jak używać Snappy z Hadoop. Zasadniczo, Snappy pliki na nieprzetworzonym tekście nie są podzielne, więc nie można odczytać jednego pliku na wielu hostach.

Rozwiązaniem jest użycie Snappy w formacie kontenera, więc zasadniczo używasz Hadoop SequenceFile z zestawem kompresji jako Snappy. Zgodnie z opisem in this answer można ustawić właściwość mapred.output.compression.codec na org.apache.hadoop.io.compress.SnappyCodec i ustawić format wyjściowy zadania jako SequenceFileOutputFormat.

A następnie, aby go przeczytać, należy użyć tylko SequenceFile.Reader, ponieważ informacje o kodeku są przechowywane w nagłówku pliku.

+1

Dzięki, Charles, ale nie sądzę, że to odpowiada na moje pytanie. Pozwól mi to uprościć. Używam hadoop fs -get filename, aby przenieść plik z HDFS do mojego lokalnego katalogu w systemie Linux. Teraz, gdy mam go tutaj, dlaczego nie mogę użyć snappy bibliotek do dekompresji? –

0

To dlatego, że Snappy używane przez hadoop ma więcej meta danych, które nie są niezauważane przez biblioteki takie jak https://code.google.com/p/snappy/, Musisz użyć mitroop natywnego snappy, aby usunąć plik danych, który pobrałeś.

+0

Czy możesz być trochę bardziej konkretny? Zamierzam zrobić to z interfejsu hadoop fs, jeśli to możliwe. –

Powiązane problemy