Optimalizace OpenSearch agregací s vysokou kardinalitou
Agregace v OpenSearch jsou užitečným nástrojem pro analýzu zaindexovaných dat. Jakmile se však jedná o data s extrémním množstvím unikátních hodnot, náročnost těchto operací významně narůstá. V našem případě zahrnovala zaindexovaná data více než jednu miliardu nestrukturovaných, vysoce variabilních dokumentů s poli obsahujícími jednotky až tisíce emailových adres.
Je vůbec možné agregovat více než sto miliard emailových adres, z nichž je téměř 90 % unikátních?
Výzvy při práci s vysokou kardinalitou
Při práci s takovýmto objemem dat jsme brzy narazili na limity standardních možností OpenSearch, zejména v případě, kdy agregace vyžadovala vytvoření desítek miliard bucketů. Ani optimalizace clusteru nebo hardwaru v těchto situacích často nestačí a při zpracování takových požadavků se velmi rychle vyčerpá paměť dedikovaná pro OpenSearch a dotaz selže.
Nejprve jsme zkusili běžně doporučované postupy jako omezování velikosti dotazovaných datasetů nebo rozdělení dat do menších indexů. Tyto metody mohou být v některých případech užitečné, protože snižují zátěž na paměť a usnadňují správu clusteru. V našem scénáři však nebyly dostatečně flexibilní – omezování datasetu bylo nepraktické kvůli potřebě agregovat jakoukoliv část dat a rozdělení do více indexů by vedlo k časté nutnosti reindexace.
OpenSearch naštěstí nabízí několik pokročilých možností konfigurace vyhledávacích dotazů. Lze upravovat parametry agregací, využívat rozdělení do particí pro postupné zpracování dotazů nebo použít sampling, který analyzuje pouze reprezentativní vzorek dokumentů a tím snižuje zátěž systému. Další možností je směřování dotazů pouze na vybrané shardy v OpenSearch clusteru, což omezuje objem dat zpracovávaných v jednom požadavku. I tyto nástroje však mají své limity – při extrémních objemech dat a vysoké kardinalitě často narážejí na hranice škálovatelnosti a dostupné paměti.
Žádný jeden z těchto postupů tudíž nebyl schopný sám o sobě naši situaci vyřešit. Abychom byli schopni provádět agregace i na tak velkém datasetu, bylo nutné analyzovat, experimentovat a pečlivě nastavit celou řadu parametrů. Řešení, které jsme nakonec zvolili, vyžadovalo důkladné porozumění nejen interním principům fungování OpenSearch, ale i možnostem jeho konfigurace a přizpůsobení požadavkům extrémně vysoké kardinality.
Závěr
Namísto spoléhání na jedno konkrétní nastavení nebo univerzální postup jsme našli kombinaci přístupů, která umožnila transformovat původně neproveditelné dotazy v efektivní analytický nástroj – a to i v případě, kdy běžné rady a dostupná dokumentace nestačily. Výsledkem bylo dosažení výrazného zlepšení v rychlosti i úspěšnosti zpracování vzorků dat v řádu stovek milionů až jednotek miliard záznamů během minut, přičemž nebylo třeba ohrozit stabilitu clusteru.
Naše zkušenost ukazuje, že i extrémně náročné analytické scénáře lze v OpenSearch zvládnout, pokud se jim věnuje dostatek pozornosti a úsilí. S využitím pokročilých možností a hlubší znalosti fungování systému lze najít řešení i tam, kde standardní postupy selhávají. Výsledek nám umožnil efektivně analyzovat masivní dataset s vysokou kardinalitou a vytvořit nástroj, který splňuje požadavky i těch nejnáročnějších případů – bez ohrožení dostupnosti či výkonu OpenSearch clusteru.