Question

Supposons que j'ai un fichier texte avec les données suivantes:

DataSetOne <br />
content <br />
content <br />
content <br />


DataSetTwo <br />
content <br />
content <br />
content <br />
content <br />

... et ainsi de suite ...

Ce que je veux est à: compter le nombre de contenus dans chaque jeu de données. Par exemple, le résultat devrait être

<DataSetOne, 3>, <DataSetTwo, 4>

Je suis beginer à Hadoop, je me demande s'il y a un moyen de mapper un bloc de données dans son ensemble à un nœud. par exemple, mettre tous DataSetOne au noeud 1 et tout DataSetTwo au noeud 2.

Est-ce que quelqu'un peut me donner une idée comment archiver cela?

Était-ce utile?

La solution

D'abord tous vos jeux de données sont partagés pour plusieurs cartes si elles sont dans des fichiers séparés ou si elles dépassent le blocksize configuré. Donc, si vous avez un ensemble de données de 128 Mo et votre chunksize est 64mb Hadoop va bloquer 2 ce fichier et la configuration 2 mappeurs pour chacun.
C'est comme l'exemple wordcount dans les tutoriels Hadoop. Comme David dit que vous aurez besoin de cartographier les paires clé / valeur dans HDFS puis réduire sur eux. Je mettre en œuvre que comme ceci:

// field in the mapper class
int groupId = 0;

@Override
protected void map(K key, V value, Context context) throws IOException,
        InterruptedException {
    if(key != groupId)
        groupId = key;
    context.write(groupId, value);
}

@Override
protected void reduce(K key, Iterable<V> values,
        Context context)
        throws IOException, InterruptedException {
    int size = 0;
    for(Value v : values){
        size++;
    }
    context.write(key, size);
}

Comme David dit aswell vous pouvez utiliser combinateur. Combineurs sont simples et réducteurs sont utilisés pour sauver la carte entre ressources et réduire la phase. Ils peuvent être définis dans la configuration.

Autres conseils

Je pense que la façon simple, sera de mettre en œuvre la logique dans le mappeur, où vous vous souvenez ce qui est une paire dataSet et émettent de courant comme ceci:

(DataSetOne, contenu)
(DataSetOne, contenu)
(DataSetOne, contenu)

(DataSetTwo, contenu)
(DataSetTwo, contenu)

Et alors vous aurez countgroups au stade réduire.

Si la performance sera devenue une question que je suggère de considérer combinateur.

Vous pouvez étendre la classe FileInputFormat et implémenter l'interface RecordReader (ou si vous utilisez la nouvelle API, étendre la RecordReader classe abstraite) pour définir la façon dont vous divisez vos données. Voici un lien qui vous donne un exemple de la façon de mettre en œuvre ces classes, en utilisant l'ancienne API.

http://www.questionhub.com/StackOverflow/4235318

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top