Suche
Suche Menü

Qudosoft goes Big Data Part 2

„Qudosoft goes Big Data“ ist eine fortlaufende Serie von Blogposts in der wir unsere Erfahrung unserer ersten Schritte und herausgefundenen Best Practices beschreiben.

Technologien und Erfahrungen

In diesem Blogpost stellen wir verschiedene Technologien vor, die wir bisher für die Implementierung unserer Projekte verwendet haben und teilen unsere Erfahrungen mit.

Hadoop

Wie im ersten Blogpost beschrieben, haben wir uns für die Cloudera Cluster-Software entschieden, die viele Technologien vorinstalliert und vorkonfiguriert mitbringt. Es handelt sich insbesondere um Hadoop und weitere Technologien, die auf Hadoop aufsetzen. Deswegen ist auch meist vom „Hadoop Ökosystem“ die Rede. Hadoop selber repräsentiert ein auf verteilte Systeme angelehntes Framework, bestehend aus einem verteilten Dateisystem namens HDFS (Hadoop Distributed File System). HDFS basiert auf dem von Google vorgestellten Google File System und einer Berechnungs-Plattform namens MapReduce, welches ebenfalls auf einer von Google vorgestellten Technologie basiert. MapReduce ermöglicht das verteilte Rechnen in Form von Batch-Processing für größere Datenmengen. Dabei wird die Bearbeitung in zwei Phasen aufgeteilt, die in mehreren kleinen Schritten bearbeitet werden. Diese erzwungene Aufteilung in zwei Phasen erscheint zunächst unnötig verkomplizierend, bietet jedoch einen entscheidenden Vorteil: Jede der Phasen lässt sich vollständig parallelisieren und somit verteilt auf mehreren Rechenknoten ausführen, was die Rechenzeit drastisch verkürzt.

Die erste Phase dabei ist die „Map-Phase“, die die Daten aufbereitet und anschließend von der zweiten „Reduce-Phase“ zusammengefasst wird. Größere Datenanalysen bestehen aus mehreren MapReduce-Phasen. Das Zählen von Wörtern in einer größeren Datei ist das Standard-Beispiel für die Einführung in MapReduce. Dabei wird in der Map-Phase jedes Wort einzeln aufgelistet. In der Reduce-Phase werden alle gleichen Wörter an eine Instanz weitergegeben, welche die Vorkommen dieses einen Wortes aufsummiert und damit insgesamt eine Tabelle der Wörter mit der Anzahl gelistet wird. Eine Visualisierung des Workflows ist in der folgenden Abbildung zu sehen.

WordCountFlow

 

Man kann sich vorstellen, dass MapReduce eine gewisse Denkrichtung voraussetzt, um verschiedene Analysen auf den Daten durchführen zu können.

Das verteilte Dateisystem HDFS stellt das Herzstück von Hadoop dar und viele Technologien basieren darauf. Hierbei wird eine größere Datei bzw. Dateimenge redundant und verteilt auf mehreren Rechnern gespeichert. Man stelle sich vor, dass eine sehr große Datei in mehrere kleine Stücke zerteilt wird und diese unabhängig voneinander behandelt werden können. Dabei werden die Zerstückelungen nicht alle auf einer Instanz im verteilten System gespeichert, sondern verteilt, damit man die komplette Datei regenerieren kann, auch wenn eine Instanz ausfällt. Ein Beispiel der Zerstückelung einer Datei und das verteilte Speichern findet man in der folgenden Abbildung.


hdfs-data-distribution

Abstraktion von MapReduce

Größere Aufgaben erfordern – wie schon gesagt – eine gewisse Denkweise, um sie in MapReduce zu schreiben. Die Möglichkeit, mehrere MapReduce-Jobs zu verketten, ermöglicht es solche größeren Aufgaben zu bewältigen. Man kann sich aber auch vorstellen, wie schwer sich das Finden einer Fehlerursache gestalten kann. Viele Jobs basieren auf ganz einfachen Abfragen, um überhaupt Einsicht in die Daten zu gewinnen. Man stelle sich ganz einfache SQL-Abfragen vor, wie die Abfrage der Anzahl an Datensätzen für ein bestimmtes Kriterium etc.. Einen MapReduce-Job zu schreiben gestaltet sich aufwendig:

Der Job muss

  • in einer unterstützen Programmiersprache geschrieben werden
  • in eine ausführbare Datei übersetzt werden
  • in das Cluster hochgeladen werden
  • ausgeführt werden
  • das Ergebnis speichern
    • welches im ungünstigen Fall lokal heruntergeladen werden muss, um es sich anschauen zu können.

Facebook und Yahoo haben sich Gedanken dazu gemacht und kamen jeweils mit ihrer eigenen Abstraktion, um keine MapReduce-Jobs schreiben zu müssen.

Pig

Pig ist ein Framework von Yahoo, welches im gleichen Zeitraum entwickelt wurde wie Hive. Skripte werden in der Skriptsprache Pig Latin geschrieben. Pig übersetzt diese Skripte in MapReduce-Jobs und führt sie im Hintergrund aus. Tatsächlich haben wir Pig bisher noch nicht verwendet, weil die meisten einfachen Abfragen in Hive gemacht werden können.

Hive

Hive ist ein Framework von Facebook, welches das Anlegen einer Metastruktur auf Daten erlaubt, um diese dann über einen eigenes SQL-Dialekt (HiveQL) abzufragen. Dabei wird den entsprechenden Daten eine Schablone aufgesetzt, die das Abfragen der Daten wie in einer echten Datenbank ermöglicht. Im Hintergrund wird die SQL-Abfrage in ein oder mehrere optimierte MapReduce-Jobs übersetzt und ausgeführt. Für viele einfache Abfragen oder die Aggregation von Daten bietet sich Hive sehr gut an.

Nicht vorgesehen ist die Ausführung komplexerer Logik in den Abfragen bei Hive. Für das Explorieren der Daten nutzen wir hauptsächlich Hive und eine Folgetechnologie namens Impala. Hive kann man auch durch eigene Funktionen erweitern und diese dann in der Abfrage verwenden. Diese Funktionen werden UDFs genannt.

Hive bietet den Vorteil, dass man sich nicht in eine neue Sprache einarbeiten muss, sondern direkt in SQL loslegen kann. Außerdem verwenden weitere Technologien den Hive Metastore (Impala und Spark). Wir sind mit Hive an die Grenzen gestoßen, weil die Ausführung als MapReduce-Jobs geschehen und diese spürbar länger dauern als beispielsweise mit Impala oder Spark. Wenn wir einen Job schreiben mussten, der Logik beinhaltet hat, welche in SQL schwierig zu gestalten war, haben wir uns für Spark entschieden.

Weiterentwicklung von Hadoop

In der zweiten Version von Hadoop wurde YARN eingeführt. YARN selber beschreibt eine Ressourcenverwaltung in einem Clustersystem, wobei man selber festlegen kann, welche Ressourcen gebucht werden sollen und wie eine Berechnung ausgeführt werden soll (Scheduling, Node-Management, etc.). Bis zu dem Zeitpunkt bestand Hadoop – wie oben schon beschrieben – lediglich aus dem HDFS und der einzigen Berechnungs-Plattform MapReduce, womit immer mehr Entwickler unzufrieden waren. Durch YARN wurde die Möglichkeit geschaffen, eigene Computing-Engines bereitzustellen. Als Entwickler kann man seine Applikation auch mit der YARN-API schreiben, jedoch war das größere Ziel, Framework-Entwicklern die Möglichkeit zu geben, neben MapReduce weitere Computing-Engines aufzubauen. Im folgenden sieht man ein Schaubild der Änderung im Hadoop-Stack.

hadoopstack

P.S. Tez ist eine weitere Computing-Engine, die sich um die Übersetzung in YARN-Jobs kümmert. Die ist jedoch optional und nicht Standardbestandteil des Hadoop-Ökosystems in der zweiten Version.

Alternativ zu YARN (oder auch zusätzlich dazu) kann man auch Mesos benutzen. Yarn weist einem Job feste Ressourcen zu und gibt diese erst frei, wenn der Job abgeschlossen ist. Dies stellt für Streaming-Jobs und auch die meisten Echtzeitanwendungen in Hadoop unter YARN große Probleme dar, weil diese dauerhaft laufen sollen und damit ständig Ressourcen blocken. Mesos geht nach meinem Verständnis in eine etwas andere Richtung und nimmt sich nur dann Ressourcen, wenn es sie braucht und gibt diese wieder frei, wenn ein Task in einem Job abgeschlossen ist. Beim nächsten Task wird dann nochmal angefragt, ob genug Ressourcen vorhanden sind.

Impala

Impala ist eine native Analytics-Datenbank für Hadoop, die von Cloudera entwickelt wurde. Es basiert auf einer von Google vorgestellten Technologie namens Dremel. Es nutzt die gleiche Metastruktur-Datenbank wie Hive. Anstatt die Abfrage in MapReduce zu machen, bringt Impala seine eigene Computing-Engine mit, die spezialisiert auf verteilte Systeme ist und nach Cloudera ähnlich zu der Ausführung von kommerziellen parallelen Datenbanksystemen kommen. Wir persönlich können den Geschwindigkeitsschub gegenüber Hive bestätigen.

Impala nutzen wir vorrangig parallel zu Hive, um Daten zu explorieren und zu aggregieren. Impala hat nicht die Fülle der Funktionalitäten wie Hive (bspw. die JSON-Generierung oder Window-Functions), jedoch verspricht Cloudera, die Funktionalitäten nachzuziehen.

Spark

Spark ist der neue Stern im Big Data Himmel und bietet inzwischen so viel Funktionalität, dass wir Spark in einem extra Blogpost behandeln wollen. An dieser Stelle können wir aber schon verraten, dass unsere größeren und komplexeren Jobs in Spark geschrieben werden.

Schreibe einen Kommentar

Pflichtfelder sind mit * markiert.


Agile Softwareentwicklung