2010-12-13 25 views
6

Je collectionne les logs avec Flume sur le HDFS. Pour le cas de test, j'ai de petits fichiers (~ 300kB) parce que le processus de collecte de journaux a été mis à l'échelle pour l'utilisation réelle.Quelle est la manière la plus simple de combiner de petits blocs HDFS?

Existe-t-il un moyen facile de combiner ces petits fichiers en plus gros fichiers qui sont plus proches de la taille du bloc HDFS (64 Mo)?

+0

Souhaitez-vous combiner des fichiers pour le stockage ou pour l'entrée de travaux mapreduce? – wlk

+0

Existe-t-il un moyen de les combiner du point de vue d'un mappeur? –

+0

Je voudrais les combiner pour le stockage –

Répondre

5

Le coreutils GNU divisé pourrait faire le travail.

Si les données sources sont des lignes - dans mon cas, ils sont - et une ligne est d'environ 84 bytes, puis un HDFS bloc 64MB pourrait contenir autour 800000 lignes:

hadoop dfs -cat /sourcedir/* | split --lines=800000 - joined_ 
hadoop dfs -copyFromLocal ./joined_* /destdir/ 

ou avec --line-bytes l'option:

hadoop dfs -cat /sourcedir/* | split --line-bytes=67108864 - joined_ 
hadoop dfs -copyFromLocal ./joined_* /destdir/ 
+0

btw Je pourrais imaginer une commande hadoop pour faire la même chose, donc si quelqu'un est intéressé, la question est toujours ouverte. –

3

Ma solution actuelle consiste à écrire un travail MapReduce qui ne fait rien, tout en ayant un nombre limité de réducteurs. Chaque réducteur génère un fichier, donc cela les colle ensemble. Vous pouvez ajouter le nom du fichier original dans chaque ligne pour aider à montrer d'où il vient.

Je suis toujours intéressé à savoir s'il existe un moyen standard ou éprouvé de le faire que je ne connais pas.

+1

+1. C'est aussi la solution que j'ai utilisée moi-même dans le passé. –

+0

le mien aussi, c'est le meilleur travail –

+0

C'est ce que j'ai fait. J'utilise addInputPath dans la classe SequenceFileInputFormat pour ajouter tous les fichiers que je souhaite «écraser» et ensuite exécuter le travail. – PhillipAMann

3

Vous devriez jeter un oeil à File Crusher open source par media6degrees. Il peut être un peu dépassé mais vous pouvez télécharger la source et apporter vos modifications et/ou contribuer. Le JAR et la source sont dans: http://www.jointhegrid.com/hadoop_filecrush/index.jsp

Ceci est essentiellement une technique de réduction de la carte pour fusionner de petits fichiers.