Comment les données sont réparties dans Hadoop
Ne Hadoop diviser les données en fonction du nombre de mappers défini dans le programme? C'est, d'avoir un ensemble de données de taille de 500 MO, si le nombre de contributeurs est de 200 (en supposant que le cluster Hadoop permet de 200 utilisateurs simultanés), est chaque mappeur compte tenu de 2,5 MO de données?
En outre,faire toutes les mappeurs de fonctionner simultanément ou certains d'entre eux peuvent se faire rouler dans la série?
OriginalL'auteur H.Z. | 2013-07-03
Vous devez vous connecter pour publier un commentaire.
J'ai juste couru un échantillon de M. programme basé sur votre question et voici ma conclusion
D'entrée: un fichier de plus petite que la taille du bloc.
Donc basé sur la ci-dessus, pour le fichier de moins de la taille de bloc,
split size = total de la taille du fichier d'entrée /numéro de la carte de tâches lancé.
Remarque: Mais gardez à l'esprit que non. de carte tâche est décidé en fonction de l'entrée se divise.
Notez également que j'ai considéré que vous êtes en utilisant de vieux mapred Api que mon code est basé sur cela. Voici la signature de getSplits de FileInputFormat et il a numSplits en tant que paramètre. public InputSplit[] getSplits(JobConf travail, int numSplits)
c'est l'inverse
OriginalL'auteur Arijit Banerjee
C'est l'inverse. Nombre de mappers est décidé en fonction du nombre de divisions. En réalité, c'est le travail de
InputFormat
, que vous utilisez pour créer des scissions. Vous n'avez pas la moindre idée sur le nombre de mappers jusqu'à ce que le nombre de divisions qui a été décidé. Et, il n'est pas toujours que les fractionnements sera créé sur la base du HDFS la taille du bloc. Il dépend totalement de la logique à l'intérieur de lagetSplits()
méthode de votre InputFormat.Pour mieux comprendre ceci, supposons que vous êtes en traitement de données stockées dans vos bases MySQL à l'aide de M. Car il n'y a pas de notion de blocs dans ce cas, la théorie que les divisions sont toujours créé sur la base du HDFS bloc échoue. Droit? Ce sujet divise la création? Une possibilité est de créer des divisions basées sur les gammes de lignes dans ta table MySQL (et c'est ce que
DBInputFormat
n', un format d'entrée pour la lecture de données à partir d'une base de données relationnelle). Supposons que vous disposez de 100 lignes. Ensuite, vous pourriez avoir 5 splits de 20 lignes chacune.C'est seulement pour le InputFormats basé sur
FileInputFormat
(un InputFormat pour la manipulation des données stockées dans des fichiers) que les divisions sont créées sur la base de la taille totale, en octets, des fichiers d'entrée. Cependant, la taille de bloc du système de fichiers des fichiers d'entrée est traitée comme une limite supérieure pour l'entrée se divise. Si vous avez un fichier plus petit que le HDFS taille de bloc, vous obtiendrez seulement 1 mappeur pour ce fichier. Si vous voulez avoir un comportement différent, vous pouvez utiliser mapred.min.split.taille. Mais cela dépend encore une fois uniquement sur le getSplits() de votre InputFormat.Il existe une différence fondamentale entre M.
split
et HDFSblock
et les gens souvent se confondre par ce. Un bloc est une pièce physique de données tandis qu'un split est juste une logique pièce qui va être nourris à un mappeur. Un split ne contient pas les données d'entrée, c'est juste une référence aux données. Alors qu'est ce qu'un split? Une scission a essentiellement 2 choses : unelength in bytes
et un ensemble destorage locations
, qui sont tout simplement le nom d'hôte de chaînes.De revenir à votre question. Hadoop permet beaucoup plus de 200 utilisateurs. Cela dit, il ne fait pas beaucoup de sens d'avoir de 200 contributeurs pour seulement 500 mo de données. Rappelez-vous toujours que lorsque vous parlez d'Hadoop, vous êtes face à de très grandes quantités de données. Envoi à seulement 2,5 MO de données pour chaque mappeur serait inutile. Et oui, si il n'y a pas de processeurs gratuits de machines à sous alors certains mappeurs de courir après l'achèvement de l'actuel mappeurs. Mais le cadre de la rm est très intelligent et essaie de son mieux pour éviter ce genre de situation. Si la machine sur laquelle les données à traiter est présent, n'ont pas de PROCESSEUR fentes, les données seront déplacés à proximité d'un nœud, où les slots sont disponibles, et peuvent être traités.
HTH
OriginalL'auteur Tariq
Lors de la saisie de données dans Hadoop Distributed File System (HDFS), Hadoop partage de vos données en fonction de la taille de bloc (la valeur par défaut de 64 MO) et distribue les blocs au sein de la grappe. Si votre 500 MO sera divisé en 8 blocs. Il ne dépend pas du nombre de mappers, il est la propriété de HDFS.
Maintenant, lorsque vous exécutez un travail de MapReduce, Hadoop par défaut attribue 1 mappeur par bloc, donc si vous avez des 8 blocs, hadoop sera exécuté 8 carte tâches.
Toutefois, si vous spécifiez le nombre de mappers explicitement (j'.e 200), alors que la taille des données traitées par chaque Carte dépend de la distribution des blocs, et le nœud sur lequel votre mapper est en cours d'exécution. Combien de mappeurs de réellement traiter vos données dépend d'entrée split.
Dans votre cas, en supposant que 500 MO divisée en 8 blocs, même si vous spécifiez 200 cartographes, toutes ne pourront pas traiter les données, même si elles sont initialisées.
Dans ce cas, la plupart des cartographes fonctionne, mais ne sera pas de données de processus. Je pense que vous trouverez que lorsque vous vérifiez le mappeur de journaux, la plupart d'entre eux n'aurait pas d'entrée/sortie de données. Je vais modifier ma réponse pour refléter cela.
OriginalL'auteur Chaos
Si 200 mapper sont en cours d'exécution pour 500 mo de données, alors vous devez vérifier que, pour chaque individu, la taille du fichier. Si la taille du fichier est inférieure à la taille du bloc (64 mo ) puis elle se déroulera carte de tâche pour chaque fichier.
Normalement, nous fusionner les fichiers plus petits dans le fichier de grande taille (taille supérieure à la taille de bloc)
OriginalL'auteur hjamali52
Pas. Il n'est pas.
Nombre de Mappers pour un Emploi est défini par le Cadre.
Ont un coup d'oeil à Apache MapReduce tutoriel lien.
Combien De Cartes?
Le bon niveau de parallélisme pour les cartes semble être autour de 10 à 100 cartes par nœud, même si elle a été définie jusqu'à 300 cartes pour de très cpu-lumière de la carte de tâches. La tâche d'installation prend un certain temps, de sorte qu'il est meilleur si les cartes de prendre au moins une minute à exécuter.
Donc, si vous vous attendez à 10TB de données d'entrée et ont une taille de bloc de 128 mo de mémoire, vous vous retrouverez avec de 82 000 cartes, sauf si la Configuration.set(MRJobConfig.NUM_MAPS, int) (qui ne fournit qu'une indication sur le cadre) est utilisé pour définir une valeur encore plus élevée.
De revenir à votre question :
Si DFS bloc d'Entrée et de Diviser la taille est 128 MO, puis 500 MO fichier nécessite 4 Mappeurs pour traiter les données. Cadre run 4 Mappeur de tâches dans les cas ci-dessus.
Tous les Mappeurs de s'exécuter simultanément. Mais Réducteur sera exécuté uniquement lorsque la sortie de tous les Mappeurs qui a été copié et disponible pour eux.
OriginalL'auteur Ravindra babu