Fusion de fichiers hdfs
J'ai+ de 1000 fichiers disponibles dans HDFS avec une convention de nommage de 1_fileName.txt
à N_fileName.txt
. La taille de chaque fichier est de 1024 MO.
J'ai besoin de fusionner ces fichiers dans un (HDFS)avec le maintien de l'ordre de la file. Dire 5_FileName.txt
doit ajouter qu'après 4_fileName.txt
Quelle est la meilleure et la plus rapide pour effectuer cette opération.
Est-il une méthode pour réaliser cette fusion, sans copier les données réelles entre les données des nœuds? Pour l'e-g: Obtenir le bloc d'emplacements de ces fichiers et de créer une nouvelle entrée (nom de fichier) dans le Namenode avec ces emplacement du bloc?
source d'informationauteur JoRoot
Vous devez vous connecter pour publier un commentaire.
Il n'existe pas de moyen efficace de faire cela, vous aurez besoin de déplacer toutes les données à un nœud, puis retour à HDFS.
D'une ligne de commande scriptlet pour ce faire pourrait être comme suit:
Ce sera chat tous les fichiers qui correspondent à la boule vers la sortie standard, alors vous aurez tuyau de flux à la commande et de sortie du flux vers un fichier nommé HDFS targetFilename.txt
Le seul problème que vous avez est la structure de nom de fichier que vous avez disparu - si vous avez de largeur fixe, zeropadded le numéro de partie, il serait plus facile, mais dans son état actuel, vous aurez une inattendue lexigraphic ordre (1, 10, 100, 1000, 11, 110, etc) plutôt que l'ordre numérique (1,2,3,4, etc). Vous pourriez contourner ce problème en modifiant le scriptlet:
Il y a une méthode de l'API org.apache.hadoop.fs.FileUtil.copyMerge qui effectue cette opération:
Il lit tous les fichiers dans
srcDir
dans l'ordre alphabétique et ajoute leur contenu dstFile.Si vous pouvez utiliser de l'étincelle. Il peut être fait comme
Espère que cela fonctionne, depuis étincelle fonctionne en mode de distribution, vous n'avez pas de copie déposée dans un nœud. Mais juste une mise en garde, la coalescence des fichiers dans l'étincelle peut être lent si les fichiers sont très volumineux.
Depuis le fichier de commande est importante et le vocabulaire afin de ne pas atteindre le but, il ressemble à un bon candidat pour écrire un mappeur programme pour cette tâche, qui peut probablement exécuter périodiquement.
Offcourse il n'y a pas de réducteur, l'écriture de ce comme un HDFS carte tâche est efficace, car il peut fusionner les fichiers en un seul fichier de sortie sans trop de mouvement de données à travers des données des nœuds. Comme les fichiers source sont dans HDFS, et depuis mappeur de tâches vais essayer données d'affinité, il peut fusionner des fichiers sans déplacer les fichiers entre différents nœuds de données.
Le mappeur de programme aura besoin d'un custom InputSplit (en prenant les noms de fichier dans le répertoire de saisie et de commande si nécessaire) et une coutume InputFormat.
Le mappeur pouvez soit utiliser hdfs ajouter ou raw d'un flux de sortie où il peut écrire en byte[].
Une première esquisse du Mappeur de programme, je pense à quelque chose comme: