web-dev-qa-db-fra.com

Fusion de plusieurs fichiers en un seul dans Hadoop

J'obtiens plusieurs petits fichiers dans mon répertoire d'entrée que je veux fusionner en un seul fichier sans utiliser le système de fichiers local ou écrire des mapreds. Existe-t-il un moyen de le faire en utilisant les commandes hadoof fs ou Pig?

Merci!

31
uHadoop

Afin de garder tout sur la grille, utilisez le streaming hadoop avec un seul réducteur et un seul chat comme mappeur et réducteur (essentiellement un noop) - ajoutez une compression à l'aide de drapeaux MR.

hadoop jar \
    $HADOOP_PREFIX/share/hadoop/tools/lib/hadoop-streaming.jar \<br>
    -Dmapred.reduce.tasks=1 \
    -Dmapred.job.queue.name=$QUEUE \
    -input "$INPUT" \
    -output "$OUTPUT" \
    -mapper cat \
    -reducer cat

Si vous voulez ajouter de la compression
- Dmapred.output.compress = true\-Dmapred.output.compression.codec = org.Apache.hadoop.io.compress.GzipCodec

22
Guy B
hadoop fs -getmerge <dir_of_input_files> <mergedsinglefile>
15
Harsha Hulageri

ok ... J'ai trouvé un moyen d'utiliser hadoop fs commandes -

hadoop fs -cat [dir]/* | hadoop fs -put - [destination file]

Cela a fonctionné quand je l'ai testé ... des pièges auxquels on peut penser?

Merci!

7
uHadoop

Si vous configurez Fuse pour monter votre HDFS dans un répertoire local, votre sortie peut être le système de fichiers monté.

Par exemple, j'ai notre HDFS monté sur /mnt/hdfs localement. J'exécute la commande suivante et cela fonctionne très bien:

hadoop fs -getmerge /reports/some_output /mnt/hdfs/reports/some_output.txt

Bien sûr, il existe d'autres raisons d'utiliser Fuse pour monter HDFS dans un répertoire local, mais cela a été un effet secondaire agréable pour nous.

2
user609254

Vous pouvez utiliser l'outil HDFSConcat , nouveau dans HDFS 0.21, pour effectuer cette opération sans encourir le coût d'une copie.

1

Si vous travaillez dans le cluster Hortonworks et que vous souhaitez fusionner plusieurs fichiers présents dans l'emplacement HDFS dans un seul fichier, vous pouvez exécuter le pot 'hadoop-streaming-2.7.1.2.3.2.0-2950.jar' qui exécute un seul réducteur et obtenir le fichier fusionné dans l'emplacement de sortie HDFS.

$ hadoop jar /usr/hdp/2.3.2.0-2950/hadoop-mapreduce/hadoop-streaming-2.7.1.2.3.2.0-2950.jar \

-Dmapred.reduce.tasks=1 \
-input "/hdfs/input/dir" \
-output "/hdfs/output/dir" \
-mapper cat \
-reducer cat

Vous pouvez télécharger ce pot à partir de Obtenir le pot de streaming hadoop

Si vous écrivez des travaux spark et souhaitez obtenir un fichier fusionné pour éviter plusieurs créations RDD et goulots d'étranglement des performances, utilisez ce morceau de code avant de transformer votre RDD

sc.textFile("hdfs://...../part*).coalesce(1).saveAsTextFile("hdfs://...../filename)

Cela fusionnera tous les fichiers de pièce en un seul et l'enregistrera à nouveau dans l'emplacement hdfs

1
khushbu kanojia

En abordant cela du point de vue d'Apache Pig,

Pour fusionner deux fichiers avec un schéma identique via Pig, la commande UNION peut être utilisée

 A = load 'tmp/file1' Using PigStorage('\t') as ....(schema1)
 B = load 'tmp/file2' Using PigStorage('\t') as ....(schema1) 
 C = UNION A,B
 store C into 'tmp/fileoutput' Using PigStorage('\t')
0
Greturncodezero

Toutes les solutions équivalent à faire un

hadoop fs -cat [dir]/* > tmp_local_file  
hadoop fs -copyFromLocal tmp_local_file 

cela signifie seulement que les E/S locales m/c sont sur le chemin critique du transfert de données.

0
samurai