MapReduce Wordcount Graph

Hallo…

ich versuche nun seit Stunden vergeblich eine einfache MapReduce Funktion in C++ zu implementieren.Ich habe bereits ein Programm, welches mir aus gegebenen Files Wörter zählt und diese in einer Map mit der bzw. die Zeilennummer/n speichert.Mein Ansatz wäre gewesen, dieses kurze Programm umzuschreiben und die 2 Funktionen map und reduce zu implementieren.Die Funktion von MapReduce sind mir im Wesentlichen klar…Nur leider weiß ich aber gerade gar nicht wirklich wie ich anfangen soll… vielleicht hat jemand soetwas schon gemacht und könnte mir etwas hilfe zukommen lassen.bzw eine h. datei würde mir mit sicherheit auch gut weiterhelfen.

Hi Martina,
so kann man es machen. Ich habe dir ein Beispiel hineingestellt. Allerdings verzichtet es darauf mit Nebenläufigkeit zu arbeiten was ja die Idee hinter dem mapreduce ist. Aber das Schema lässt sich erkennen.
Das Programm wertet die Anzahl der Wörter einer partiellen Map aus.
Diese wird dann in eine Map[Wort, Anzahl] (mapped_map) umgespeichert.
Die diese partiell errechnete Map wird dann wieder reduziert (reduced_map)
was durch eine einfache Kompression der Key-Value-Paare stattfindet.

Das Programm kann und wird Fehler haben.

Der Output des Programms ist dann:
S : Geht 1
S : Hallo 1
S : Test 9
S : Uhr 1
S : Warum 1
S : Was 1
S : Welt 1
S : Wer 5
S : Weshalb 1
S : Wie 1
S : Wieso 1
S : an 1
S : bleibt 1
S : der 1
S : dumm 1
S : fragt 1
S : gedreht 1
S : hat 1
S : nicht 2
S : noch 1
S : weiss 1

Aber dieses Beispiel kann dir nur helfen das Schema zu erkennen und ggf. bei deinem Problem mit dem algorithmisieren einer solche Anfoderung. Für ein echtes mapreduce müsstest du eine Bibliothek haben oder dir überlegen wie du
virtualmap(…) virtualreduce(…) asynchron machst.
Das geht aber nicht auf die Schnelle.

#include
#include
#include

using namespace std;

void virtualmap(string my_string, map& my_map) {
string s = {};

for (unsigned int i = 0; i ::iterator it = my_map.find(s);
if (it != my_map.end()) {
(*it).second++;
}
else {
my_map.insert(pair(s, 1));
}

s.clear();
}
else {
s.append(my_string.substr(i, 1));

}
}
}

void virtualreduce(map>& my_mapped_map, map& my_reduced_map)
{
map>::iterator mapped_map_it;

// walk through partially mapped maps [2 Wer 1 Wie] [1 Wieso 1 Weshalb 1 Warum]
for (mapped_map_it = my_mapped_map.begin(); mapped_map_it != my_mapped_map.end(); mapped_map_it++) {
map temp_map = (*mapped_map_it).second;
map::iterator temp_map_it;
// walk through mapped maps [2 Wer 1 Wie]
for (temp_map_it = temp_map.begin(); temp_map_it != temp_map.end(); temp_map_it++) {
map::iterator reduced_map_find_it = my_reduced_map.find((*temp_map_it).first);
if (reduced_map_find_it != my_reduced_map.end()) {
(*reduced_map_find_it).second += (*temp_map_it).second;
}
else {
my_reduced_map.insert(pair((*temp_map_it).first, (*temp_map_it).second));
}

}
}
}


int main (int argc, char argv[])
{
map init_map;
int c = 0;

init_map.insert(pair(1, "Wer Wie Wer "));
init_map.insert(pair(2, "Wieso Weshalb Warum Test "));
init_map.insert(pair(3, "Wer nicht fragt "));
init_map.insert(pair(4, "bleibt dumm "));
init_map.insert(pair(5, "Test Test "));
init_map.insert(pair(6, "Test Test "));
init_map.insert(pair(7, "Hallo Welt "));
init_map.insert(pair(8, "Geht noch nicht "));
init_map.insert(pair(9, "Wer hat an der Uhr gedreht "));
init_map.insert(pair(10, "Wer weiss Was "));
init_map.insert(pair(11, "Test Test "));
init_map.insert(pair(12, "Test Test "));

map * reduced_map = new map();
map::iterator it;
for (it = init_map.begin(); it != init_map.end(); it++) {

/
Map /
map * init_map = new map();
/
virtuell(en) Prozess starten */
virtualmap((it).second, * init_map);
/
Reduce */
map> * mapped_map = new map>();
c++;
mapped_map->insert(pair>(c, * init_map));
virtualreduce( * mapped_map, * reduced_map);

}

map::iterator show_it;
for (show_it = reduced_map->begin(); show_it != reduced_map->end(); show_it++) {
cout