HBase
 sql >> Baza danych >  >> NoSQL >> HBase

Indeksowanie wiadomości e-mail za pomocą Cloudera Search i HBase

W moim poprzednim poście dowiedziałeś się, jak indeksować wiadomości e-mail w trybie wsadowym i prawie w czasie rzeczywistym, używając Apache Flume z MorphlineSolrSink. W tym poście dowiesz się, jak indeksować wiadomości e-mail za pomocą Cloudera Search za pomocą Apache HBase i Lily HBase Indexer, utrzymywanych przez NGDATA i Cloudera. (Jeśli nie czytałeś poprzedniego posta, radzę zrobić to jako tło przed czytaniem dalej).

Która metoda działająca w czasie zbliżonym do rzeczywistego do wyboru, HBase Indexer czy Flume MorphlineSolrSink, będzie całkowicie zależeć od przypadku użycia, ale poniżej przedstawiamy kilka rzeczy, które należy wziąć pod uwagę przy podejmowaniu tej decyzji:

  • Czy HBase jest optymalnym nośnikiem pamięci dla danego przypadku użycia?
  • Czy dane są już pozyskiwane do HBase?
  • Czy istnieje jakiś wzorzec dostępu, który będzie wymagał przechowywania plików w formacie innym niż HFiles?
  • Jeśli HBase nie jest obecnie uruchomiony, czy będzie wystarczająca ilość zasobów sprzętowych, aby go uruchomić?

Istnieją dwa sposoby skonfigurowania Cloudera Search do indeksowania dokumentów przechowywanych w HBase:bezpośrednio zmienić pliki konfiguracyjne i uruchomić Lily HBase Indexer ręcznie lub jako usługę, albo skonfigurować wszystko za pomocą Cloudera Manager. Ten post skupi się na tym drugim, ponieważ jest to zdecydowanie najłatwiejszy sposób na włączenie wyszukiwania w HBase — lub dowolnej innej usłudze w CDH.

Zrozumienie replikacji HBase i indeksatora Lily HBase

Projektując to rozwiązanie, Cloudera zidentyfikowała cztery główne wymagania, aby indeksowanie HBase było skuteczne:

  • Opóźnienie indeksowania musi być w czasie zbliżonym do rzeczywistego (w sekundach) i dostosowywane
  • Indeks Solr musi ostatecznie być zgodny z tabelą HBase, podczas gdy wstawiania, aktualizacje i usuwanie są stosowane do HBase
  • Mechanizm indeksowania musi być skalowalny i odporny na błędy
  • Proces indeksowania nie może spowolnić zapisów HBase

Aby spełnić te wymagania, Cloudera Search wykorzystuje natywny mechanizm replikacji HBase. Dla osób niezaznajomionych z replikacją HBase, oto krótkie i bardzo ogólne podsumowanie:

Ponieważ aktualizacje są stosowane do dziennika zapisu z wyprzedzeniem (WAL), HBase RegionServer nasłuchuje tych aktualizacji w osobnym wątku. Gdy bufor tego wątku zostanie wypełniony lub dojdzie do końca pliku, wysyła partie ze wszystkimi zreplikowanymi aktualizacjami do równorzędnego serwera RegionServer działającego w innym klastrze. WAL jest zatem niezbędny do działania indeksowania.

Cloudera Search wykorzystuje mechanizm replikacji HBase, który nasłuchuje zdarzeń mutacji wierszy HBase i zamiast wysyłać aktualizacje do innego RegionServer, wysyła je do Lily HBase Indexer. Z kolei Lily HBase Indexer stosuje logikę transformacji Cloudera Morphlines, dzieląc zdarzenia na pola Solr i przesyłając je do serwera Apache Solr Server.

Korzystanie z replikacji HBase ma duże zalety w porównaniu z implementacją tej samej funkcji w koprocesorach HBase. Po pierwsze, replikacja działa równolegle i asynchronicznie z danymi pozyskiwanymi do HBase. Dlatego indeksowanie Cloudera Search nie dodaje żadnych opóźnień ani niestabilności operacyjnej do rutynowych operacji HBase. Po drugie, użycie metody replikacji pozwala na bezproblemowe wprowadzanie zmian w logice transformacji w locie. I odwrotnie, aby wprowadzić zmianę poprzez modyfikację koprocesora, konieczne jest ponowne uruchomienie RegionServer, co uniemożliwiłoby dostęp do danych użytkownikom HBase. Być może najważniejsze jest to, że implementacja koprocesorów jest dość inwazyjna i, jeśli nie zostanie odpowiednio przetestowana, może zakłócić wydajność HBase.

Ten przepływ jest zilustrowany poniżej:

Instalowanie Cloudera Search i wdrażanie Lily HBase Indexer

Cloudera Manager automatycznie pobiera i wdraża Cloudera Search jako pojedynczy pakiet. Wszystko, co musisz zrobić, to kliknąć ikonę „Pakiety” w górnym panelu nawigacyjnym, wybrać wersję Solr i pobrać, rozesłać i aktywować:

Jak wspomniano wcześniej, Cloudera Search zależy od replikacji HBase i dlatego zostanie ona włączona w następnej kolejności. Aktywuj replikację, klikając HBase Service->Configuration->Backup i upewnienie się, że zaznaczone są „Włącz replikację HBase” i „Włącz indeksowanie”. W razie potrzeby zapisz zmiany i uruchom ponownie usługę HBase.

Aby dodać Lily HBase Indexer, przejdź do Usługi->Dodaj usługę , wybierz „Keystore Indexer” i dodaj go, wskazując instancję HBase, która będzie używana do przetwarzania wiadomości e-mail:

Konfiguracja Solr

Następnie skonfiguruj Solr dokładnie tak, jak opisano w poprzednim poście tutaj.

  1. Wygeneruj przykładowy plik konfiguracyjny schema.xml:
    $ solrctl --zk localhost:2181/solr \
    instancedir --generate $HOME/emailSearchConfig
    

  2. Edytuj plik schema.xml w $HOME/emailSearchConfig za pomocą pliku konfiguracyjnego, który zdefiniuje pola związane z przetwarzaniem wiadomości e-mail. Pełną kopię pliku można znaleźć pod tym linkiem.
  3. Prześlij konfiguracje Solr do ZooKeeper:
    $ solrctl --zk localhost:2181/solr instancedir  \
    --create email_collection $HOME/emailSearchConfig
    

  4. Wygeneruj kolekcję Solr:
    $ solrctl --zk localhost:2181/solr collection  \
    --create email_collection -s 1
    

Rejestracja indeksatora

Ten krok jest potrzebny do dodania i skonfigurowania indeksatora i replikacji HBase. Poniższe polecenie zaktualizuje ZooKeeper i doda myindexer jako element równorzędny replikacji dla HBase. Wstawi również konfiguracje do ZooKeeper, które Lily HBase Indexer użyje do wskazania właściwej kolekcji w Solr.

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

Argumenty:

  • -n myindexer – określa nazwę indeksatora, który zostanie zarejestrowany w ZooKeeper
  • -c indexer-config.xml – plik konfiguracyjny, który określi zachowanie indeksatora
  • -cp solr.zk=localhost:2181/solr  – określa lokalizację konfiguracji ZooKeeper i Solr. Powinno to zostać zaktualizowane o lokalizację ZooKeeper specyficzną dla środowiska.
  • -cp solr.collection=collection1 – określa, którą kolekcję zaktualizować. Przypomnij sobie krok Konfiguracja Solr, w którym utworzyliśmy kolekcję1.

W tym przypadku plik index-config.xml jest stosunkowo prosty; wszystko, co robi, to określa indeksatorowi, na którą tabelę ma patrzeć, klasę, która będzie używana jako maper (com.ngdata.hbaseindexer.morphline.MorphlineResultToSolrMapper) i lokalizację pliku konfiguracyjnego Morphline. Typ mapowania jest ustawiony na kolumnę ponieważ chcemy, aby każda komórka była osobnym dokumentem Solr. Domyślnie typ mapowania jest ustawiony na wiersz , w takim przypadku dokument Solr staje się pełnym wierszem.

Param name="morphlineFile" określa lokalizację pliku konfiguracyjnego Morphlines. Lokalizacja może być ścieżką bezwzględną pliku Morphlines, ale ponieważ używasz Cloudera Manager, określ ścieżkę względną:„morphlines.conf”.

   
   


   
   

Zawartość pliku konfiguracyjnego hbase-indexer można znaleźć pod tym linkiem.

Aby uzyskać pełny opis polecenia hbase-indexer, wystarczy wykonać polecenie bez żadnych argumentów:

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

Konfigurowanie i uruchamianie Lily HBase Indexer

Jeśli pamiętasz, po dodaniu Lily HBase Indexer określiłeś wystąpienie HBase, z którym jest skojarzone. Dlatego nie musisz tego robić na tym etapie. Musisz jednak określić logikę transformacji Morphlines, która pozwoli temu indeksatorowi analizować wiadomości e-mail i wyodrębniać wszystkie odpowiednie pola.

Przejdź do Usługi i wybierz Lily HBase Indexer, który dodałeś wcześniej. Wybierz Konfiguracje->Wyświetl i edytuj->Usługa->Morphlines . Skopiuj i wklej plik morphlines.

Biblioteka e-maili morphlines wykona następujące czynności:

1.     Odczytaj zdarzenia e-mail HBase za pomocą polecenia extractHBaseCells
2. Podziel nieustrukturyzowany tekst na pola za pomocą polecenia grok
3. Jeśli w wiadomości e-mail brakuje identyfikatora Message-ID, wygeneruj go za pomocą polecenia generateUUID
4. Konwertuj datę/znacznik czasu na pole, które Solr zrozumie, za pomocą polecenia convertTimestamp
5. Usuń wszystkie dodatkowe pola, których nie określiliśmy w schema.xml, za pomocą polecenia sanitizeUknownSolrFieldscommand

Polecenie extractHBaseCells zasługuje na większą uwagę, ponieważ jest jedyną różnicą w konfiguracji morflin w HBase Indexer. Parametry to:

  • inputColumn – określa kolumny, które chcesz subskrybować (może to być symbol wieloznaczny)
  • outputFied – nazwa pola, do którego wysyłane są dane
  • typ – typ pola (w przypadku treści wiadomości jest to ciąg znaków)
  • źródło – może być wartościowe lub kwalifikowane; wartość określa, że ​​wartość komórki powinna być indeksowana
extractHBaseCells {
       mappings : [
        {
          inputColumn : "messages:*"
          outputField : "message"
          type : string
          source : value
          }
        ]
      }

Pobierz kopię tego pliku morphlines stąd.

Ważną informacją jest to, że pole id zostanie automatycznie wygenerowane przez Lily HBase Indexer. To ustawienie można skonfigurować w powyższym pliku index-config.xml, określając atrybut pola klucza unikalnego. Najlepszą praktyką jest pozostawienie domyślnej nazwy identyfikatora — ponieważ nie została ona określona w powyższym pliku xml, domyślne pole identyfikatora zostało wygenerowane i będzie kombinacją RowID-Column Family-Column Name.

W tym momencie zapisz zmiany i uruchom Lily HBase Indexer z Cloudera Manager.

Konfigurowanie tabeli skrzynki odbiorczej w HBase

Istnieje wiele sposobów programowego tworzenia tabeli w HBase (Java API, REST API lub podobna metoda). Tutaj użyjesz powłoki HBase do utworzenia tabeli skrzynki odbiorczej (celowo przy użyciu opisowej nazwy rodziny kolumn, aby ułatwić śledzenie). W aplikacjach produkcyjnych nazwa rodziny powinna być zawsze krótka, ponieważ zawsze jest przechowywana z każdą wartością jako część klucza komórki. Poniższe polecenie zrobi to i włączy replikację w rodzinie kolumn o nazwie „wiadomości”:

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

Aby sprawdzić, czy tabela została utworzona poprawnie, uruchom następujące polecenie:

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

Od tego momentu każdy e-mail umieszczony w tabeli „skrzynka odbiorcza” w kolumnie rodziny „wiadomości” wyzwoli zdarzenie do Lily HBase Indexer, który przetworzy zdarzenie, podzieli je na pola i wyśle ​​do Solr w celu zindeksowania.

Schemat tabeli skrzynki odbiorczej jest prosty:ID wiersza to imię i nazwisko osoby, do której należy ta skrzynka odbiorcza. Każda komórka jest osobną wiadomością, a kolumna jest unikalnym identyfikatorem liczby całkowitej. Poniżej znajduje się migawka przykładowej tabeli wyświetlanej przez interfejs HBase Hue:

Dostęp do danych

Masz do wyboru wiele wizualnych narzędzi dostępu do zindeksowanych e-maili. Hue i Solr GUI to bardzo dobre opcje. HBase umożliwia również wiele technik dostępu, nie tylko z GUI, ale także przez powłokę HBase, API, a nawet proste techniki skryptowe.

Integracja z Solr daje Ci dużą elastyczność, a także może zapewnić bardzo proste i zaawansowane opcje wyszukiwania Twoich danych. Na przykład skonfigurowanie pliku schema.xml Solr w taki sposób, aby wszystkie pola w obiekcie e-mail były przechowywane w Solr, umożliwia użytkownikom dostęp do pełnej treści wiadomości za pomocą prostego wyszukiwania, z kompromisem między przestrzenią dyskową a złożonością obliczeń.

Alternatywnie możesz skonfigurować Solr tak, aby przechowywał tylko ograniczoną liczbę pól, takich jak id, nadawca i temat. Dzięki tym elementom użytkownicy mogą szybko przeszukiwać Solr i pobierać identyfikatory wiadomości, które z kolei mogą zostać użyte do pobrania pełnej wiadomości z samego HBase.

Poniższy przykład przechowuje tylko identyfikator wiadomości w Solr, ale indeksuje wszystkie pola w obiekcie e-mail. Wyszukiwanie Solr w tym scenariuszu pobiera identyfikatory e-mail, które można następnie wykorzystać do zapytania HBase. Ten rodzaj konfiguracji jest idealny dla Solr, ponieważ utrzymuje niskie koszty przechowywania i w pełni wykorzystuje możliwości indeksowania Solr.

Poniższy skrypt powłoki wysyła zapytanie do Solr Rest API o słowo kluczowe „productId” i zwraca pole „id” w formacie CSV. Wynikiem jest lista identyfikatorów dokumentów pasujących do zapytania. Skrypt następnie przechodzi przez identyfikatory w pętli i dzieli je na identyfikator wiersza, rodzinę kolumny i nazwę kolumny, które są używane do uzyskiwania dostępu do HBase za pośrednictwem standardowego interfejsu API HBase REST.

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

Wniosek

W tym poście przekonałeś się, jak łatwo jest indeksować wiadomości e-mail przechowywane w HBase — w czasie zbliżonym do rzeczywistego i całkowicie bez ingerencji w główny przepływ HBase. Podsumowując, pamiętaj o tych głównych krokach:

  • Włącz replikację w HBase
  • Właściwie skonfiguruj Lily HBase Indexer
  • Użyj Morphlines w Lily HBase Indexer, aby pomóc w przekształceniach (bez kodowania!)

Jeśli miałeś okazję przeczytać poprzedni post, to widać, że plik morphlines.conf jest praktycznie identyczny we wszystkich trzech przypadkach. Oznacza to, że bardzo łatwo jest rozwinąć przypadki użycia wyszukiwania w ekosystemie Hadoop. Jeśli dane są już w HDFS, użyj MapReduceIndexerTool, aby je zindeksować. Jeśli dane docierają przez Flume, użyj SolrMorphlineSink z identycznym plikiem morphlines. Jeśli później zdecydujesz, że HBase pasuje do przypadku użycia, wymagana jest tylko minimalna zmiana, aby rozpocząć indeksowanie komórek w HBase:po prostu dodaj polecenie extractHBaseCells do pliku morphlines.

Chociaż ten przykład koncentruje się na wiadomościach e-mail jako przypadku użycia, tę metodę można zastosować w wielu innych scenariuszach, w których HBase jest używany jako warstwa magazynu i dostępu. Jeśli Twoje przedsiębiorstwo korzysta już z HBase w konkretnym przypadku użycia, rozważ zaimplementowanie na nim usługi Cloudera Search. Nie wymaga kodowania i może naprawdę otworzyć dane dla znacznie szerszej publiczności w organizacji.

Jeff Shmain jest architektem rozwiązań w Cloudera.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Operacyjna baza danych w CDP

  2. Apache HBase Co robić i czego nie robić

  3. Hadoop Partitioner — poznaj podstawy programu MapReduce Partitioner

  4. Co to jest para klucz-wartość MapReduce w usłudze Hadoop?

  5. Wysoka dostępność (Multi-AZ) dla operacyjnej bazy danych CDP