2010-07-02 17 views
0

Je souhaite fusionner 2 fichiers bzip2'ed. J'ai essayé d'ajouter l'un à l'autre: cat file1.bzip2 file2.bzip2 > out.bzip2 qui semble fonctionner (ce fichier décompressé correctement), mais je veux utiliser ce fichier comme un fichier d'entrée Hadoop, et je reçois des erreurs sur les blocs corrompus.Comment fusionner 2 fichiers bzip2'ed?

Quelle est la meilleure façon de fusionner 2 fichiers bzip2 sans les décompresser?

Répondre

2

manutention bzip concaténé est fixé sur le tronc, ou devrait être: https://issues.apache.org/jira/browse/HADOOP-4012. Il existe des exemples qui fonctionnent: https://issues.apache.org/jira/browse/MAPREDUCE-477?focusedCommentId=12871993&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#action_12871993 Assurez-vous que vous utilisez une version récente de Hadoop et que tout devrait bien se passer.

+0

Les fichiers compressés sont divisés correctement, mais je n'arrive toujours pas à comprendre comment exécuter la tâche de mappage sur des fichiers concaténés. (Mais après les décompresser tous, puis 'cat', puis compresser ce gros fichier d'entrée fonctionne) – wlk

1

Vous pouvez compresser (bien, magasin) les deux dans une nouvelle bz2? Cela signifierait que vous auriez à faire 3 décompressions pour obtenir le contenu des 2 archives, mais pourrait fonctionner avec votre scénario.

+0

C'est une très bonne idée, beaucoup mieux si bzip2 serait intelligent, et seulement 1 décompression serait nécessaire. – wlk

0

Vous ne voudriez pas nécessaire que de fusionner des fichiers pour les utiliser comme entrée Hadoop:

  • considèrent file_name* - un modèle;
  • file_name_1,file_name_2 - liste des entrées.

Et Hadoop va la traiter.

Sinon, vous pouvez utiliser le streaming de Hadoop pour les fusionner (avec décompression).

Vous pouvez produire la liste des fichiers par modèle comme:

FILES_LIST="'ls -m template*.bz2'"

INPUT_FILE="'echo $FILES_LIST | tr -d ' ' '"

' internes citations devraient être différentes. Vous pouvez passer $INPUT_FILE en tant que variable à votre script via CLI.

Voir également la classe CombineFileInputFormat comme InputFormat.

+1

J'ai essayé, mais le problème se pose lorsque vous avez deux milliers de fichiers compressés de 1 Mo chacun, et vous ne voulez pas charger eux à HDFS, mais pour avoir un gros fichier que vous pouvez charger. – wlk

+0

'lbzcat partie * | lbzcat -z> output_file' –

+0

Mon dernier commentaire fusionne des fichiers, mais hadoop est incapable de les lire complètement par la suite. –