DStreams vs. DataFrames:
Tento příspěvek jako host napsal Yaroslav Tkachenko, softwarový architekt ve společnosti Activision.
Apache Spark je jedním z nejpopulárnějších a nejvýkonnějších frameworků pro zpracování rozsáhlých dat. Byl vytvořen jako alternativa k frameworku MapReduce systému Hadoop pro dávkové úlohy, ale nyní podporuje také SQL, strojové učení a proudové zpracování. Dnes bych se chtěl zaměřit na Spark Streaming a ukázat několik možností, které jsou pro proudové zpracování k dispozici.
Proudové zpracování dat se používá při průběžném generování dynamických dat a často se vyskytuje v případech použití velkých dat. Ve většině případů se data zpracovávají téměř v reálném čase, po jednom záznamu, a poznatky získané z dat se také používají k poskytování výstrah, vykreslování řídicích panelů a napájení modelů strojového učení, které mohou rychle reagovat na nové trendy v datech.
DStreams vs. DataFrames
Spark Streaming přešel do alfa verze se Sparkem 0.7.0. V případě, že data nejsou zpracovávána v reálném čase, je možné je použít jako zdroj dat. Je založen na myšlence diskrétních proudů neboli DStreams. Každý DStream je reprezentován jako posloupnost RDD, takže je snadno použitelný, pokud přicházíte z nízkoúrovňových dávkových úloh založených na RDD. DStreamy prošly za tu dobu mnoha vylepšeními, ale stále se objevovaly různé problémy, především proto, že se jedná o velmi nízkoúrovňové API.
Jako řešení těchto problémů byl ve Sparku 2.0 (a ve verzi 2.2 se stal stabilním) představen Spark Structured Streaming jako rozšíření postavené nad Spark SQL. Díky tomu využívá výhod kódu Spark SQL a paměťových optimalizací. Structured Streaming také poskytuje velmi výkonné abstrakce, jako je Dataset/DataFrame API, stejně jako SQL. Už se nemusíte zabývat přímo RDD!
Jak Structured Streaming, tak Streaming with DStreams využívají mikrodávkování. Největší rozdíl je v latenci a garanci doručení zpráv: Structured Streaming nabízí doručení přesně jednou s latencí přes 100 milisekund, zatímco přístup Streaming with DStreams garantuje pouze doručení nejméně jednou, ale může poskytnout milisekundové latence.
Osobně dávám přednost Spark Structured Streaming pro jednoduché případy použití, ale Spark Streaming with DStreams je díky své flexibilitě opravdu dobrý pro složitější topologie. Proto chci níže ukázat, jak používat Streaming s DStreams a Streaming s DataFrames (který se typicky používá se Spark Structured Streaming) pro konzumaci a zpracování dat z Apache Kafka. Budu používat jazyk Scala, Apache Spark 2.3 a Apache Kafka 2.0.
Pro příklad budu úlohy spouštět také pomocí notebooků Apache Zeppelin poskytovaných společností Qubole. Qubole je datová platforma, kterou denně používám. Spravuje clustery Hadoop a Spark, usnadňuje spouštění ad hoc dotazů Hive a Presto a také poskytuje spravované notebooky Zeppelin, které s radostí používám. S Qubole nemusím příliš přemýšlet o konfiguraci a ladění Sparku a Zeppelinu, je to prostě vyřízeno za mě.
Skutečný případ použití, který mám, je velmi přímočarý:
- Nějaká telemetrie se zapisuje do Kafky: malé zprávy JSON s metadaty a libovolnými páry klíč/hodnota
- Chci se připojit ke Kafce, konzumovat a deserializovat tyto zprávy
- Poté v případě potřeby použít transformace
- Sbírat nějaké agregace
- Nakonec, Zajímají mě anomálie a obecně špatná data – protože nemám kontrolu nad výrobcem, chci zachytit věci jako NULL, prázdné řetězce, možná nesprávná data a jiné hodnoty se specifickými formáty atd.
- Úloha by měla nějakou dobu běžet a pak se automaticky ukončit. Obvykle úlohy Spark Streaming běží nepřetržitě, ale někdy může být užitečné spustit ji ad hoc pro analýzu/debugování (nebo jako příklad v mém případě, protože je tak snadné spustit úlohu Spark v notebooku).
Streaming s DStreams
V tomto přístupu používáme DStreams, což je jednoduše kolekce RDD.
Streaming s DataFrames
Nyní můžeme zkusit zkombinovat Streaming s DataFrames API a získat to nejlepší z obou světů!
Závěr
Který přístup je lepší? Protože DStream je jen kolekce RDD, používá se obvykle pro nízkoúrovňové transformace a zpracování. Přidání rozhraní API DataFrames nad něj poskytuje velmi výkonné abstrakce jako SQL, ale vyžaduje trochu více konfigurace. A pokud máte jednoduchý případ použití, může být Spark Structured Streaming obecně lepším řešením!