Map Reduce ist ein Programmiermodell zum Schreiben von Algorithmen, die große Datenmengen in (relativ) kurzer Zeit verarbeiten. Die Bausteine für die Programme sind sehr einfache Map- und Reduce-Funktionen. Das Schreiben von Programmen, die auf der Grundlage dieser einfachen Funktionen immer komplexere Aufgaben mit Daten durchführen, wird immer schwieriger und erfordert daher in frühen Phasen gründlichere Tests. In diesem Blog wird versucht, eine einfache Methode zum Testen des Algorithmus eines Map-Reduce-Programms auf der Grundlage von scoobi zu skizzieren.
Schauen wir uns das einfache Beispiel auf der scoobi-Website an:
[scala highlight="11,12,13,14"]
import com.nicta.scoobi.Scoobi._
import com.nicta.scoobi.DList._
import com.nicta.scoobi.io.text.TextInput._
import com.nicta.scoobi.io.text.TextOutput._
object WordCount {
def main(allArgs: Array[String]) = withHadoopArgs(allArgs) { args =>
val lines: DList[String] = fromTextFile(args(0))
val counts: DList[(String, Int)] = lines.flatMap(_.split(" "))
.map(word => (word, 1))
.groupByKey
.combine(_+_)
persist(toTextFile(counts, args(1)))
}
}
[/scala]
Das Beispielprogramm zählt die Wörter in der Eingabedatei. Das Schöne am Scoobi-Framework ist, dass es Entwicklern erlaubt, mit Sammlungsabstraktionen zu arbeiten, um ihren Map-Reduce-Algorithmus auszudrücken, ohne sich mit den blutigen Details des direkten Schreibens von Mappern und Reduzierern befassen zu müssen. Die Details des Hadoop-Frameworks , das scoobi zugrunde liegt, sind schön hinter den einfach aussehenden Anweisungen in den Zeilen 9 und 16 versteckt. Ohne zu sehr ins Detail zu gehen, wird die Funktionsweise von scoobi in diesem Zitat auf der scoobi-Website zusammengefasst:
...führt der Aufruf von DList-Methoden nicht sofort dazu, dass Daten im HDFS erzeugt werden. Das liegt daran, dass Scoobi hinter den Kulissen einen Staging-Compiler implementiert. Der Zweck der DList-Methoden besteht darin, einen Graphen von Datentransformationen zu erstellen. Der Akt der Persistierung einer DList löst dann die Kompilierung des Graphen in einen oder mehrere MapReduce-Jobs und deren Ausführung aus.Ich schlage nun vor, diesen scoobi-Ansatz noch einen Schritt weiter zu gehen und den Algorithmus nicht nur mit einer Sammlungsabstraktion zu entwickeln, sondern ihn auch mit einfachen Sammlungen zu testen! Vom Standpunkt des Testens aus betrachtet, gibt es zwei Annahmen, die ich durch das Testen des obigen Codes sicherstellen möchte:
- Die Ausführung des Codes sollte korrekte Hadoop-Mapper und -Reduzierer erzeugen und ausführen.
- Der Algorithmus sollte die Aufgabe erfüllen, für die er entwickelt wurde: das Zählen der Wörter in der Eingabedatei.
Verfasst von
Maarten Winkels
Unsere Ideen
Weitere Blogs
Contact
Let’s discuss how we can support your journey.



