HBase
 sql >> Datenbank >  >> NoSQL >> HBase

E-Mail-Indizierung mit Cloudera Search und HBase

In meinem vorherigen Beitrag haben Sie gelernt, wie Sie E-Mail-Nachrichten im Stapelmodus und nahezu in Echtzeit mithilfe von Apache Flume mit MorphlineSolrSink indizieren. In diesem Beitrag erfahren Sie, wie Sie E-Mails mit Cloudera Search mit Apache HBase und Lily HBase Indexer indizieren, die von NGDATA und Cloudera verwaltet werden. (Wenn Sie den vorherigen Beitrag nicht gelesen haben, empfehle ich Ihnen, dies für Hintergrundinformationen zu tun, bevor Sie weiterlesen.)

Welche Fast-Echtzeit-Methode Sie wählen sollten, HBase Indexer oder Flume MorphlineSolrSink, hängt ganz von Ihrem Anwendungsfall ab, aber im Folgenden sind einige Dinge aufgeführt, die Sie bei dieser Entscheidung berücksichtigen sollten:

  • Ist HBase ein optimales Speichermedium für den gegebenen Anwendungsfall?
  • Werden die Daten bereits in HBase aufgenommen?
  • Gibt es ein Zugriffsmuster, das erfordert, dass die Dateien in einem anderen Format als HFiles gespeichert werden?
  • Wenn HBase derzeit nicht ausgeführt wird, sind dann genügend Hardwareressourcen vorhanden, um es aufzurufen?

Es gibt zwei Möglichkeiten, Cloudera Search zu konfigurieren, um in HBase gespeicherte Dokumente zu indizieren:die Konfigurationsdateien direkt zu ändern und Lily HBase Indexer manuell oder als Dienst zu starten, oder alles mit Cloudera Manager zu konfigurieren. Dieser Beitrag konzentriert sich auf Letzteres, da es bei weitem der einfachste Weg ist, die Suche auf HBase zu aktivieren – oder übrigens auch auf jedem anderen Dienst auf CDH.

HBase Replication und Lily HBase Indexer verstehen

Beim Entwerfen dieser Lösung hat Cloudera vier Hauptanforderungen identifiziert, um die HBase-Indizierung effektiv zu machen:

  • Die Indizierungslatenz muss nahezu in Echtzeit (Sekunden) erfolgen und einstellbar sein
  • Der Solr-Index muss schließlich mit der HBase-Tabelle konsistent sein, während Einfügungen, Aktualisierungen und Löschungen auf HBase angewendet werden
  • Der Indizierungsmechanismus muss skalierbar und fehlertolerant sein
  • Der Indizierungsprozess kann HBase-Schreibvorgänge nicht verlangsamen

Um diese Anforderungen zu erfüllen, verwendet Cloudera Search den nativen Replikationsmechanismus von HBase. Für diejenigen, die mit der HBase-Replikation nicht vertraut sind, finden Sie hier eine kurze und sehr allgemeine Zusammenfassung:

Wenn Aktualisierungen auf das Write-Ahead-Log (WAL) angewendet werden, hört HBase RegionServer diese Aktualisierungen in einem separaten Thread ab. Wenn der Puffer dieses Threads gefüllt ist oder das Ende der Datei erreicht ist, sendet er die Stapel mit allen replizierten Aktualisierungen an einen Peer-RegionServer, der auf einem anderen Cluster ausgeführt wird. Die WAL ist daher unerlässlich, damit die Indizierung funktioniert.

Cloudera Search verwendet den HBase-Replikationsmechanismus, der auf HBase-Zeilenmutationsereignisse lauscht und, anstatt Aktualisierungen an einen anderen RegionServer zu senden, sie an Lily HBase Indexer sendet. Lily HBase Indexer wiederum wendet die Transformationslogik von Cloudera Morphlines an, zerlegt die Ereignisse in Solr-Felder und leitet sie an Apache Solr Server weiter.

Die Verwendung der HBase-Replikation bietet gegenüber der Implementierung der gleichen Funktionalität in HBase-Coprozessoren große Vorteile. Erstens funktioniert die Replikation parallel und asynchron mit den Daten, die in HBase aufgenommen werden. Daher fügt die Indizierung von Cloudera Search dem routinemäßigen HBase-Betrieb keine Latenz oder Betriebsinstabilität hinzu. Zweitens ermöglicht die Verwendung der Replikationsmethode nahtlose spontane Änderungen an der Transformationslogik. Um eine Änderung durch Coprozessor-Modifikation zu bewirken, ist dagegen ein RegionServer-Neustart erforderlich, wodurch die Daten für HBase-Benutzer nicht mehr verfügbar wären. Am wichtigsten ist vielleicht, dass die Implementierung von Coprozessoren ziemlich aufdringlich ist und, wenn sie nicht ordnungsgemäß getestet wird, die HBase-Leistung beeinträchtigen kann.

Dieser Ablauf ist unten dargestellt:

Installieren von Cloudera Search und Bereitstellen von Lily HBase Indexer

Cloudera Manager lädt Cloudera Search automatisch als einzelnes Paket herunter und stellt es bereit. Alles, was Sie tun müssen, ist, auf das Symbol „Pakete“ im oberen Navigationsbereich zu klicken, die Solr-Version auszuwählen und sie herunterzuladen, zu verteilen und zu aktivieren:

Wie bereits erwähnt, hängt Cloudera Search von der HBase-Replikation ab und wird daher als nächstes aktiviert. Aktivieren Sie die Replikation, indem Sie auf HBase Service->Configuration->Backup klicken und sicherstellen, dass „Enable HBase Replication“ und „Enable Indexing“ aktiviert sind. Speichern Sie ggf. die Änderungen und starten Sie den HBase-Dienst neu.

Um Lily HBase Indexer hinzuzufügen, gehen Sie zu Dienste->Dienst hinzufügen , wählen Sie „Keystore Indexer“ und fügen Sie es hinzu, indem Sie es auf die HBase-Instanz verweisen, die für die E-Mail-Verarbeitung verwendet wird:

Solr konfigurieren

Als nächstes konfigurieren Sie Solr genau wie im vorherigen Post hier beschrieben.

  1. Generieren Sie eine schema.xml-Beispielkonfigurationsdatei:
    $ solrctl --zk localhost:2181/solr \
    instancedir --generate $HOME/emailSearchConfig
    

  2. Bearbeiten Sie die Datei schema.xml in $HOME/emailSearchConfig mit der Konfigurationsdatei, die die für die E-Mail-Verarbeitung relevanten Felder definiert. Eine vollständige Kopie der Datei finden Sie unter diesem Link.
  3. Laden Sie die Solr-Konfigurationen in ZooKeeper hoch:
    $ solrctl --zk localhost:2181/solr instancedir  \
    --create email_collection $HOME/emailSearchConfig
    

  4. Generieren Sie die Solr-Sammlung:
    $ solrctl --zk localhost:2181/solr collection  \
    --create email_collection -s 1
    

Registrieren des Indexers

Dieser Schritt ist erforderlich, um den Indexer und die HBase-Replikation hinzuzufügen und zu konfigurieren. Der folgende Befehl aktualisiert ZooKeeper und fügt myindexer als Replikationspeer für HBase hinzu. Es fügt auch Konfigurationen in ZooKeeper ein, die Lily HBase Indexer verwendet, um auf die richtige Sammlung in Solr zu verweisen.

$ hbase-indexer add-indexer -n myindexer -c indexer-config.xml  \
       -cp solr.zk=localhost:2181/solr  \
       -cp solr.collection=collection1

Argumente:

  • -n myindexer – gibt den Namen des Indexers an, der in ZooKeeper registriert wird
  • -c indexer-config.xml – Konfigurationsdatei, die das Verhalten des Indexers festlegt
  • -cp solr.zk=localhost:2181/solr  – gibt den Speicherort der ZooKeeper- und Solr-Konfiguration an. Dies sollte mit dem umgebungsspezifischen Standort von ZooKeeper aktualisiert werden.
  • -cp solr.collection=collection1 – gibt an, welche Sammlung aktualisiert werden soll. Erinnern Sie sich an den Solr-Konfigurationsschritt, in dem wir collection1 erstellt haben.

Die Datei index-config.xml ist in diesem Fall relativ unkompliziert; Er gibt dem Indexer lediglich an, welche Tabelle er sich ansehen soll, die Klasse, die als Mapper verwendet wird (com.ngdata.hbaseindexer.morphline.MorphlineResultToSolrMapper), und den Speicherort der Morphline-Konfigurationsdatei. Der Zuordnungstyp ist auf Spalte eingestellt weil wir jede Zelle als einzelnes Solr-Dokument erhalten möchten. Standardmäßig ist der Mapping-Typ auf row gesetzt , in diesem Fall wird das Solr-Dokument zur vollständigen Zeile.

Param name="morphlineFile" gibt den Speicherort der Morphlines-Konfigurationsdatei an. Der Speicherort könnte ein absoluter Pfad Ihrer Morphlines-Datei sein, aber da Sie Cloudera Manager verwenden, geben Sie den relativen Pfad an:„morphlines.conf“.

   
   


   
   

Den Inhalt der hbase-indexer Konfigurationsdatei finden Sie unter diesem Link.

Für die vollständige Referenz des Befehls hbase-indexer reicht es aus, den Befehl ohne Argumente auszuführen:

$ hbase-indexer

Usage: hbase-indexer 
where  an option from one of these categories:

TOOLS
  add-indexer
  update-indexer
  delete-indexer
  list-indexers

PROCESS MANAGEMENT
  server           run the HBase Indexer server node

REPLICATION (EVENT PROCESSING) TOOLS
  replication-status
  replication-wait

PACKAGE MANAGEMENT
  classpath        dump hbase CLASSPATH
  version          print the version

 or
  CLASSNAME        run the class named CLASSNAME
Most commands print help when invoked w/o parameters.

Konfigurieren und Starten von Lily HBase Indexer

Wenn Sie sich erinnern, haben Sie beim Hinzufügen von Lily HBase Indexer die Instanz von HBase angegeben, mit der es verknüpft ist. Daher müssen Sie dies in diesem Schritt nicht tun. Sie müssen jedoch die Morphlines-Transformationslogik angeben, die es diesem Indexer ermöglicht, E-Mail-Nachrichten zu parsen und alle relevanten Felder zu extrahieren.

Gehen Sie zu Dienste und wählen Sie Lily HBase Indexer, den Sie zuvor hinzugefügt haben. Wählen Sie Konfigurationen->Anzeigen und Bearbeiten->Dienstweit->Morphlines aus . Kopieren Sie die Morphlines-Datei und fügen Sie sie ein.

Die E-Mail-Morphlines-Bibliothek führt die folgenden Aktionen aus:

1.     Lesen Sie die HBase-E-Mail-Ereignisse mit dem Befehl extractHBaseCells
2. Teilen Sie den unstrukturierten Text mit dem Befehl grok in Felder auf
3. Wenn die Nachrichten-ID in der E-Mail fehlt, generieren Sie sie mit dem Befehl generateUUID
4. Wandeln Sie den Datums-/Zeitstempel mit dem Befehl convertTimestamp in ein Feld um, das Solr versteht.
5. Löschen Sie alle zusätzlichen Felder, die wir nicht in schema.xml angegeben haben, mit dem Befehl sanitizeUknownSolrFields

Der Befehl extractHBaseCells verdient mehr Aufmerksamkeit, da er der einzige Unterschied in der Morphlines-Konfiguration des HBase-Indexers ist. Die Parameter sind:

  • inputColumn – gibt Spalten an, die abonniert werden sollen (kann Platzhalter sein)
  • outputFied – der Name des Feldes, an das die Daten gesendet werden
  • Typ – der Typ des Felds (im Fall des E-Mail-Texts ist es eine Zeichenfolge)
  • Quelle – kann wertvoll oder qualifiziert sein; value gibt an, dass der Zellenwert indiziert werden soll
extractHBaseCells {
       mappings : [
        {
          inputColumn : "messages:*"
          outputField : "message"
          type : string
          source : value
          }
        ]
      }

Laden Sie hier eine Kopie dieser Morphlines-Datei herunter.

Ein wichtiger Hinweis ist, dass das ID-Feld automatisch von Lily HBase Indexer generiert wird. Diese Einstellung kann in der Datei index-config.xml oben konfiguriert werden, indem das Attribut unique-key-field angegeben wird. Es empfiehlt sich, den Standardnamen id beizubehalten – da er in der obigen XML-Datei nicht angegeben wurde, wurde das Standard-ID-Feld generiert und ist eine Kombination aus RowID-Spaltenfamilie-Spaltenname.

Speichern Sie an dieser Stelle die Änderungen und starten Sie Lily HBase Indexer aus Cloudera Manager.

Einrichten der Posteingangstabelle in HBase

Es gibt viele Möglichkeiten, die Tabelle programmgesteuert in HBase zu erstellen (Java-API, REST-API oder eine ähnliche Methode). Hier verwenden Sie die HBase-Shell, um die Posteingangstabelle zu erstellen (wobei Sie absichtlich einen aussagekräftigen Spaltenfamiliennamen verwenden, um die Dinge leichter nachvollziehen zu können). In Produktionsanwendungen sollte der Familienname immer kurz sein, da er immer mit jedem Wert als Teil eines Zellschlüssels gespeichert wird. Der folgende Befehl erledigt dies und aktiviert die Replikation für eine Spaltenfamilie namens „messages“:

hbase(main):003:0>  create 'inbox', {NAME => 'messages', REPLICATION_SCOPE => 1}

Um zu überprüfen, ob die Tabelle korrekt erstellt wurde, führen Sie den folgenden Befehl aus:

hbase(main):003:0> describe 'inbox'
DESCRIPTION                                                                ENABLED
 {NAME => 'inbox', FAMILIES => [{NAME => 'messages', DATA_BLOCK_ENCODING => ' true
 NONE', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '1', VERSIONS => '3',
 COMPRESSION => 'NONE', MIN_VERSIONS => '0', TTL => '2147483647', KEEP_DEL
 ETED_CELLS => 'false', BLOCKSIZE => '65536', IN_MEMORY => 'false', ENCODE
 _ON_DISK => 'true', BLOCKCACHE => 'true'}]}

Von diesem Punkt an löst jede E-Mail, die in der Tabelle „Posteingang“ in der Spaltenfamilie „Nachrichten“ abgelegt wird, ein Ereignis an Lily HBase Indexer aus, der das Ereignis verarbeitet, es in Felder aufteilt und es zur Indizierung an Solr sendet.

Das Schema der Posteingangstabelle ist einfach:Die Zeilen-ID ist der Name der Person, der dieser Posteingang gehört. Jede Zelle ist eine einzelne Nachricht, wobei die Spalte eine eindeutige ganzzahlige ID ist. Unten ist ein Schnappschuss einer Beispieltabelle, wie sie von der HBase-Oberfläche von Hue angezeigt wird:

Zugriff auf die Daten

Sie haben die Wahl zwischen vielen visuellen Tools, um auf die indizierten E-Mails zuzugreifen. Hue und Solr GUI sind beide sehr gute Optionen. HBase ermöglicht auch eine Reihe von Zugriffstechniken, nicht nur über eine GUI, sondern auch über die HBase-Shell, API und sogar einfache Skripttechniken.

Die Integration mit Solr gibt Ihnen große Flexibilität und kann auch sehr einfache sowie erweiterte Suchoptionen für Ihre Daten bereitstellen. Wenn Sie beispielsweise die Solr-Datei schema.xml so konfigurieren, dass alle Felder innerhalb des E-Mail-Objekts in Solr gespeichert werden, können Benutzer über eine einfache Suche auf den vollständigen Nachrichtentext zugreifen, wobei Speicherplatz und Rechenkomplexität in Kauf genommen werden müssen.

Alternativ können Sie Solr so konfigurieren, dass nur eine begrenzte Anzahl von Feldern gespeichert wird, z. B. ID, Absender und Betreff. Mit diesen Elementen können Benutzer Solr schnell durchsuchen und die Nachrichten-ID(s) abrufen, die wiederum verwendet werden können, um die vollständige Nachricht von HBase selbst abzurufen.

Das folgende Beispiel speichert nur die Nachrichten-ID in Solr, indiziert jedoch alle Felder innerhalb des E-Mail-Objekts. Beim Durchsuchen von Solr in diesem Szenario werden E-Mail-IDs abgerufen, die Sie dann zum Abfragen von HBase verwenden können. Diese Art der Einrichtung ist ideal für Solr, da sie die Speicherkosten niedrig hält und die Indizierungsfunktionen von Solr voll ausschöpft.

Das folgende Shell-Skript sendet eine Abfrage an die Solr-Rest-API für ein Schlüsselwort „productId“ und gibt das Feld „id“ im CSV-Format zurück. Das Ergebnis ist eine Liste von Dokument-IDs, die der Abfrage entsprechen. Das Skript durchläuft dann die IDs und unterteilt sie in Zeilen-ID, Spaltenfamilie und Spaltenname, die für den Zugriff auf HBase über die standardmäßige HBase-REST-API verwendet werden.

#!/bin/bash

#  Query SOLR and return the id field for every document
#  that contains the word resign
query_resp=$(curl -s 'http://spark:8983/solr/collection1_shard1_replica1/select?q=productId&fl=id&wt=csv')

# Loop through results of the previous command,
# and use the id to retrieve the cells from HBase via the HBase REST API
for i in  $query_resp
do
            if [ "$i" != "id" ]; then
            cmd=$(echo $i |awk -F'-' '{print "curl -s http://spark:20550/inbox/" $1 "/" $2 ":"  $3}')
            $cmd -H "Accept: application/x-protobuf "
            fi
done

Schlussfolgerung

In diesem Beitrag haben Sie gesehen, wie einfach es ist, in HBase gespeicherte E-Mails zu indizieren – nahezu in Echtzeit und völlig ohne Eingriff in den Hauptfluss von HBase. Zusammenfassend sollten Sie diese Hauptschritte im Hinterkopf behalten:

  • Replikation in HBase aktivieren
  • Lily HBase Indexer richtig konfigurieren
  • Verwenden Sie Morphlines in Lily HBase Indexer, um bei Transformationen zu helfen (keine Codierung erforderlich!)

Wenn Sie die Gelegenheit hatten, den vorherigen Beitrag zu lesen, können Sie sehen, dass die Datei morphlines.conf in allen drei Fällen praktisch identisch ist. Dies bedeutet, dass es sehr einfach ist, die Suchanwendungsfälle über das Hadoop-Ökosystem zu erweitern. Wenn sich die Daten bereits in HDFS befinden, verwenden Sie MapReduceIndexerTool, um sie zu indizieren. Wenn die Daten über Flume ankommen, verwenden Sie SolrMorphlineSink mit einer identischen Morphlines-Datei. Wenn Sie später entscheiden, dass HBase für den Anwendungsfall geeignet ist, ist nur eine minimale Änderung erforderlich, um mit der Indizierung von Zellen in HBase zu beginnen:Fügen Sie einfach den Befehl extractHBaseCells zur Morphlines-Datei hinzu.

Obwohl sich dieses Beispiel auf E-Mails als Anwendungsfall konzentriert, kann diese Methode in vielen anderen Szenarien angewendet werden, in denen HBase als Speicher- und Zugriffsschicht verwendet wird. Wenn Ihr Unternehmen HBase bereits für einen bestimmten Anwendungsfall verwendet, sollten Sie darüber nachdenken, Cloudera Search zusätzlich zu implementieren. Es erfordert keine Programmierung und kann die Daten wirklich einem viel breiteren Publikum in der Organisation zugänglich machen.

Jeff Shmain ist Lösungsarchitekt bei Cloudera.