INTEGRITY Dokumentace

Vzorkování s WAE

Workers Analytics Engine umožňuje zapisovat rozsáhlé objemy dat a rychle je načítat, a to za minimální nebo nulové náklady. Aby bylo možné zapisovat velké objemy dat za rozumnou cenu, využívá Workers Analytics Engine vážené adaptivní vzorkování ↗.

Při využívání vzorkování nepotřebujete pro zodpovězení otázek o datové sadě úplně každý datový bod. U dostatečně velké datové sady potřebná velikost vzorku ↗ nezávisí na velikosti původní populace. Potřebná velikost vzorku závisí na rozptylu vaší veličiny, velikosti analyzovaných podskupin a na tom, jak přesný musí být váš odhad.

Pro Analytics Engine to znamená, že dokážeme velmi rozsáhlé datové sady zkomprimovat do mnohem menšího počtu pozorování, a přesto zodpovědět většinu dotazů s velmi vysokou přesností. Díky tomu můžeme nabídnout analytickou službu, která dokáže měřit velmi vysoké míry využití s neomezenou kardinalitou za nízkou a předvídatelnou cenu.

Na obecné úrovni funguje vzorkování takto:

  1. Při zápisu vzorkujeme, pokud jsou datové body do jednoho indexu zapisovány příliš rychle.
  2. Pokud je dotaz příliš složitý, provedeme při jeho zpracování další vzorkování.

V následujících částech se dozvíte:

Jak funguje vzorkování

Vzorkování dat Cloudflare funguje podobně jako u online mapových služeb, jako je Google Maps, které vykreslují mapy v různých úrovních přiblížení. Při zobrazení satelitního snímku celého kontinentu poskytne mapová služba obrázky v odpovídající velikosti podle rozlišení obrazovky uživatele a rychlosti jeho internetového připojení.

Obrázek vlevo zobrazuje satelitní pohled z OpenStreetMap. Vpravo je stejný obrázek přiblížený. Na obou obrázcích představuje každý pixel stejnou plochu, obrázek vpravo však obsahuje mnohem méně pixelů.

Každý pixel na mapě představuje rozsáhlou oblast, například několik čtverečních kilometrů. Kdyby se uživatel pokusil přiblížit obraz pomocí snímku obrazovky, výsledek by byl rozmazaný. Mapová služba proto při přiblížení na konkrétní město místo toho načte snímky ve vyšším rozlišení. Celkový počet pixelů zůstává přibližně stejný, ale každý pixel nyní představuje menší oblast, řádově jednotky metrů čtverečních.

Obrázek vpravo má mnohem vyšší rozlišení. Každý pixel představuje mnohem menší oblast, celkový počet pixelů je však u obou obrázků zhruba stejný.

Klíčové je, že kvalita mapy nezávisí pouze na rozlišení nebo ploše, kterou představuje jeden pixel. Určuje ji celkový počet pixelů použitých k vykreslení výsledného zobrazení.

Existují podobnosti mezi tím, jak mapová služba řeší rozlišení, a tím, jak Cloudflare Analytics poskytuje analytická data pomocí adaptivních vzorků:

Jak číst vzorkovaná data

Než začnete efektivně psát dotazy a analyzovat data, je užitečné nejprve pochopit, jak se v Workers Analytics Engine čtou vzorkovaná data.

Ve Workers Analytics Engine se každá událost zaznamenává s polem _sample_interval pole. Interval vzorkování je převrácenou hodnotou rychlosti vzorkování. Pokud je například použita rychlost vzorkování jedno procento (1%), sample_interval bude nastaveno na 100.

Zjednodušeně řečeno, v analogii s mapou interval vzorkování představuje „počet nevzorkovaných datových bodů“ (kilometry nebo metry), které reprezentuje daný vzorkovaný datový bod (pixel).

Interval vzorkování je vlastnost přiřazená ke každému jednotlivému řádku uloženému ve Workers Analytics Engine. Vzhledem k implementaci rovnoměrného vzorkování se může interval vzorkování u jednotlivých řádků lišit. Při dotazování dat je proto třeba brát v úvahu pole intervalu vzorkování. Pouhé vynásobení výsledku dotazu konstantním faktorem vzorkování nestačí.

Následuje několik příkladů, jak zapsat běžné dotazy nad vzorkovanými daty.

Případ použití Příklad bez vzorkování Příklad se vzorkováním
Počítání událostí v datové sadě count() sum(_sample_interval)
Sečtěte množství, například počet bajtů sum(bytes) sum(bytes * _sample_interval)
Vypočítat průměr hodnoty avg(bytes) sum(bytes * _sample_interval) / sum(_sample_interval)
Výpočet kvantilů quantile(0.50)(bytes) quantileExactWeighted(0.50)(bytes, _sample_interval)

Přesnost výsledků neurčuje interval vzorkování, podobně jako v dříve zmíněné analogii s mapou. I vysoký interval vzorkování může poskytnout přesné výsledky. Přesnost totiž závisí na celkovém počtu dotazovaných datových bodů a na jejich rozložení.

Jak se data vzorkují

Chcete-li určit interval vzorkování pro jednotlivé události, mějte na paměti, že většina analytických dat obsahuje důležitou podskupinu, kterou je třeba analyzovat s přesnými výsledky. Můžete například chtít analyzovat využití uživateli nebo provoz na konkrétní názvy hostitelů. Uživatelé Analytics Engine mohou tyto skupiny definovat vyplněním index pole při zápisu události. To umožňuje cílenější a přesnější analýzu v rámci zadaných skupin.

Další pozorování je, že tyto hodnoty indexu mají pravděpodobně velmi rozdílný počet zapsaných událostí. Využití většiny webových služeb ve skutečnosti sleduje Paretovo rozdělení ↗, což znamená, že několik málo nejaktivnějších uživatelů bude odpovídat za naprostou většinu využití. Paretova rozdělení jsou běžná a vypadají takto:

Na tomto grafu představuje každý sloupec jednoho uživatele, výška sloupce odpovídá jeho celkovému využití.

Kdybychom vzali jednoduchý náhodný výběr ↗ z jednoho procenta (1%) těchto dat a tento vzorek jsme aplikovali na celou populaci, mohli byste sice přesně sledovat své největší zákazníky, ale ztratili byste přehled o tom, co dělají vaši menší zákazníci:

Stejný graf jako výše, tentokrát ale založený na 1% vzorku dat.

Všimněte si, že větší sloupce vypadají víceméně beze změny, a přesto jsou stále poměrně přesné. Při analýze menších zákazníků se ale výsledky stávají kvantizovaný ↗ a mohou být dokonce zaokrouhleny na 0.

To ukazuje, že zatímco pro velkou populaci může stačit vzorek jednoho procenta (1 %) nebo i menší, u malé populace může být pro dosažení přesných výsledků potřeba uložit větší podíl událostí.

Děláme to pomocí techniky nazvané rovnoměrné vzorkování. Znamená to, že vyrovnáváme počet uložených událostí pro každou jedinečnou hodnotu indexu. U relativně neobvyklých hodnot indexu proto můžeme zapisovat všechny datové body, které získáme přes writeDataPoint(). Pokud ale do jedné hodnoty indexu zapíšete velké množství datových bodů, začneme vzorkovat.

Stejné rozložení, tentokrát ale s (simulací) rovnoměrného vzorkování:

Tento graf zobrazuje stejnou populaci, ale s rovnoměrným vzorkováním.

Možná si všimnete, že tento graf je velmi podobný prvnímu grafu. Vyžaduje ale pouze <10% z celkových uložených dat. Míra vzorkování je ve skutečnosti mnohem nižší než 10% pro větší řady (to znamená, že ukládáme delší vzorkovací intervaly), avšak u menších řad je vzorkovací frekvence vyšší.

Vraťme se k analogii s mapou z předchozí části. Ať je zobrazená oblast mapy jakkoli velká, celkový počet pixelů v mapě zůstává stejný. Stejně tak chceme pro každou hodnotu indexu ukládat podobný počet datových bodů. Rozlišení mapy, tedy kolik plochy představuje jeden pixel, se ale mění podle toho, jak velká oblast se zobrazuje. Podobně se i zde bude množství dat reprezentovaných jedním uloženým datovým bodem lišit podle celkového počtu datových bodů v indexu.

Vzorkování Adaptive Bit Rate při čtení

Rovnoměrné vzorkování zajišťuje, že se v daném časovém úseku pro každý index uchovává stejné množství dat. Doba, kterou dotazy pokrývají, se ale může výrazně lišit: některé vyžadují jen desetiminutový snímek dat, zatímco jiné potřebují analyzovat data za 10 týdnů, tedy o 10 000krát delší období.

K řešení tohoto problému používáme metodu zvanou adaptivní bitová rychlost ↗ (ABR). Díky ABR dotazy pokrývající delší časové rozsahy načítají data s vyšším intervalem vzorkování, což jim umožňuje dokončit se v rámci pevně stanoveného časového limitu. Zjednodušeně řečeno: stejně jako je v naší mapové analogii pevně daným zdrojem velikost obrazovky nebo šířka pásma, je pevně daná i doba potřebná k dokončení dotazu. Bez ohledu na objem zahrnutých dat proto musíme omezit celkový počet prohledaných řádků, abychom na dotaz dokázali odpovědět. To zajišťuje spravedlnost: bez ohledu na velikost dotazované datové sady zajišťujeme, aby všechny dotazy dostaly stejný podíl dostupného výpočetního času.

Toho dosahujeme tak, že data ukládáme ve více rozlišeních (tedy s různou úrovní detailu, například 100 %, 10 %, 1 %) odvozených z rovnoměrně vzorkovaných dat. V okamžiku dotazu vybereme nejvhodnější rozlišení dat ke čtení podle složitosti dotazu. Složitost dotazu se určuje podle počtu řádků, které je třeba načíst, a pravděpodobnosti, že se dotaz dokončí v rámci zadaného časového limitu N sekund. Díky dynamickému výběru vhodného rozlišení optimalizujeme výkon dotazu a zajišťujeme, že zůstane v rámci vyhrazeného časového rozpočtu.

Hlavní výhodou ABR je, že umožňuje trvale poskytovat výsledky dotazů v rámci pevně stanoveného rozpočtu dotazu, bez ohledu na velikost dat nebo délku sledovaného období. Tím se ABR liší od systémů, které si při práci s rozsáhlými datovými sadami neporadí s časovými limity, chybami nebo vysokými náklady.

Jak vybrat index

Chcete-li u vzorkovaných dat získat přesné výsledky, zvolte jako index vhodnou hodnotu. Index by měl odpovídat tomu, jak budou uživatelé data dotazovat a zobrazovat. Pokud uživatelé například často zobrazují data podle konkrétního zařízení nebo názvu hostitele, doporučujeme tyto atributy do indexu zahrnout.

Index má následující vlastnosti, které je důležité zvážit při jeho výběru:

Je třeba zvážit následující omezení a kompromisy:

Ve většině případů se nedoporučuje zapisovat na každý řádek jedinečnou hodnotu indexu (například UUID). I když díky tomu půjde jednotlivé datové body načítat velmi rychle, zpomalí to většinu dotazů pro agregace a časové řady.

Viz časté otázky k Workers Analytics Engine, konkrétně k tématu Vzorkování.