HBase
 sql >> Database >  >> NoSQL >> HBase

Indicizzazione e-mail utilizzando Cloudera Search e HBase

Nel mio post precedente hai imparato come indicizzare i messaggi di posta elettronica in modalità batch e quasi in tempo reale, utilizzando Apache Flume con MorphlineSolrSink. In questo post imparerai come indicizzare le email usando Cloudera Search con Apache HBase e Lily HBase Indexer, gestiti da NGDATA e Cloudera. (Se non hai letto il post precedente, ti consiglio di farlo come sfondo prima di continuare a leggere.)

Quale metodo quasi in tempo reale scegliere, HBase Indexer o Flume MorphlineSolrSink, dipenderà interamente dal tuo caso d'uso, ma di seguito sono riportati alcuni aspetti da considerare quando prendi questa decisione:

  • HBase è un supporto di archiviazione ottimale per il caso d'uso indicato?
  • I dati sono già stati inseriti in HBase?
  • Esiste un modello di accesso che richiede che i file siano archiviati in un formato diverso da HFiles?
  • Se HBase non è attualmente in esecuzione, ci saranno abbastanza risorse hardware per attivarlo?

Esistono due modi per configurare Cloudera Search per indicizzare i documenti archiviati in HBase:per modificare direttamente i file di configurazione e avviare Lily HBase Indexer manualmente o come servizio, oppure per configurare tutto utilizzando Cloudera Manager. Questo post si concentrerà su quest'ultimo, perché è di gran lunga il modo più semplice per abilitare la ricerca su HBase o qualsiasi altro servizio su CDH, se è per questo.

Capire la replica HBase e l'indicizzatore Lily HBase

Durante la progettazione di questa soluzione, Cloudera ha identificato quattro requisiti principali per rendere efficace l'indicizzazione HBase:

  • La latenza dell'indicizzazione deve essere quasi in tempo reale (secondi) e sintonizzabile
  • L'indice Solr deve eventualmente essere coerente con la tabella HBase mentre inserimenti, aggiornamenti ed eliminazioni vengono applicati a HBase
  • Il meccanismo di indicizzazione deve essere scalabile e tollerante ai guasti
  • Il processo di indicizzazione non può rallentare le scritture HBase

Per soddisfare questi requisiti, Cloudera Search utilizza il meccanismo di replica nativo di HBase. Per chi non ha familiarità con la replica HBase, ecco un breve riassunto di alto livello:

Quando gli aggiornamenti vengono applicati al write-ahead-log (WAL), HBase RegionServer ascolta questi aggiornamenti su un thread separato. Quando il buffer di quel thread viene riempito o raggiunge la fine del file, invia i batch con tutti gli aggiornamenti replicati a un RegionServer peer in esecuzione su un cluster diverso. Il WAL, quindi, è essenziale affinché l'indicizzazione funzioni.

Cloudera Search utilizza il meccanismo di replica HBase, che ascolta gli eventi di mutazione della riga HBase e, invece di inviare aggiornamenti a un diverso RegionServer, li invia a Lily HBase Indexer. A sua volta, Lily HBase Indexer applica la logica di trasformazione di Cloudera Morphlines, suddividendo gli eventi in campi Solr e inoltrandoli ad Apache Solr Server.

Ci sono grandi vantaggi nell'usare la replica HBase rispetto all'implementazione della stessa funzionalità nei coprocessori HBase. Innanzitutto, la replica funziona in parallelo e in modo asincrono con i dati inseriti in HBase. Pertanto, l'indicizzazione di Cloudera Search non aggiunge latenza o instabilità operativa alle operazioni di routine di HBase. In secondo luogo, l'utilizzo del metodo di replica consente modifiche immediate e senza interruzioni alla logica di trasformazione. Al contrario, per effettuare una modifica tramite la modifica del coprocessore è necessario un riavvio di RegionServer, che renderebbe i dati non disponibili per gli utenti HBase. Forse la cosa più importante è che l'implementazione di coprocessori è abbastanza invadente e, se non testata correttamente, può interrompere le prestazioni di HBase.

Questo flusso è illustrato di seguito:

Installazione di Cloudera Search e distribuzione di Lily HBase Indexer

Cloudera Manager scarica e distribuisce automaticamente Cloudera Search come un unico pacchetto. Tutto quello che devi fare è fare clic sull'icona "Pacchetti" nella barra di navigazione in alto, scegliere la versione Solr e scaricarla, distribuirla e attivarla:

Come accennato in precedenza, Cloudera Search dipende dalla replica HBase e, quindi, verrà abilitata successivamente. Attiva la replica facendo clic su Servizio HBase->Configurazione->Backup e assicurandosi che "Abilita replica HBase" e "Abilita indicizzazione" siano entrambi selezionati. Se necessario, salva le modifiche e riavvia il servizio HBase.

Per aggiungere Lily HBase Indexer, vai su Servizi->Aggiungi servizio , scegli "Keystore Indexer" e aggiungilo, puntandolo all'istanza HBase che verrà utilizzata per l'elaborazione della posta elettronica:

Configurazione di Solr

Quindi, configura Solr esattamente come descritto nel post precedente qui.

  1. Genera un file di configurazione schema.xml di esempio:
    $ solrctl --zk localhost:2181/solr \
    instancedir --generate $HOME/emailSearchConfig
    

  2. Modifica il file schema.xml in $HOME/emailSearchConfig, con il file di configurazione che definirà i campi relativi all'elaborazione della posta elettronica. Una copia completa del file è disponibile a questo link.
  3. Carica le configurazioni Solr su ZooKeeper:
    $ solrctl --zk localhost:2181/solr instancedir  \
    --create email_collection $HOME/emailSearchConfig
    

  4. Genera la raccolta Solr:
    $ solrctl --zk localhost:2181/solr collection  \
    --create email_collection -s 1
    

Registrazione dell'indicizzatore

Questo passaggio è necessario per aggiungere e configurare l'indicizzatore e la replica HBase. Il comando seguente aggiornerà ZooKeeper e aggiungerà myindexer come peer di replica per HBase. Inserisce anche le configurazioni in ZooKeeper, che Lily HBase Indexer utilizzerà per puntare alla raccolta corretta in Solr.

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

Argomenti:

  • -n myindexer – specifica il nome dell'indicizzatore che verrà registrato in ZooKeeper
  • -c indexer-config.xml – file di configurazione che specificherà il comportamento dell'indicizzatore
  • -cp solr.zk=localhost:2181/solr  – specifica la posizione di ZooKeeper e Solr config. Questo dovrebbe essere aggiornato con la posizione specifica dell'ambiente di ZooKeeper.
  • -cp solr.collection=collection1 – specifica quale raccolta aggiornare. Richiama il passaggio di configurazione Solr in cui abbiamo creato la raccolta1.

Il file index-config.xml è relativamente semplice in questo caso; tutto ciò che fa è specificare all'indicizzatore quale tabella guardare, la classe che verrà utilizzata come mappatore (com.ngdata.hbaseindexer.morphline.MorphlineResultToSolrMapper) e la posizione del file di configurazione Morphline. Il tipo di mappatura è impostato su colonna perché vogliamo ottenere ogni cella come un singolo documento Solr. Per impostazione predefinita, il tipo di mappatura è impostato su riga , nel qual caso il documento Solr diventa l'intera riga.

Param name="morphlineFile" specifica la posizione del file di configurazione Morphlines. La posizione potrebbe essere un percorso assoluto del tuo file Morphlines, ma poiché stai utilizzando Cloudera Manager, specifica il percorso relativo:"morphlines.conf".

   
   


   
   

Il contenuto del file di configurazione di hbase-indexer può essere trovato a questo link.

Per il riferimento completo del comando hbase-indexer, è sufficiente eseguire il comando senza argomenti:

$ 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.

Configurazione e avvio di Lily HBase Indexer

Se ricordi, quando hai aggiunto Lily HBase Indexer, hai specificato l'istanza di HBase a cui è associato. Pertanto, non è necessario farlo in questo passaggio. Tuttavia, devi specificare la logica di trasformazione Morphlines che consentirà a questo indicizzatore di analizzare i messaggi di posta elettronica ed estrarre tutti i campi pertinenti.

Vai su Servizi e scegli Lily HBase Indexer che hai aggiunto in precedenza. Seleziona Configurazioni->Visualizza e modifica->A livello di servizio->Morfline . Copia e incolla il file morphlines.

La libreria delle morfoline e-mail eseguirà le seguenti azioni:

1.     Leggi gli eventi email di HBase con il comando extractHBaseCells
2. Suddividi il testo non strutturato in campi con il comando grok
3. Se l'ID messaggio non è presente nell'e-mail, generalo con il comando generateUUID
4. Converti la data/l'ora in un campo comprensibile a Solr, con il comando convertTimestamp
5. Elimina tutti i campi extra che non abbiamo specificato in schema.xml, con il comando sanitizeUknownSolrField

Il comando extractHBaseCells merita maggiore attenzione, in quanto è l'unica cosa diversa nella configurazione delle morfoline di HBase Indexer. I parametri sono:

  • inputColumn:specifica le colonne a cui iscriversi (può essere un carattere jolly)
  • outputFied – il nome del campo in cui vengono inviati i dati
  • tipo – il tipo del campo (è una stringa nel caso del corpo dell'email)
  • fonte – potrebbe essere di valore o qualificato; value specifica che il valore della cella deve essere indicizzato
extractHBaseCells {
       mappings : [
        {
          inputColumn : "messages:*"
          outputField : "message"
          type : string
          source : value
          }
        ]
      }

Scarica una copia di questo file morphlines da qui.

Una nota importante è che il campo id verrà generato automaticamente da Lily HBase Indexer. Tale impostazione è configurabile nel file index-config.xml sopra specificando l'attributo unique-key-field. È consigliabile lasciare il nome id predefinito:poiché non è stato specificato nel file xml sopra, il campo id predefinito è stato generato e sarà una combinazione di RowID-Column Family-Column Name.

A questo punto salva le modifiche e avvia Lily HBase Indexer da Cloudera Manager.

Impostazione della tabella Posta in arrivo in HBase

Esistono molti modi per creare la tabella in HBase a livello di codice (API Java, API REST o un metodo simile). Qui utilizzerai la shell HBase per creare la tabella della posta in arrivo (utilizzando intenzionalmente un nome di famiglia descrittivo di colonne per rendere le cose più facili da seguire). Nelle applicazioni di produzione, il cognome dovrebbe essere sempre breve, poiché è sempre memorizzato con ogni valore come parte di una chiave di cella. Il comando seguente lo farà e consentirà la replica su una famiglia di colonne denominata "messages":

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

Per verificare che la tabella sia stata creata correttamente esegui il seguente comando:

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'}]}

Da questo momento, qualsiasi email inserita nella tabella "inbox" nella famiglia di colonne "messages" attiverà un evento in Lily HBase Indexer, che elaborerà l'evento, lo suddividerà in campi e lo invierà a Solr per l'indicizzazione.

Lo schema della tabella della posta in arrivo è semplice:l'ID riga è il nome della persona a cui appartiene questa posta in arrivo. Ogni cella è un messaggio individuale con la colonna come ID intero univoco. Di seguito è riportato un'istantanea di una tabella di esempio visualizzata dall'interfaccia HBase di Hue:

Accesso ai dati

Puoi scegliere tra molti strumenti visivi per accedere alle e-mail indicizzate. Hue e Solr GUI sono entrambe ottime opzioni. HBase consente anche una serie di tecniche di accesso, non solo da una GUI ma anche tramite la shell HBase, API e persino semplici tecniche di scripting.

L'integrazione con Solr ti offre una grande flessibilità e può anche fornire opzioni di ricerca molto semplici e avanzate per i tuoi dati. Ad esempio, la configurazione del file schema.xml di Solr in modo tale che tutti i campi all'interno dell'oggetto e-mail siano archiviati in Solr consente agli utenti di accedere ai corpi dei messaggi completi tramite una semplice ricerca, con il compromesso di spazio di archiviazione e complessità di calcolo.

In alternativa, puoi configurare Solr per memorizzare solo un numero limitato di campi, come l'id, il mittente e l'oggetto. Con questi elementi, gli utenti possono cercare rapidamente Solr e recuperare gli ID dei messaggi che a loro volta possono essere utilizzati per recuperare l'intero messaggio dalla stessa HBase.

L'esempio seguente memorizza solo l'ID messaggio in Solr ma indicizza tutti i campi all'interno dell'oggetto email. La ricerca di Solr in questo scenario recupera gli ID e-mail, che puoi quindi utilizzare per interrogare HBase. Questo tipo di configurazione è ideale per Solr in quanto mantiene bassi i costi di archiviazione e sfrutta appieno le capacità di indicizzazione di Solr.

Lo script della shell seguente invia una query all'API Solr Rest per una parola chiave "productId" e restituisce il campo "id" in formato CSV. Il risultato è un elenco di ID documento che corrispondono alla query. Lo script quindi scorre gli ID e li suddivide in ID riga, Famiglia colonna e Nome colonna, che vengono utilizzati per accedere a HBase tramite l'API REST HBase standard.

#!/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

Conclusione

In questo post hai visto quanto sia facile indicizzare le email archiviate in HBase, quasi in tempo reale e in modo completamente non intrusivo nel flusso principale di HBase. In sintesi, tieni a mente questi passaggi principali:

  • Abilita la replica in HBase
  • Configura correttamente Lily HBase Indexer
  • Usa Morphlines in Lily HBase Indexer per aiutare con le trasformazioni (nessuna codifica richiesta!)

Se hai avuto modo di leggere il post precedente, puoi notare che il file morphlines.conf è praticamente identico in tutti e tre i casi. Ciò significa che è molto facile far crescere i casi d'uso della ricerca sull'ecosistema Hadoop. Se i dati sono già in HDFS, utilizzare MapReduceIndexerTool per indicizzarli. Se i dati arrivano tramite Flume, utilizzare SolrMorphlineSink con un file morphlines identico. Se in seguito decidi che HBase si adatta al caso d'uso, è necessaria solo una minima modifica per iniziare a indicizzare le celle in HBase:aggiungi semplicemente il comando extractHBaseCells al file morphlines.

Sebbene questo esempio si concentri sulle e-mail come caso d'uso, questo metodo può essere applicato in molti altri scenari in cui HBase viene utilizzato come livello di archiviazione e accesso. Se la tua azienda utilizza già HBase per un caso d'uso specifico, considera l'implementazione di Cloudera Search su di esso. Non richiede codifica e può davvero aprire i dati a un pubblico molto più ampio dell'organizzazione.

Jeff Shmain è un architetto di soluzioni presso Cloudera.