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

E-mail-indeksering ved hjælp af Cloudera Search og HBase

I mit tidligere indlæg lærte du at indeksere e-mail-meddelelser i batch-tilstand og i næsten realtid ved hjælp af Apache Flume med MorphlineSolrSink. I dette indlæg lærer du, hvordan du indekserer e-mails ved hjælp af Cloudera Search med Apache HBase og Lily HBase Indexer, vedligeholdt af NGDATA og Cloudera. (Hvis du ikke har læst det forrige indlæg, anbefaler jeg, at du gør det som baggrund, før du læser videre.)

Hvilken næsten-realtidsmetode du skal vælge, HBase Indexer eller Flume MorphlineSolrSink, vil helt afhænge af dit brugstilfælde, men nedenfor er nogle ting, du skal overveje, når du træffer denne beslutning:

  • Er HBase et optimalt lagringsmedium til den givne brugssituation?
  • Er dataene allerede indlæst i HBase?
  • Er der et adgangsmønster, der kræver, at filerne gemmes i et andet format end HFiles?
  • Hvis HBase ikke kører i øjeblikket, vil der så være nok hardwareressourcer til at bringe det frem?

Der er to måder at konfigurere Cloudera Search til at indeksere dokumenter, der er gemt i HBase:at ændre konfigurationsfilerne direkte og starte Lily HBase Indexer manuelt eller som en tjeneste, eller at konfigurere alt ved hjælp af Cloudera Manager. Dette indlæg vil fokusere på sidstnævnte, fordi det er langt den nemmeste måde at aktivere søgning på HBase - eller enhver anden tjeneste på CDH, for den sags skyld.

Forstå HBase Replication og Lily HBase Indexer

Ved udformningen af ​​denne løsning identificerede Cloudera fire hovedkrav for at gøre HBase-indeksering effektiv:

  • Indekseringsforsinkelse skal være i næsten realtid (sekunder) og kan indstilles
  • Solr-indekset skal til sidst være i overensstemmelse med HBase-tabellen, mens indsættelser, opdateringer og sletninger anvendes på HBase
  • Indekseringsmekanismen skal være skalerbar og fejltolerant
  • Indekseringsprocessen kan ikke bremse HBase-skrivningen

For at opfylde disse krav bruger Cloudera Search HBases native replikeringsmekanisme. For dem, der ikke er bekendt med HBase-replikering, er her en kort oversigt på meget højt niveau:

Efterhånden som opdateringer anvendes til Write-ahead-log (WAL), lytter HBase RegionServer til disse opdateringer på en separat tråd. Når denne tråds buffer er fyldt, eller den rammer slutningen af ​​filen, sender den batchene med alle de replikerede opdateringer til en peer RegionServer, der kører på en anden klynge. WAL er derfor afgørende for, at indeksering kan fungere.

Cloudera Search bruger HBase-replikeringsmekanismen, som lytter efter HBase-rækkemutationshændelser og i stedet for at sende opdateringer til en anden RegionServer, sender dem til Lily HBase Indexer. Til gengæld anvender Lily HBase Indexer Cloudera Morphlines transformationslogik, opdeler begivenhederne i Solr-felter og videresender dem til Apache Solr Server.

Der er store fordele ved at bruge HBase-replikering i forhold til at implementere den samme funktionalitet i HBase-coprocessorer. For det første fungerer replikering parallelt og asynkront med de data, der indlæses i HBase. Derfor tilføjer Cloudera Search-indeksering ikke nogen latenstid eller operationel ustabilitet til rutinemæssig HBase-drift. For det andet giver brug af replikeringsmetoden mulighed for problemfri on-the-fly ændringer af transformationslogik. Omvendt kræver det en RegionServer-genstart for at udføre en ændring gennem coprocessormodifikation, hvilket ville gøre data utilgængelige for HBase-brugere. Det vigtigste er måske, at implementering af coprocessorer er ret påtrængende og, hvis den ikke testes korrekt, kan det forstyrre HBase-ydeevnen.

Dette flow er illustreret nedenfor:

Installation af Cloudera Search og implementering af Lily HBase Indexer

Cloudera Manager downloader og implementerer Cloudera Search som en enkelt pakke automatisk. Alt du skal gøre er at klikke på "Pakker"-ikonet i den øverste navigering, vælge Solr-versionen og downloade, distribuere og aktivere den:

Som tidligere nævnt afhænger Cloudera Search af HBase-replikering, og det vil derfor blive aktiveret næste gang. Aktiver replikering ved at klikke på HBase Service->Konfiguration->Backup og sikre, at "Aktiver HBase-replikering" og "Aktiver indeksering" begge er markeret. Gem om nødvendigt ændringerne og genstart HBase-tjenesten.

For at tilføje Lily HBase Indexer skal du gå til Tjenester->Tilføj tjeneste , vælg "Keystore Indexer", og tilføj det, og peg det til HBase-forekomsten, der vil blive brugt til e-mail-behandling:

Konfiguration af Solr

Konfigurer derefter Solr nøjagtigt som beskrevet i det forrige indlæg her.

  1. Generer et eksempel på schema.xml-konfigurationsfil:
    $ solrctl --zk localhost:2181/solr \
    instancedir --generate $HOME/emailSearchConfig
    

  2. Rediger filen schema.xml i $HOME/emailSearchConfig med konfigurationsfilen, der definerer felter, der er relevante for e-mailbehandling. En fuld kopi af filen kan findes på dette link.
  3. Upload Solr-konfigurationerne til ZooKeeper:
    $ solrctl --zk localhost:2181/solr instancedir  \
    --create email_collection $HOME/emailSearchConfig
    

  4. Generer Solr-samlingen:
    $ solrctl --zk localhost:2181/solr collection  \
    --create email_collection -s 1
    

Registrering af Indexer

Dette trin er nødvendigt for at tilføje og konfigurere indekseren og HBase-replikeringen. Kommandoen nedenfor vil opdatere ZooKeeper og tilføje myindexer som en replikeringspeer for HBase. Det vil også indsætte konfigurationer i ZooKeeper, som Lily HBase Indexer vil bruge til at pege på den rigtige samling i Solr.

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

Argumenter:

  • -n myindexer – angiver navnet på den indeksering, der vil blive registreret i ZooKeeper
  • -c indexer-config.xml – konfigurationsfil, der specificerer indekseringsadfærd
  • -cp solr.zk=localhost:2181/solr  – angiver placeringen af ​​ZooKeeper og Solr config. Dette bør opdateres med den miljøspecifikke placering af ZooKeeper.
  • -cp solr.collection=collection1 – angiver hvilken samling der skal opdateres. Husk Solr-konfigurationstrinnet, hvor vi oprettede samling1.

Filen index-config.xml er relativt ligetil i dette tilfælde; alt det gør, er at specificere for indekseren, hvilken tabel der skal ses på, den klasse, der skal bruges som mapper (com.ngdata.hbaseindexer.morphline.MorphlineResultToSolrMapper), og placeringen af ​​Morphline-konfigurationsfilen. Tilknytningstypen er sat til kolonne fordi vi ønsker at få hver celle som et individuelt Solr-dokument. Som standard er mapping-type sat til række , i hvilket tilfælde Solr-dokumentet bliver den fulde række.

Param name=”morphlineFile” angiver placeringen af ​​Morphlines-konfigurationsfilen. Placeringen kunne være en absolut sti til din Morphlines-fil, men da du bruger Cloudera Manager, skal du angive den relative sti:"morphlines.conf".

   
   


   
   

Indholdet af hbase-indexer-konfigurationsfilen kan findes på dette link.

For fuld reference til hbase-indexer-kommandoen er det tilstrækkeligt at udføre kommandoen uden nogen argumenter:

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

Konfiguration og start af Lily HBase Indexer

Hvis du husker, da du tilføjede Lily HBase Indexer, specificerede du den forekomst af HBase, som den er knyttet til. Derfor behøver du ikke gøre det i dette trin. Du skal dog specificere Morphlines-transformationslogikken, der gør det muligt for denne indeksering at parse e-mail-meddelelser og udtrække alle relevante felter.

Gå til Services og vælg Lily HBase Indexer, som du tidligere tilføjede. Vælg Konfigurationer->Vis og rediger->Service-Wide->Morphlines . Kopiér og indsæt morphlines-filen.

E-mail morphlines-biblioteket udfører følgende handlinger:

1.     Læs HBase-e-mailbegivenhederne med kommandoen extractHBaseCells
2. Del den ustrukturerede tekst op i felter med grok-kommandoen
3. Hvis Message-ID mangler i e-mailen, skal du generere den med kommandoen generUUID
4. Konverter datoen/tidsstemplet til et felt, som Solr vil forstå, med kommandoen convertTimestamp
5. Slet alle de ekstra felter, som vi ikke har angivet i schema.xml, med sanitizeUknownSolrFieldscommand

extractHBaseCells-kommandoen fortjener mere opmærksomhed, da det er det eneste, der er anderledes ved HBase Indexers morphlines-konfiguration. Parametrene er:

  • inputColumn – angiver kolonner, der skal abonneres på (kan være wild card)
  • outputFied – navnet på det felt, hvor dataene sendes til
  • type – feltets type (det er streng i tilfælde af e-mail-tekst)
  • kilde – kan være værdifuld eller kvalificeret; værdi angiver, at celleværdien skal indekseres
extractHBaseCells {
       mappings : [
        {
          inputColumn : "messages:*"
          outputField : "message"
          type : string
          source : value
          }
        ]
      }

Download en kopi af denne morphlines-fil herfra.

En vigtig bemærkning er, at id-feltet bliver automatisk genereret af Lily HBase Indexer. Denne indstilling kan konfigureres i index-config.xml-filen ovenfor ved at angive unikke-nøgle-felt-attributten. Det er en bedste praksis at forlade standardnavnet på id'et - da det ikke var angivet i xml-filen ovenfor, blev standard-id-feltet genereret og vil være en kombination af RowID-Column Family-Column Name.

Gem på dette tidspunkt ændringerne og start Lily HBase Indexer fra Cloudera Manager.

Opsætning af indbakketabellen i HBase

Der er mange måder at oprette tabellen i HBase på programmatisk (Java API, REST API eller en lignende metode). Her skal du bruge HBase-skallen til at oprette indbakketabellen (med vilje ved at bruge et beskrivende kolonnefamilienavn for at gøre tingene nemmere at følge). I produktionsapplikationer skal familienavnet altid være kort, da det altid er gemt med hver værdi som en del af en cellenøgle. Følgende kommando vil gøre det og aktivere replikering på en kolonnefamilie kaldet "meddelelser":

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

For at kontrollere, at tabellen er oprettet korrekt, skal du køre følgende kommando:

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

Fra dette tidspunkt vil enhver e-mail, der lægges i tabellen "indbakke" i kolonnefamilien "beskeder", udløse en begivenhed til Lily HBase Indexer, som vil behandle begivenheden, opdele den i felter og sende den til Solr til indeksering.

Skemaet for indbakketabellen er enkelt:Række-id'et er navnet på den person, som denne indbakke tilhører. Hver celle er en individuel besked, hvor kolonnen er et unikt heltals-id. Nedenfor er et øjebliksbillede af en eksempeltabel som vist af Hues HBase-grænseflade:

Adgang til dataene

Du har valget mellem mange visuelle værktøjer til at få adgang til de indekserede e-mails. Hue og Solr GUI er begge meget gode muligheder. HBase muliggør også en række adgangsteknikker, ikke kun fra en GUI, men også via HBase-shell, API og endda simple scriptteknikker.

Integration med Solr giver dig stor fleksibilitet og kan også give meget enkle såvel som avancerede søgemuligheder for dine data. Konfiguration af Solr schema.xml-filen, således at alle felter i e-mail-objektet er gemt i Solr, giver brugerne adgang til hele meddelelsesteksterne via en simpel søgning, med en afvejning af lagerplads og computerkompleksitet.

Alternativt kan du konfigurere Solr til kun at gemme et begrænset antal felter, såsom id, afsender og emne. Med disse elementer kan brugere hurtigt søge i Solr og hente besked-id'erne, som igen kan bruges til at hente hele beskeden fra selve HBase.

Eksemplet nedenfor gemmer kun besked-id'et i Solr, men indekserer på alle felter i e-mail-objektet. Søgning i Solr i dette scenarie henter e-mail-id'er, som du derefter kan bruge til at forespørge HBase. Denne type opsætning er ideel til Solr, da den holder lageromkostningerne lave og udnytter Solrs indekseringsmuligheder fuldt ud.

Shell-scriptet nedenfor sender en forespørgsel til Solr Rest API for et søgeord "productId" og returnerer feltet "id" i CSV-format. Resultatet er en liste over dokument-id'er, der matcher forespørgslen. Scriptet går derefter gennem id'erne og deler dem op i række-id, kolonnefamilie og kolonnenavn, som bruges til at få adgang til HBase gennem standard HBase REST API.

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

Konklusion

I dette indlæg har du set, hvor nemt det er at indeksere e-mails, der er gemt i HBase - i næsten realtid og fuldstændigt ikke-påtrængende til det primære HBase-flow. Sammenfattende skal du huske på disse hovedtrin:

  • Aktiver replikering i HBase
  • Konfigurer Lily HBase Indexer korrekt
  • Brug Morphlines i Lily HBase Indexer til at hjælpe med transformationer (ingen kodning påkrævet!)

Hvis du har haft mulighed for at læse det forrige indlæg, kan du se, at filen morphlines.conf er praktisk talt identisk i alle tre tilfælde. Dette betyder, at det er meget nemt at udvide søgeanvendelsestilfældene over Hadoop-økosystemet. Hvis dataene allerede er i HDFS, skal du bruge MapReduceIndexerTool til at indeksere dem. Hvis dataene kommer gennem Flume, skal du bruge SolrMorphlineSink med en identisk morphlines-fil. Hvis du senere beslutter dig for, at HBase passer til use casen, kræves der kun en minimal ændring for at begynde at indeksere celler i HBase:Tilføj blot kommandoen extractHBaseCells til morphlines-filen.

Selvom dette eksempel koncentrerer sig om e-mails som et use case, kan denne metode anvendes i mange andre scenarier, hvor HBase bruges som et lager- og adgangslag. Hvis din virksomhed allerede bruger HBase til en specifik use case, kan du overveje at implementere Cloudera Search oven i det. Det kræver ingen kodning og kan virkelig åbne op for dataene for et meget bredere publikum i organisationen.

Jeff Shmain er løsningsarkitekt hos Cloudera.


  1. Design af en applikation med Redis som datalager. Hvad? Hvorfor?

  2. $lookup på ObjectId'er i et array

  3. Hvordan opdaterer man værdien af ​​et specifikt indlejret dokument i et array af et specifikt dokument i MongoDB?

  4. Hvad er den rigtige måde at håndtere Redis-forbindelse i Tornado? (Asynkron - Pub/Sub)