Blog der SHI GmbH

Cloudera Morphlines – ETL Bibliothek für Apache Solr

Wie bekommt man in einem Big-Data Szenario seine Daten in Apache Solr? Eine gute Frage, denn Apache Solr bringt zwar im Standardumfang die Möglichkeit mit, Daten aus dem Dateisystem zu indexieren, aber Apache Solr kann beispielsweise kein HDFS crawlen. Verschärft wird das Problem noch durch die Tatsache, dass in Big Data Szenarien Daten oft unstrukturiert und/oder in diversen Data Warehouse Lösungen, wie beispielsweise Apache HIVE, gespeichert werden.

Cloudera hat für dieses Szenario Morphlines erschaffen. Cloudera Morphlines ist eine Bibliothek, die für Cloudera Search, der Such-Komponente in der CDH Distribution, entwickelt wurde. Morphlines verfügt über viele Funktionen eines ETL Tools, d.h. mit Morphlines können Daten aus verschiedensten Quellen gelesen werden, Daten können manipuliert werden und sie können in unterschiedlichste Ausgabekanäle weitergeleitet werden. Des Weiteren kann Morphlines auf MapReduce zurückgreifen und nutzt somit die volle Power der CDH Distribution.

Der komplette ETL Prozess kann in Morphlines über eine Konfigurationsdatei beschrieben werden, die an JSON erinnert. Es gibt die unterschiedlichsten Bibliotheken, die man nutzen kann um den ETL Prozess seinem UseCase anzupassen. Nehmen wir beispielsweise den klassischen UseCase „Durchsuchen und Visualisieren von Log Informationen“. Für diesen UseCase müssen Log Dateien, die im HDFS liegen, verarbeitet und in Solr indexiert werden.

Eingelesen werden diese Dateien zeilenweise mit der „readLine“ bzw. „readMultiLine“ Funktionalitäten aus dem Modul „kite-morphlines-core-stdio“. Folgender Schnipsel zeigt eine mögliche Konfiguration.

readLine {
   ignoreFirstLine : true
   charset : UTF-8
}

Jede Zeile kann dann noch manipuliert werden. Folgender Schnipsel zeigt, wie Grok aus dem Modul „kite-morphlines-core-stdlib“ die Log Meldung „127.0.0.1 Dies ist ein Test“ analysiert und Informationen extrahiert.

grok {
   expressions : {
       message : """%{IP:server_ip} [%{WORD:log_level}]
%{GREEDYDATA:log_message}"""
   }
}

Die extrahierten Informationen (server_ip, log_level, log_message) werden von Grok in eigenständige „Felder“ gespeichert. Weitere Manipulationen, wie beispielsweise Datumsformatierungen können anschließend durchgeführt werden.
Als letzter Schritt fehlt nur noch die Indexierung dieser Daten in Solr. Dies geschieht mittels der „loadSolr“ Funktion aus dem Modul „kite-morphlines-solr-core“.

loadSolr {
   solrLocator : ${SOLR_LOCATOR}
}

Aus den oben beschrieben Teilen lässt sich eine vollständige Konfiguration für Morphlines erstellen und mit dem MapReduceIndexerTool starten.

hadoop jar %PATH_TO_JARS%/search-mr-*-job.jar
org.apache.solr.hadoop.MapReduceIndexerTool --morphline-file
%PATH_TO_CONF%/morphline.conf --output-dir %TMP_DIR% --go-live

So weit, so gut, aber die ganze Sache hat natürlich einen Haken. Das MapReduceIndexerTool erstellt aus den Input Daten (in unserem Szenario sind es Log-Dateien) zuerst einen temporären Index, der am Ende in die bestehende Collection gemerged wird. Damit kann MapReduceIndexerTool im Fall eines Fehlers ein „Rollback“ durchführen, ohne dass der Live-Index beeinflusst wird. Dies führt jedoch auch dazu, dass folgende wichtige Funktionalitäten von Lucene/Solr ausgehebelt werden.

  • Dokumente können nicht aktualisiert werden. Die Dokumente im Index werden durch das Mergen immer hinzugefügt. Dokumente die eigentlich nur aktualisiert werden sollen sind nach dem Merge doppelt enthalten.
  • Da ein temporärer Index erstellt wird, werden einige Funktionalitäten, wie beispielsweise die UpdateProcessoren von Apache Solr, schlicht weg ignoriert.

Fazit

Cloudera Morphlines ist ein tolles Tool um Daten, die in Cloudera vorhanden sind in Solr zu indexieren und somit durchsuchbar zu machen. Vor allem die Nutzung der MapReduce Kapazitäten ermöglichen die Indexierung von vielen Daten.

Für Updates bestehender Dokumente ist Morphlines aber nicht ausgelegt. Hier muss man zuerst die relevanten Dokumente via Solr löschen bevor man mit Morphlines indexieren kann.

Weiterführende Links

Markus Klose