Hadoop: comment accéder aux (nombreuses) photos les images seront traitées par map/reduce?
J'ai 10M+ photos enregistrées sur le système de fichiers local. Maintenant, je veux aller à travers chacun d'eux pour analyser les binaires de la photo pour voir si c'est un chien. En gros, je veux faire l'analyse sur un cluster hadoop de l'environnement. Le problème est, comment la conception de l'entrée pour la méthode map? disons que, dans le plan de la méthode,
new FaceDetection(photoInputStream).isDog()
est toute la logique sous-jacente à l'analyse.
Plus précisément,
Devrais-je télécharger toutes les photos de HDFS
? Supposons oui,
-
comment puis-je les utiliser dans le
map
méthode? -
Est-il ok pour faire de l'entrée(à l'
map
) comme un fichier texte contenant toutes les photos en chemin(enHDFS
) à chaque ligne, et dans le plan de la méthode, la charge de la binaire comme:photoInputStream = getImageFromHDFS(photopath);
(en Fait, qu'est-ce que la bonne méthode pour charger fichier HDFS lors de l'exécution de la méthode map?)
Il semble que je manque quelques connaissances sur le principe de base pour hadoop
, map/reduce
et hdfs
, mais pouvez-vous svp m'indiquer dans les conditions de la question ci-dessus, Merci!
OriginalL'auteur leslie | 2012-01-06
Vous devez vous connecter pour publier un commentaire.
Le problème est que chaque fichier va être dans un fichier. Donc, si vous avez 10M fichiers, vous aurez 10M cartographes, qui n'est pas son très raisonnable. Vous souhaitez mai à envisager de le pré-sérialisation les fichiers dans
SequenceFiles
(une image par paire clé-valeur). Cela permettra de faire charger les données dans le travail de MapReduce natif, de sorte que vous n'avez pas à écrire tout difficile de code. Aussi, vous serez en mesure de stocker tous de vos données dans un SequenceFile, si vous le désirez. Hadoop poignées de fractionnement SequenceFiles assez bien.Fondamentalement, la façon dont cela fonctionne est, vous disposerez d'une Java processus qui prend plusieurs fichiers image, lit le ray octets en mémoire, puis stocke les données dans une paire clé-valeur dans une SequenceFile. Continuer et continuer à écrire dans HDFS. Cela peut prendre un certain temps, mais vous n'aurez à le faire qu'une fois.
Ce n'est pas ok si vous avez toute sorte de raisonnable cluster (que vous devriez si vous envisagez de Hadoop pour cela) et que vous voulez vraiment être en utilisant la puissance de Hadoop. Votre travail de MapReduce se déclenche, et de charger les fichiers, mais les contributeurs seront données en cours d'exécution-local pour les fichiers texte, pas les images! Donc, en gros, vous allez être en traînant les fichiers d'image partout depuis le JobTracker est de ne pas placer des tâches où les fichiers sont. Cela entraînera une quantité importante de la surcharge du réseau. Si vous avez de 1 to d'images, vous pouvez s'attendre à ce que beaucoup d'entre eux seront diffusées sur le réseau si vous avez plus de quelques nœuds. Ce ne peut pas être si mauvais en fonction de votre situation et de la taille de cluster (moins d'une poignée de nœuds).
Si vous voulez faire cela, vous pouvez utiliser le
système de fichiers
API pour créer des fichiers (vous voulez laopen
méthode).Une question distincte répondre ceci: ici
Je passais par le code de DistCp et il a
It takes at least two cmdline parameters. A source URL and a destination URL. It then essentially does an "ls -lR" on the source URL, and writes the output in a round-robin manner to all the map input files
. Dans DistCp aussi la localité des données n'est pas considérée. Dans le mapper les données sont lues à partir de la source (qui peut être sur un autre nœud) et écrit à la cible (qui est sur un autre cluster). Il y aura beaucoup d'entre-noeud de trafic lorsque les données à copier à travers des clusters est énorme. Vous ne savez pas comment l'aborder.Aussi, découvrez CombineFileInputFormat qui combine les fichiers en entrée split et a prend la localité des données dans des considérations.
OriginalL'auteur Donald Miner
En supposant qu'il prend une seconde pour placer chaque fichier dans le fichier de séquence. Il faudra environ 115 jours pour la conversion des fichiers individuels dans un fichier de séquence. Avec en parallèle un traitement sur une seule machine, je ne vois pas beaucoup d'amélioration, car le disque en lecture/écriture sera un goulot de bouteille avec la lecture des fichiers photo et l'écriture du fichier de séquence. Cochez cette Cloudera article sur de petits fichiers de problème. Il y a aussi une référence à un script qui convertit un fichier tar dans un fichier de séquence et combien de temps il a fallu pour la conversion.
Fondamentalement, les photos doivent être traités de manière égale pour les convertir en séquence. Retour à Hadoop 🙂
Selon la Hadoop - Le Guide Définitif
Directement le chargement de 10M de fichiers coûtera environ 3 000 MO de mémoire pour le stockage de l'espace de noms sur le NameNode. Oublier le streaming les photos sur les nœuds lors de l'exécution de la tâche.
Il devrait y avoir une meilleure façon de résoudre ce problème.
Une autre approche consiste à charger les fichiers que est dans HDFS et l'utilisation CombineFileInputFormat qui combine les petits fichiers en entrée split et considère la localité des données lors du calcul de l'entrée se divise. L'avantage de cette approche est que les fichiers peuvent être chargés dans HDFS que, sans aucune conversion et il n'y a pas beaucoup de données traînant sur les nœuds.
Il devrait prendre beaucoup moins d'une seconde pour traiter un fichier image qui est quelques MO. Encore, bon point. Vous pourriez certainement écrire un M/R de l'emploi qui a fait ceci. Vous pouvez faire 1 million de dollars à l'heure afin de ne pas exploser le nom de nœud.
Aussi, 3000MB n'est pas beaucoup (évidemment en fonction de votre matériel). 16 GO par nœud est très commun et si vous exécutez votre namenode par lui-même, c'est un lot de fichiers! Un cluster, j'ai travaillé avec des 96GB.. c'était sympa 🙂
aucune idée de ce qu'est la limite pour le nombre de fichiers namenode peut-il gérer? Je n'étais pas sûr si namenode peut gérer 3 go d'espace de noms. Quelque chose d'intéressant à partir de la Cloudera article
Going forward it’s best to design your data pipeline to write the data at source direct into a SequenceFile, if possible, rather than writing to small files as an intermediate step.
Je suis d'accord avec vous complètement en termes de bonnes pratiques. SequenceFiles sont géniaux, et de résoudre beaucoup de problèmes! Le plus grand déploiement, j'ai travaillé sur a 32 go de RAM et le NameNode a l'aide d'environ 16 GO de mémoire.
OriginalL'auteur Praveen Sripati
J'étais sur un projet d'une tout à l'arrière (2008?) où nous avons fait quelque chose de très similaire avec Hadoop. Je crois que nous avons d'abord utilisé HDFS pour stocker les photos, puis nous avons créé un fichier texte la liste des fichiers à traiter. Le concept est que vous êtes à l'aide de map/reduce pour briser le fichier texte en morceaux et la propagation que dans le cloud, permettant à chaque nœud de traiter des fichiers basés sur la portion de la liste qu'ils reçoivent. Désolé je ne me souviens plus de détails explicites, mais c'était l'approche générale.
OriginalL'auteur Don Branson