2015-07-24 49 views
10

Diciamo che ho questa struttura su HDFS:fusione di più LZO file compressi su HDFS

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

    Name1_2015.lzo 

Vorrei unire ogni file di ogni directory 'dir2' e aggiungere il risultato al file in/dir1 /DirName.lzo

ad esempio, per/dir1/dir2/Name1_2015, voglio unire file1.lzo, file2.lzo, file3.lzo e aggiungerlo al /dir1/Name1_2015.lzo

Ogni file sono compressi LZO.

Come posso farlo?

Grazie

risposta

1

Si può cercare di archiviare tutti i singoli file LZO in HAR (Hadoop Archivio). Penso che il suo overhead per unire tutti i file in singolo LZO.

+0

Conosco il suo overhead per unire tutti i file, ma ho davvero bisogno di un singolo file unito per elaborarlo successivamente – guillaume

2

Se non si cura molto di parallelismo ecco una bash one-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 

È possibile estrarre tutti i file in parallelo usando la mappa-ridurre. Ma come si crea un archivio da più file in parallelo? Per quanto ne so, non è possibile scrivere su un singolo file HDFS da più processi contemporaneamente. Quindi, dato che non è possibile, creiamo comunque una soluzione a nodo singolo.

+0

Con questo script i dati vengono tirati su un nodo locale e poi trasferiti su HDFS, giusto? C'è un modo per evitare di recuperare tutti i dati su un singolo nodo, unendo quindi il file unito? – guillaume

+0

Ho modificato la mia risposta –

+0

Anche se voglio aggiungere non è possibile? Siccome è LZO compresso, devo decomprimere il file principale accludendolo e ricomprandolo. Non posso aggiungere direttamente LZO a causa di intestazioni, giusto? – guillaume

2

vorrei farlo con Hive, come segue:

  1. Rinominare le sottodirectory per name = 1_2015 e name = 2_2015

  2. CREATE TABLE ESTERNA sending_table ( stringa all_content ) partizionato BY (stringa nome) POSIZIONE "/ dir1/dir2" FORMATO ROW DELIMITATO CAMPI TERMINATO DA {un delimitatore di colonna che si sa non compare in nessuna riga}

  3. Creare una seconda tabella simile alla prima, denominata "ricezione", ma senza partizioni e in una directory diversa.

  4. Esegui questo:

    mapreduce.job.reduces set = 1 # questo garantisce che farà un file SET mapreduce.output.fileoutputformat.compress.codec = com.hadoop.compression.lzo.LzopCodec SET hive.exec.compress.output = true SET mapreduce.output.fileoutputformat.compress = true

    inserimento nella tabella di ricevere selezionare all_content da sending_table