V mém předchozím příspěvku jste se naučili, jak indexovat e-mailové zprávy v dávkovém režimu a téměř v reálném čase pomocí Apache Flume s MorphlineSolrSink. V tomto příspěvku se dozvíte, jak indexovat e-maily pomocí Cloudera Search s Apache HBase a Lily HBase Indexer, spravované společnostmi NGDATA a Cloudera. (Pokud jste nečetli předchozí příspěvek, doporučuji vám tak učinit na pozadí, než budete číst dál.)
Kterou metodu téměř v reálném čase zvolit, HBase Indexer nebo Flume MorphlineSolrSink, bude zcela záviset na vašem případu použití, ale níže jsou některé věci, které je třeba při rozhodování zvážit:
- Je HBase optimální paměťové médium pro daný případ použití?
- Jsou již data zpracována do HBase?
- Existuje nějaký přístupový vzor, který bude vyžadovat, aby byly soubory uloženy v jiném formátu než HFiles?
- Pokud HBase aktuálně neběží, bude k dispozici dostatek hardwarových prostředků k jeho spuštění?
Existují dva způsoby, jak nakonfigurovat Cloudera Search pro indexování dokumentů uložených v HBase:přímo změnit konfigurační soubory a spustit Lily HBase Indexer ručně nebo jako službu, nebo vše nakonfigurovat pomocí Cloudera Manager. Tento příspěvek se zaměří na to druhé, protože je to zdaleka nejjednodušší způsob, jak povolit vyhledávání na HBase – nebo na jakékoli jiné službě na CDH.
Pochopení replikace HBase a Lily HBase Indexer
Při navrhování tohoto řešení Cloudera identifikovala čtyři hlavní požadavky, aby bylo indexování HBase efektivní:
- Latence indexování musí být téměř v reálném čase (v sekundách) a musí být laditelná
- Solr Index musí být v konečném důsledku konzistentní s tabulkou HBase, zatímco vkládání, aktualizace a odstraňování jsou aplikovány na HBase
- Mechanismus indexování musí být škálovatelný a odolný proti chybám
- Proces indexování nemůže zpomalit zápisy HBase
Ke splnění těchto požadavků využívá Cloudera Search nativní replikační mechanismus HBase. Pro ty, kteří neznají replikaci HBase, je zde krátké shrnutí na velmi vysoké úrovni:
Když jsou aktualizace aplikovány na protokol WAL (write-ahead), HBase RegionServer naslouchá těmto aktualizacím v samostatném vláknu. Když se vyrovnávací paměť vlákna zaplní nebo se dostane na konec souboru, odešle dávky se všemi replikovanými aktualizacemi na rovnocenný RegionServer běžící na jiném clusteru. WAL je proto nezbytný pro fungování indexování.
Cloudera Search využívá replikační mechanismus HBase, který naslouchá událostem mutace řádku HBase a namísto odesílání aktualizací na jiný RegionServer je odesílá do Lily HBase Indexer. Lily HBase Indexer zase aplikuje logiku transformace Cloudera Morphlines, rozděluje události do polí Solr a přeposílá je na server Apache Solr Server.
Použití replikace HBase má oproti implementaci stejné funkce v koprocesorech HBase velké výhody. Za prvé, replikace funguje paralelně a asynchronně s daty, která jsou přijímána do HBase. Proto indexování Cloudera Search nepřidává žádnou latenci ani provozní nestabilitu rutinnímu provozu HBase. Za druhé, použití metody replikace umožňuje plynulé změny transformační logiky za běhu. A naopak, k provedení změny prostřednictvím úpravy koprocesoru je třeba restartovat RegionServer, což by uživatelům HBase znepřístupnilo data. Snad nejdůležitější je, že implementace koprocesorů je poměrně rušivá a pokud není řádně otestována, může narušit výkon HBase.
Tento tok je znázorněn níže:
Instalace Cloudera Search a nasazení Lily HBase Indexer
Cloudera Manager automaticky stáhne a nasadí Cloudera Search jako jeden balíček. Jediné, co musíte udělat, je kliknout na ikonu „Balíčky“ v horní navigaci, vybrat verzi Solr a stáhnout, distribuovat a aktivovat:
Jak již bylo zmíněno, Cloudera Search závisí na replikaci HBase, a proto bude povolena jako další. Aktivujte replikaci kliknutím na Služba HBase->Konfigurace->Záloha a zajistit, aby byly zaškrtnuty položky „Povolit replikaci HBase“ a „Povolit indexování“. V případě potřeby uložte změny a restartujte službu HBase.
Chcete-li přidat Lily HBase Indexer, přejděte na Služby->Přidat službu , zvolte „Keystore Indexer“ a přidejte jej a nasměrujte jej na instanci HBase, která bude použita pro zpracování e-mailů:
Konfigurace Solr
Dále nakonfigurujte Solr přesně tak, jak je popsáno v předchozím příspěvku zde.
- Vygenerujte ukázkový konfigurační soubor schema.xml:
$ solrctl --zk localhost:2181/solr \ instancedir --generate $HOME/emailSearchConfig
- Upravte soubor schema.xml v $HOME/emailSearchConfig pomocí konfiguračního souboru, který bude definovat pole relevantní pro zpracování e-mailu. Úplnou kopii souboru naleznete na tomto odkazu.
- Nahrajte konfigurace Solr do ZooKeeper:
$ solrctl --zk localhost:2181/solr instancedir \ --create email_collection $HOME/emailSearchConfig
- Vygenerujte kolekci Solr:
$ solrctl --zk localhost:2181/solr collection \ --create email_collection -s 1
Registrace indexátoru
Tento krok je nutný k přidání a konfiguraci indexátoru a replikace HBase. Níže uvedený příkaz aktualizuje ZooKeeper a přidá myindexer jako replikačního partnera pro HBase. Také vloží konfigurace do ZooKeeper, který Lily HBase Indexer použije k nasměrování na správnou kolekci v Solr.
$ hbase-indexer add-indexer -n myindexer -c indexer-config.xml \ -cp solr.zk=localhost:2181/solr \ -cp solr.collection=collection1
Argumenty:
- -n myindexer – určuje název indexátoru, který bude registrován v ZooKeeper
- -c indexer-config.xml – konfigurační soubor, který určí chování indexeru
- -cp solr.zk=localhost:2181/solr – určuje umístění konfigurace ZooKeeper a Solr. Toto by mělo být aktualizováno s umístěním ZooKeeper pro konkrétní prostředí.
- -cp solr.collection=collection1 – určuje, která kolekce se má aktualizovat. Připomeňme si krok Konfigurace Solr, kde jsme vytvořili kolekci1.
Soubor index-config.xml je v tomto případě poměrně jednoduchý; vše, co dělá, je specifikovat indexeru, na kterou tabulku se má podívat, třídu, která bude použita jako mapovač (com.ngdata.hbaseindexer.morphline.MorphlineResultToSolrMapper) a umístění konfiguračního souboru Morphline. Typ mapování je nastaven na sloupec protože chceme získat každou buňku jako samostatný dokument Solr. Ve výchozím nastavení je typ mapování nastaven na řádek , v takovém případě se dokument Solr stane celým řádkem.
Název parametru=”morphlineFile” určuje umístění konfiguračního souboru Morphlines. Umístěním může být absolutní cesta vašeho souboru Morphlines, ale protože používáte Cloudera Manager, zadejte relativní cestu:„morphlines.conf“.
Obsah konfiguračního souboru hbase-indexer lze nalézt na tomto odkazu.
Pro úplný odkaz na příkaz hbase-indexer stačí provést příkaz bez jakýchkoli argumentů:
$ hbase-indexer Usage: hbase-indexerwhere 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.
Konfigurace a spuštění Lily HBase Indexer
Pokud si vzpomínáte, když jste přidali Lily HBase Indexer, zadali jste instanci HBase, se kterou je spojen. Proto to v tomto kroku nemusíte dělat. Musíte však zadat logiku transformace Morphlines, která tomuto indexátoru umožní analyzovat e-mailové zprávy a extrahovat všechna relevantní pole.
Přejděte na Služby a vyberte Lily HBase Indexer, který jste přidali dříve. Vyberte Konfigurace->Zobrazit a upravit->Široká služba->Morphlines . Zkopírujte a vložte soubor morphlines.
Knihovna morflinek e-mailů provede následující akce:
1. Přečtěte si e-mailové události HBase pomocí příkazu extractHBaseCells
2. Rozdělte nestrukturovaný text do polí pomocí příkazu grok
3. Pokud v e-mailu chybí Message-ID, vygenerujte jej pomocí příkazu createUUID
4. Převeďte datum/časové razítko na pole, kterému bude Solr rozumět, pomocí příkazu convertTimestamp
5. Pomocí příkazu sanitizeUknownSolrFields
Příkaz extractHBaseCells si zaslouží více pozornosti, protože je to jediná věc, která se liší v konfiguraci morflinek HBase Indexer. Parametry jsou:
- inputColumn – určuje sloupce, ke kterým se chcete přihlásit (může být zástupný znak)
- outputFied – název pole, do kterého se odesílají data
- typ – typ pole (v případě těla e-mailu je to řetězec)
- zdroj – může být hodnotný nebo kvalifikovaný; hodnota určuje, že hodnota buňky by měla být indexována
extractHBaseCells { mappings : [ { inputColumn : "messages:*" outputField : "message" type : string source : value } ] }
Stáhněte si kopii tohoto souboru morphlines odtud.
Jedna důležitá poznámka je, že pole id bude automaticky generováno Lily HBase Indexer. Toto nastavení lze konfigurovat v souboru index-config.xml výše zadáním atributu unique-key-field. Osvědčeným postupem je ponechat výchozí název id – protože nebyl specifikován v souboru xml výše, bylo vygenerováno výchozí pole id a bude kombinací RowID-Column Family-Column Name.
V tomto okamžiku uložte změny a spusťte Lily HBase Indexer z Cloudera Manager.
Nastavení tabulky doručené pošty v HBase
Existuje mnoho způsobů, jak vytvořit tabulku v HBase programově (Java API, REST API nebo podobná metoda). Zde použijete prostředí HBase k vytvoření tabulky doručené pošty (záměrně použijete popisný název skupiny sloupců, aby bylo snazší sledovat věci). V produkčních aplikacích by měl být název rodiny vždy krátký, protože je vždy uložen s každou hodnotou jako součást klíče buňky. Následující příkaz to provede a povolí replikaci v rodině sloupců nazvané „zprávy“:
hbase(main):003:0> create 'inbox', {NAME => 'messages', REPLICATION_SCOPE => 1}
Chcete-li zkontrolovat, zda byla tabulka správně vytvořena, spusťte následující příkaz:
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 tohoto okamžiku jakýkoli e-mail vložený do tabulky „doručená pošta“ v rodině sloupců „zprávy“ spustí událost Lily HBase Indexer, která událost zpracuje, rozdělí do polí a odešle ji společnosti Solr k indexování.
Schéma tabulky doručené pošty je jednoduché:ID řádku je jméno osoby, které tato doručená pošta patří. Každá buňka je samostatná zpráva, přičemž sloupec představuje jedinečné celočíselné ID. Níže je snímek ukázkové tabulky, jak je zobrazena rozhraním Hue HBase:
Přístup k datům
Pro přístup k indexovaným e-mailům máte na výběr z mnoha vizuálních nástrojů. Hue a Solr GUI jsou oba velmi dobré možnosti. HBase také umožňuje řadu přístupových technik, a to nejen z GUI, ale také přes HBase shell, API a dokonce i jednoduché techniky skriptování.
Integrace s Solr vám poskytuje velkou flexibilitu a může také poskytnout velmi jednoduché i pokročilé možnosti vyhledávání vašich dat. Například konfigurace souboru Solr schema.xml tak, aby všechna pole v rámci e-mailového objektu byla uložena v Solr, umožňuje uživatelům přístup k celému tělu zpráv pomocí jednoduchého vyhledávání s kompromisem mezi úložným prostorem a složitostí výpočtu.
Alternativně můžete Solr nakonfigurovat tak, aby ukládal pouze omezený počet polí, jako je id, odesílatel a předmět. Pomocí těchto prvků mohou uživatelé rychle prohledat Solr a získat ID zprávy, které lze zase použít k načtení celé zprávy ze samotné HBase.
Níže uvedený příklad ukládá pouze ID zprávy v Solr, ale indexuje všechna pole v rámci e-mailového objektu. Hledání Solr v tomto scénáři načte e-mailová ID, která pak můžete použít k dotazování HBase. Tento typ nastavení je pro Solr ideální, protože udržuje nízké náklady na úložiště a plně využívá možnosti indexování Solr.
Skript shellu níže zadá dotaz do Solr Rest API na klíčové slovo „productId“ a vrátí pole „id“ ve formátu CSV. Výsledkem je seznam ID dokumentů, které odpovídají dotazu. Skript poté prochází id a rozdělí je na ID řádku, rodinu sloupců a název sloupce, které se používají pro přístup k HBase prostřednictvím standardního rozhraní REST API HBase.
#!/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
Závěr
V tomto příspěvku jste viděli, jak snadné je indexovat e-maily, které jsou uloženy v HBase – téměř v reálném čase a zcela nevtíravě do hlavního toku HBase. Stručně řečeno, mějte na paměti tyto hlavní kroky:
- Povolte replikaci v HBase
- Správně nakonfigurujte Lily HBase Indexer
- Použijte Morphlines v Lily HBase Indexer k pomoci s transformacemi (není potřeba žádné kódování!)
Pokud jste měli možnost číst předchozí příspěvek, můžete vidět, že soubor morphlines.conf je ve všech třech případech prakticky totožný. To znamená, že je velmi snadné rozšířit případy použití vyhledávání v ekosystému Hadoop. Pokud jsou data již v HDFS, použijte MapReduceIndexerTool k jejich indexování. Pokud data přicházejí přes Flume, použijte SolrMorphlineSink s identickým souborem morphlines. Pokud se později rozhodnete, že HBase vyhovuje danému případu použití, je pro zahájení indexování buněk v HBase potřeba pouze minimální změna:Stačí přidat příkaz extractHBaseCells do souboru morphlines.
Ačkoli se tento příklad soustředí na e-maily jako případ použití, lze tuto metodu použít v mnoha dalších scénářích, kde se HBase používá jako úložná a přístupová vrstva. Pokud váš podnik již používá HBase pro konkrétní případ použití, zvažte implementaci Cloudera Search navíc. Nevyžaduje žádné kódování a může skutečně zpřístupnit data mnohem širšímu publiku v organizaci.
Jeff Shmain je architekt řešení ve společnosti Cloudera.