Hadoop: compression de fichier HDFS?
J'ai récemment mis en place la compression LZO dans Hadoop. Quelle est la façon la plus simple pour compresser un fichier dans HDFS? Je veux compresser un fichier, puis de supprimer l'original. Dois-je créer un MONSIEUR d'emploi avec un IdentityMapper et un IdentityReducer qui utilise la compression LZO?
OriginalL'auteur schmmd | 2011-08-22
Vous devez vous connecter pour publier un commentaire.
Je vous suggère d'écrire un travail de MapReduce, comme vous dites, utilise simplement l'Identité du mappeur. Pendant que vous y êtes, vous devriez envisager l'écriture des données pour les fichiers de séquence pour améliorer les performances de chargement. Vous pouvez également stocker des fichiers de séquence dans le bloc-niveau et au niveau de l'enregistrement de compression. Yo devez voir ce qui fonctionne le mieux pour vous, car les deux sont optimisés pour différents types d'enregistrements.
OriginalL'auteur Donald Miner
Pour moi, c'est moins de frais généraux pour écrire un Hadoop Streaming travail pour compresser des fichiers.
C'est la commande que j'run:
Je vais aussi généralement ranger le résultat dans un dossier temp dans le cas où quelque chose se passe mal:
Une remarque, je ne spécifiez pas un réducteur dans le streaming de travail, mais vous pouvez certainement. Elle force toutes les lignes à trier ce qui peut prendre beaucoup de temps avec un fichier de grande taille. Il y a peut être un moyen de contourner ce problème en remplaçant l'outil de partitionnement, mais je n'ai pas la peine de le comprendre. La malheureuse partie de ceci est que vous pouvez potentiellement jusqu'à la fin avec beaucoup de petits fichiers qui n'utilisent pas de HDFS bloque efficacement. C'est une des raisons pour regarder dans Hadoop Archives
L'entrée pour le mappeur est une clé et une valeur, séparés par une tabulation. La clé, c'est le décalage d'octet de la ligne dans le fichier et la valeur est le texte de la ligne.
cut -f 2
sorties uniquement la valeur.Comment puis-je compresser le dossier dans hdfs?
La réponse ci-dessous utilise la commande cat, qui est la réponse correcte.
Commande ci-dessus donne un onglet" caractères à la fin de chaque ligne de la sortie compressé.
OriginalL'auteur Jeff Wu
La commande de streaming de Jeff Wu avec une concaténation des fichiers compressés donnera un unique fichier compressé. En cas de non java mapper est passé à la diffusion de l'emploi et le format de saisie de texte est streaming sorties seulement la valeur et non pas la clé.
Non, la première commande génère le comprimé *.gz partie fichiers (beaucoup d'entre eux). Et la seconde commande pour la concaténation de ces fichiers de pièce en une seule 'compressed.gz".
Commande ci-dessus donne plus de
tab
de caractère à la fin de chaque ligne de la sortie compresséOriginalL'auteur Chitra
C'est ce que j'ai utilisé:
Si ce n'est pas LZO de sorte qu'il peut être un peu plus lent.
Oui, il va charger l'ensemble d'une entrée du répertoire en un seul alias et de sortie comme ${OUT_DIR}/partie-m-*.bz2. Si vous voulez un 3 go d'entrée de répertoire, puis contrôle IN_DIR
OriginalL'auteur dranxo
@Chitra
Je ne peux pas faire de commentaires en raison de la réputation de problème
Ici, tout est en une seule commande: au Lieu d'utiliser la deuxième commande, vous pouvez réduire en un seul fichier compressé directement
Ainsi, vous gagnez beaucoup d'espace en ayant un seul fichier de compression
Par exemple, disons que j'ai 4 fichiers de 10 MO (c'est du texte brut, au format JSON)
La carte ne me donne 4 fichiers de 650 KO
Si je map et reduce j'ai 1 fichier de 1,05 MO
OriginalL'auteur Eldinea
Je sais que c'est vieux thread, mais si quelqu'un suit ce fil (comme moi), il serait utile de savoir que l'une des 2 méthodes suivantes vous donne un
tab
(\t) de caractère à la fin de chaque ligneDe cette hadoop-streaming.jar ajoute x'09' à la fin de chaque ligne, j'ai trouvé la solution et nous devons nous fixer des 2 paramètres suivants pour respecitve délimiteur vous utilisez (dans mon cas, c'était ,)
intégralité de la commande à exécuter
OriginalL'auteur Naga
Bien, si vous compressez un fichier unique, vous pouvez économiser de l'espace, mais vous ne pouvez pas vraiment utiliser Hadoop de la puissance de traiter ce fichier depuis la décompression doit être fait par une Carte unique tâche de manière séquentielle. Si vous avez beaucoup de fichiers, il n'y a Hadoop Archive, mais je ne suis pas sûr qu'il comprend tout type de compression. Les principaux cas d'utilisation pour la compression, je pense, de la compression de la sortie des Cartes afin d'être envoyé à Réduit (enregistrer sur le réseau I/O).
Oh, pour répondre à votre question d'une manière plus complète, vous auriez probablement besoin de mettre en œuvre votre propre RecordReader et/ou InputFormat assurez-vous que la totalité du fichier obtenu lu par une seule Carte de la tâche, et aussi il a utilisé le bon filtre de décompression.
Intéressant. Je pensais que tu parlais d'entrée de compression, pas de la compression de la sortie, désolé. Ne vous vous souciez de l'ordre de tri des données dans le fichier de sortie? Vous pouvez facilement simplement utiliser l'Api du système de fichiers et envelopper le FSDataOutputStream dans le filtre de compression LZO si vous n'avez pas de soins sur le tri du fichier de sortie. Si vous le faites, alors FileOutputFormat.setCompressOutput() et setOutputCompressorClass(). Il est droit dans la Javadoc, trouvé en 10 secondes sur Google.
OriginalL'auteur Drizzt321