sql >> Database >  >> NoSQL >> HBase

E-mailindexering met Cloudera Search en HBase

In mijn vorige post heb je geleerd hoe je e-mailberichten kunt indexeren in batch-modus, en in bijna realtime, met behulp van Apache Flume met MorphlineSolrSink. In dit bericht leert u hoe u e-mails indexeert met behulp van Cloudera Search met Apache HBase en Lily HBase Indexer, onderhouden door NGDATA en Cloudera. (Als je het vorige bericht niet hebt gelezen, raad ik je aan dit te doen voor achtergrondinformatie voordat je verder leest.)

Welke bijna-realtime methode u moet kiezen, HBase Indexer of Flume MorphlineSolrSink, hangt volledig af van uw gebruik, maar hieronder zijn enkele dingen waarmee u rekening moet houden bij het nemen van die beslissing:

  • Is HBase een optimaal opslagmedium voor de gegeven use case?
  • Zijn de gegevens al opgenomen in HBase?
  • Is er een toegangspatroon waarbij de bestanden moeten worden opgeslagen in een ander formaat dan HFiles?
  • Als HBase momenteel niet actief is, zijn er dan voldoende hardwarebronnen om het te openen?

Er zijn twee manieren om Cloudera Search te configureren om documenten die zijn opgeslagen in HBase te indexeren:om de configuratiebestanden rechtstreeks te wijzigen en Lily HBase Indexer handmatig of als een service te starten, of om alles te configureren met Cloudera Manager. Dit bericht zal zich richten op het laatste, omdat dit verreweg de gemakkelijkste manier is om Zoeken op HBase in te schakelen - of een andere service op CDH, wat dat betreft.

HBase-replicatie en Lily HBase Indexer begrijpen

Bij het ontwerpen van deze oplossing identificeerde Cloudera vier belangrijke vereisten om HBase-indexering effectief te maken:

  • De indexeringslatentie moet bijna realtime (seconden) zijn en instelbaar
  • De Solr-index moet uiteindelijk consistent zijn met de HBase-tabel terwijl invoegingen, updates en verwijderingen worden toegepast op HBase
  • Het indexeringsmechanisme moet schaalbaar en fouttolerant zijn
  • Het indexeringsproces kan het schrijven van HBase niet vertragen

Om aan deze vereisten te voldoen, gebruikt Cloudera Search het native replicatiemechanisme van HBase. Voor degenen die niet bekend zijn met HBase-replicatie, hier is een korte samenvatting van zeer hoog niveau:

Terwijl updates worden toegepast op het write-ahead-log (WAL), luistert HBase RegionServer naar deze updates op een aparte thread. Wanneer de buffer van die thread is gevuld of het einde van het bestand bereikt, stuurt het de batches met alle gerepliceerde updates naar een peer RegionServer die op een ander cluster draait. De WAL is daarom essentieel om indexeren te laten werken.

Cloudera Search gebruikt het HBase-replicatiemechanisme, dat luistert naar HBase-rijmutatiegebeurtenissen en, in plaats van updates naar een andere RegionServer te sturen, deze naar Lily HBase Indexer stuurt. Lily HBase Indexer past op zijn beurt de transformatielogica van Cloudera Morphlines toe, waarbij de gebeurtenissen worden opgedeeld in Solr-velden en deze worden doorgestuurd naar Apache Solr Server.

Het gebruik van HBase-replicatie heeft grote voordelen ten opzichte van het implementeren van dezelfde functionaliteit in HBase-coprocessors. Ten eerste werkt replicatie parallel en asynchroon met de gegevens die in HBase worden opgenomen. Daarom voegt Cloudera Search-indexering geen latentie of operationele instabiliteit toe aan routinematige HBase-bewerkingen. Ten tweede zorgt het gebruik van de replicatiemethode voor naadloze on-the-fly wijzigingen in de transformatielogica. Omgekeerd, om een ​​wijziging door middel van coprocessor-modificatie door te voeren, moet de RegionServer opnieuw worden opgestart, waardoor de gegevens niet meer beschikbaar zijn voor HBase-gebruikers. Misschien wel het belangrijkste is dat het implementeren van coprocessors behoorlijk opdringerig is en, als ze niet goed worden getest, de HBase-prestaties kan verstoren.

Deze stroom wordt hieronder geïllustreerd:

Cloudera Search installeren en Lily HBase Indexer implementeren

Cloudera Manager downloadt en implementeert Cloudera Search automatisch als één pakket. Het enige wat u hoeft te doen is op het pictogram "Pakketten" in de navigatie bovenaan te klikken, de Solr-versie te kiezen en deze te downloaden, distribueren en activeren:

Zoals eerder vermeld, is Cloudera Search afhankelijk van HBase-replicatie en daarom wordt dat vervolgens ingeschakeld. Activeer replicatie door te klikken op HBase Service->Configuratie->Back-up en ervoor zorgen dat "HBase-replicatie inschakelen" en "Indexering inschakelen" beide zijn aangevinkt. Sla indien nodig de wijzigingen op en start de HBase-service opnieuw.

Om Lily HBase Indexer toe te voegen, gaat u naar Services->Service toevoegen , kies "Keystore Indexer" en voeg het toe, wijzend naar de HBase-instantie die zal worden gebruikt voor e-mailverwerking:

Solr configureren

Configureer vervolgens Solr precies zoals beschreven in het vorige bericht hier.

  1. Genereer een voorbeeldschema.xml-configuratiebestand:
    $ solrctl --zk localhost:2181/solr \
    instancedir --generate $HOME/emailSearchConfig
    

  2. Bewerk het schema.xml-bestand in $HOME/emailSearchConfig, met het configuratiebestand dat velden definieert die relevant zijn voor e-mailverwerking. Een volledige kopie van het bestand is te vinden via deze link.
  3. Upload de Solr-configuraties naar ZooKeeper:
    $ solrctl --zk localhost:2181/solr instancedir  \
    --create email_collection $HOME/emailSearchConfig
    

  4. Genereer de Solr-verzameling:
    $ solrctl --zk localhost:2181/solr collection  \
    --create email_collection -s 1
    

De indexeerder registreren

Deze stap is nodig om de Indexeer functie en HBase-replicatie toe te voegen en te configureren. Met de onderstaande opdracht wordt ZooKeeper bijgewerkt en wordt myindexer toegevoegd als replicatiepeer voor HBase. Het zal ook configuraties invoegen in ZooKeeper, die Lily HBase Indexer zal gebruiken om naar de juiste collectie in Solr te verwijzen.

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

Argumenten:

  • -n myindexer – specificeert de naam van de indexer die wordt geregistreerd in ZooKeeper
  • -c indexer-config.xml – configuratiebestand dat indexergedrag specificeert
  • -cp solr.zk=localhost:2181/solr  – specificeert de locatie van ZooKeeper en Solr config. Dit moet worden bijgewerkt met de omgevingsspecifieke locatie van ZooKeeper.
  • -cp solr.collection=collection1 – specificeert welke collectie moet worden bijgewerkt. Denk aan de Solr-configuratiestap waar we collection1 hebben gemaakt.

Het bestand index-config.xml is in dit geval relatief eenvoudig; het enige wat het doet is aan de indexeerder specificeren naar welke tabel moet worden gekeken, de klasse die als mapper zal worden gebruikt (com.ngdata.hbaseindexer.morphline.MorphlineResultToSolrMapper) en de locatie van het Morphline-configuratiebestand. Het toewijzingstype is ingesteld op kolom omdat we elke cel als een afzonderlijk Solr-document willen krijgen. Standaard is het toewijzingstype ingesteld op rij , in welk geval het Solr-document de volledige rij wordt.

Param name=”morphlineFile” specificeert de locatie van het Morphlines-configuratiebestand. De locatie kan een absoluut pad zijn van uw Morphlines-bestand, maar aangezien u Cloudera Manager gebruikt, specificeert u het relatieve pad:"morphlines.conf".

   
   


   
   

De inhoud van het hbase-indexer configuratiebestand is te vinden via deze link.

Voor de volledige referentie van het hbase-indexer-commando is het voldoende om het commando zonder argumenten uit te voeren:

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

Configureren en starten van Lily HBase Indexer

Als je je herinnert, toen je Lily HBase Indexer toevoegde, heb je het exemplaar van HBase opgegeven waaraan het is gekoppeld. Daarom hoeft u dat in deze stap niet te doen. U moet echter wel de Morphlines-transformatielogica specificeren waarmee deze indexeerder e-mailberichten kan ontleden en alle relevante velden kan extraheren.

Ga naar Services en kies Lily HBase Indexer die je eerder hebt toegevoegd. Selecteer Configuraties->Bekijken en bewerken->Service-Wide->Morphlines . Kopieer en plak het morphlines-bestand.

De e-mail morphlines-bibliotheek zal de volgende acties uitvoeren:

1.     Lees de HBase-e-mailgebeurtenissen met de opdracht extractHBaseCells
2. Verdeel de ongestructureerde tekst in velden met het grok-commando
3. Als Message-ID in de e-mail ontbreekt, genereer deze dan met de opdracht GenereerUUID
4. Converteer de datum/tijdstempel naar een veld dat Solr begrijpt, met de opdracht convertTimestamp
5. Verwijder alle extra velden die we niet hebben gespecificeerd in schema.xml, met de opdracht sanitizeUknownSolrFields

De opdracht extractHBaseCells verdient meer aandacht, omdat dit het enige is dat anders is aan de morphlines-configuratie van de HBase Indexer. De parameters zijn:

  • inputColumn – specificeert kolommen waarop u zich wilt abonneren (mag wildcard zijn)
  • outputFied – de naam van het veld waar de gegevens naartoe worden gestuurd
  • type – het type van het veld (het is een tekenreeks in het geval van de hoofdtekst van een e-mail)
  • bron – kan waarde of gekwalificeerd zijn; waarde geeft aan dat de celwaarde moet worden geïndexeerd
extractHBaseCells {
       mappings : [
        {
          inputColumn : "messages:*"
          outputField : "message"
          type : string
          source : value
          }
        ]
      }

Download hier een kopie van dit morphlines-bestand.

Een belangrijke opmerking is dat het id-veld automatisch wordt gegenereerd door Lily HBase Indexer. Die instelling kan worden geconfigureerd in het bestand index-config.xml hierboven door het kenmerk unique-key-field op te geven. Het is een best practice om de standaardnaam van id te laten. Omdat deze niet is gespecificeerd in het XML-bestand hierboven, is het standaard id-veld gegenereerd en zal een combinatie zijn van RowID-Column Family-Column Name.

Sla nu de wijzigingen op en start Lily HBase Indexer vanuit Cloudera Manager.

De Inbox-tabel instellen in HBase

Er zijn veel manieren om de tabel programmatisch in HBase te maken (Java API, REST API of een vergelijkbare methode). Hier gebruik je de HBase-shell om de inbox-tabel te maken (met opzet een beschrijvende kolomfamilienaam om dingen gemakkelijker te volgen te maken). In productietoepassingen moet de familienaam altijd kort zijn, omdat deze altijd met elke waarde wordt opgeslagen als onderdeel van een celsleutel. De volgende opdracht zal dat doen en replicatie inschakelen op een kolomfamilie genaamd "berichten":

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

Voer de volgende opdracht uit om te controleren of de tabel correct is gemaakt:

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

Vanaf dit punt zal elke e-mail die in tabel "inbox" in kolomfamilie "berichten" wordt geplaatst, een gebeurtenis activeren naar Lily HBase Indexer, die de gebeurtenis zal verwerken, in velden zal opsplitsen en naar Solr zal sturen voor indexering.

Het schema van de inbox-tabel is eenvoudig:de rij-ID is de naam van de persoon aan wie deze inbox toebehoort. Elke cel is een afzonderlijk bericht, waarbij de kolom een ​​uniek geheel getal-ID is. Hieronder is een momentopname van een voorbeeldtabel zoals weergegeven door Hue's HBase-interface:

Toegang tot de gegevens

U hebt de keuze uit vele visuele hulpmiddelen om toegang te krijgen tot de geïndexeerde e-mails. Hue en Solr GUI zijn beide zeer goede opties. HBase maakt ook een aantal toegangstechnieken mogelijk, niet alleen vanuit een GUI maar ook via de HBase-shell, API en zelfs eenvoudige scripttechnieken.

Integratie met Solr geeft u een grote flexibiliteit en kan ook zeer eenvoudige en geavanceerde zoekopties voor uw gegevens bieden. Als u bijvoorbeeld het Solr-schema.xml-bestand zodanig configureert dat alle velden in het e-mailobject worden opgeslagen in Solr, kunnen gebruikers via een eenvoudige zoekopdracht toegang krijgen tot volledige berichtteksten, met de afweging van opslagruimte en rekencomplexiteit.

Als alternatief kunt u Solr configureren om slechts een beperkt aantal velden op te slaan, zoals de id, afzender en onderwerp. Met deze elementen kunnen gebruikers snel Solr doorzoeken en de bericht-ID('s) ophalen, die op hun beurt kunnen worden gebruikt om het volledige bericht van HBase zelf op te halen.

Het onderstaande voorbeeld slaat alleen de bericht-ID op in Solr, maar indexeert op alle velden binnen het e-mailobject. Als u in dit scenario in Solr zoekt, worden e-mail-ID's opgehaald, die u vervolgens kunt gebruiken om HBase te doorzoeken. Dit type opstelling is ideaal voor Solr omdat het de opslagkosten laag houdt en volledig profiteert van de indexeringsmogelijkheden van Solr.

Het onderstaande shellscript stuurt een query naar de Solr Rest API voor een trefwoord "productId" en retourneert het veld "id" in CSV-indeling. Het resultaat is een lijst met document-ID's die overeenkomen met de zoekopdracht. Het script doorloopt vervolgens de ID's en verdeelt ze in Rij-ID, Kolomfamilie en Kolomnaam, die worden gebruikt om toegang te krijgen tot HBase via de standaard 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

Conclusie

In dit bericht heb je gezien hoe gemakkelijk het is om e-mails te indexeren die zijn opgeslagen in HBase - in bijna realtime en volledig niet-intrusief voor de hoofdstroom van HBase. Samengevat, houd deze hoofdstappen in gedachten:

  • Replicatie inschakelen in HBase
  • Configureer Lily HBase Indexer op de juiste manier
  • Gebruik Morphlines in Lily HBase Indexer om te helpen met transformaties (geen codering vereist!)

Als je de kans hebt gehad om het vorige bericht te lezen, kun je zien dat het morphlines.conf-bestand in alle drie de gevallen praktisch identiek is. Dit betekent dat het heel eenvoudig is om de use-cases voor zoeken over het Hadoop-ecosysteem te laten groeien. Als de gegevens zich al in HDFS bevinden, gebruikt u MapReduceIndexerTool om deze te indexeren. Als de gegevens via Flume binnenkomen, gebruik dan SolrMorphlineSink met een identiek morphlines-bestand. Als u later besluit dat HBase geschikt is voor het gebruik, is er slechts een minimale wijziging nodig om cellen in HBase te indexeren:voeg gewoon de opdracht extractHBaseCells toe aan het morphlines-bestand.

Hoewel dit voorbeeld zich concentreert op e-mails als een use-case, kan deze methode worden toegepast in veel andere scenario's waarin HBase wordt gebruikt als opslag- en toegangslaag. Als uw onderneming HBase al gebruikt voor een specifieke use case, overweeg dan om Cloudera Search er bovenop te implementeren. Het vereist geen codering en kan de gegevens echt ontsluiten voor een veel breder publiek in de organisatie.

Jeff Shmain is oplossingsarchitect bij Cloudera.


  1. Hoe de 'OF'-voorwaarde toe te passen in de opdracht redis-toetsen?

  2. De ene publicatie verbergt geneste velden van een andere publicatie

  3. Databasestatuscontrole automatiseren

  4. Beheersstroomprobleem met node/redis en callbacks?