2015-07-24 18 views
10

Powiedzmy mam tej struktury na HDFS:łączenie kilku LZO skompresowane pliki na HDFS

/dir1 
    /dir2 
     /Name1_2015/ 
      file1.lzo 
      file2.lzo 
      file3.lzo 
     /Name2_2015 
      file1.lzo 
      file2.lzo 

    Name1_2015.lzo 

chciałbym połączyć każdy plik każdego katalogu w „dir2” i dołącz wynik do pliku w/dir1 /DirName.lzo

na przykład,/dir1/dir2/Name1_2015, chcę scalić file1.lzo, file2.lzo, file3.lzo i dołączyć go do /dir1/Name1_2015.lzo

poszczególnych plików są skompresowane LZO.

Jak mogę to zrobić?

Dzięki

Odpowiedz

1

Można próbować archiwizować wszystkie poszczególne pliki LZO w HAR (Hadoop archiwum). Myślę, że jego narzut, aby połączyć wszystkie pliki w jednym LZO.

+0

Wiem, narzut na to, aby scalić wszystkie pliki, ale naprawdę potrzebuję single pojedynczego scalonego pliku do przetworzenia później – guillaume

2

Jeśli nie przejmował się równoległości oto jeden bash-liner:

for d in `hdfs dfs -ls /dir2 | grep -oP '(?<=/)[^/]+$'` ; do hdfs dfs -cat /dir2/$d/*.lzo | lzop -d | lzop | hdfs dfs -put - /dir1/$d.lzo ; done 

Można wyodrębnić wszystkie pliki równolegle za pomocą map-zredukować. Ale jak utworzyć jedno archiwum z wielu plików jednocześnie? O ile mi wiadomo, nie jest możliwe jednoczesne zapisywanie do jednego pliku HDFS z wielu procesów. Tak więc, ponieważ nie jest możliwe, wymyślimy rozwiązanie z jednym węzłem.

+0

Z tym skryptem dane są wyciągane do lokalnego węzła, a następnie przekazywane do HDFS, prawda? Czy istnieje sposób na uniknięcie pobierania wszystkich danych do pojedynczego węzła, łączenie, a następnie popychanie scalonego pliku? – guillaume

+0

Edytowałem moją odpowiedź –

+0

Nawet jeśli chcę dołączyć, to nie jest możliwe? Ponieważ jest skompresowany LZO, muszę zdekompresować główny plik do niego, a następnie ponownie skompresować. Nie mogę bezpośrednio dołączyć LZO z powodu nagłówków, prawda? – guillaume

2

chciałbym to zrobić z ula, co następuje:

  1. Zmiana nazwy podkatalogów nazwa = 1_2015 a name = 2_2015

  2. CREATE TABLE EXTERNAL sending_table ( all_content ciąg ) PARTITIONED BY (ciąg znaków) LOKALIZACJA "/ dir1/dir2" ROW FORMAT DELIMIDOWANE POLA ZAKOŃCZONE PRZEZ {a ogranicznik kolumny, o którym wiadomo, że nie pojawia się w żadnej z linii}

  3. Utwórz drugą tabelę, która wygląda jak pierwsza, o nazwie "odbiór", ale bez żadnych partycji i w innym katalogu.

  4. Run to:

    SET mapreduce.job.reduces = 1 # to gwarantuje to będzie zrobić jeden plik SET mapreduce.output.fileoutputformat.compress.codec = com.hadoop.compression.lzo.LzopCodec SET hive.exec.compress.output = true SET mapreduce.output.fileoutputformat.compress = true

    wkładki do stołu odbiorczego wybierz all_content z sending_table

Powiązane problemy