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!
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
hadoop fs -getmerge <dir_of_input_files> <mergedsinglefile>
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!
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.
Vous pouvez utiliser l'outil HDFSConcat , nouveau dans HDFS 0.21, pour effectuer cette opération sans encourir le coût d'une copie.
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
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')
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.