DStreams vs. DataFrames: A Spark Streaming két ízlése

aug 5, 2021
admin

Ezt a bejegyzést Jaroszlav Tkacsenko, az Activision szoftverarchitektje írta vendégként.

Az Apache Spark az egyik legnépszerűbb és leghatékonyabb nagyméretű adatfeldolgozó keretrendszer. A Hadoop MapReduce keretrendszerének alternatívájaként jött létre kötegelt munkaterhelésekhez, de ma már támogatja az SQL-t, a gépi tanulást és a folyamfeldolgozást is. Ma a Spark Streamingre szeretnék összpontosítani, és bemutatni néhány, a folyamfeldolgozáshoz rendelkezésre álló lehetőséget.

A folyamadat-feldolgozást akkor használjuk, ha dinamikus adatok folyamatosan keletkeznek, és gyakran találkozunk vele nagy adatfelhasználási esetekben. A legtöbb esetben az adatok feldolgozása közel valós időben, rekordonként történik, és az adatokból nyert meglátásokat riasztások kiadására, műszerfalak megjelenítésére és olyan gépi tanulási modellek táplálására is felhasználják, amelyek gyorsan tudnak reagálni az adatokon belüli új trendekre.

DStreams vs. DataFrames

A Spark Streaming a Spark 0.7.0-val alfává vált. Ez a diszkretizált adatfolyamok vagy DStreams ötletén alapul. Minden egyes DStream RDD-k sorozataként reprezentálódik, így könnyen használható, ha alacsony szintű RDD-alapú kötegelt munkamenetekből érkezik. A DStreams rengeteg fejlesztésen ment keresztül az eltelt idő alatt, de még mindig voltak különböző kihívások, elsősorban azért, mert ez egy nagyon alacsony szintű API.

A Spark Structured Streaming e kihívások megoldására a Spark 2.0-ban bevezetésre került (és a 2.2-ben vált stabillá), mint a Spark SQL tetejére épülő kiterjesztés. Emiatt kihasználja a Spark SQL kód- és memóriaoptimalizálás előnyeit. A Structured Streaming nagyon hatékony absztrakciókat is biztosít, mint például a Dataset/DataFrame API-k, valamint az SQL. Nem kell többé közvetlenül az RDD-vel foglalkozni!

A Structured Streaming és a Streaming with DStreams is micro-batchinget használ. A legnagyobb különbség a késleltetés és az üzenetek kézbesítési garanciái: A Structured Streaming pontosan egyszeri kézbesítést kínál 100+ milliszekundumos késleltetéssel, míg a Streaming with DStreams megközelítés csak legalább egyszeri kézbesítést garantál, de ezredmásodperces késleltetést tud biztosítani.

Egyszerű felhasználási esetekben én személy szerint a Spark Structured Streaminget részesítem előnyben, de a Spark Streaming with DStreams a rugalmassága miatt bonyolultabb topológiákhoz igazán jó. Ezért az alábbiakban szeretném bemutatni, hogyan használjuk a Streaming with DStreams és a Streaming with DataFrames (amelyet jellemzően a Spark Structured Streaminggel használunk) az Apache Kafka adatainak fogyasztására és feldolgozására. Scala-t, Apache Spark 2.3-at és Apache Kafka 2.0-t fogok használni.

Akár a példa kedvéért a Qubole által biztosított Apache Zeppelin notebookokkal fogom futtatni a munkáimat. A Qubole egy adatplatform, amelyet naponta használok. Hadoop és Spark fürtöket kezel, megkönnyíti az ad hoc Hive és Presto lekérdezések futtatását, és menedzselt Zeppelin notebookokat is biztosít, amelyeket szívesen használok. A Qubole segítségével nem kell sokat gondolkodnom a Spark és a Zeppelin konfigurálásán és hangolásán, ezt egyszerűen kezelik helyettem.

A tényleges felhasználási esetem nagyon egyszerű:

  • A Kafkába valamilyen telemetriát írunk: Kis JSON üzenetek metaadatokkal és tetszőleges kulcs/érték párokkal
  • Kapcsolódni akarok a Kafkához, fogyasztani és deserializálni ezeket az üzeneteket
  • Ezt követően szükség esetén transzformációkat alkalmazok
  • Begyűjteni néhány aggregációt
  • Végül, Érdekelnek az anomáliák és általában a rossz adatok – mivel nem én irányítom a termelőt, olyan dolgokat akarok elkapni, mint a NULL-ok, üres karakterláncok, esetleg hibás dátumok és más, speciális formátumú értékek, stb.
  • A feladatnak egy ideig futnia kell, majd automatikusan meg kell szűnnie. Általában a Spark Streaming feladatok folyamatosan futnak, de néha hasznos lehet ad hoc futtatni elemzés/hibakeresés céljából (vagy példaként az én esetemben, mivel olyan egyszerű egy Spark feladatot futtatni egy notebookban).

Streaming with DStreams

Ebben a megközelítésben DStreams-t használunk, ami egyszerűen RDD-k gyűjteménye.

Streaming with DataFrames

Most megpróbálhatjuk kombinálni a Streaming-et a DataFrames API-val, hogy mindkét világból a legjobbat kapjuk!

Következtetés

Melyik megközelítés a jobb? Mivel a DStream csak RDD-k gyűjteménye, jellemzően alacsony szintű átalakításokra és feldolgozásra használják. A DataFrames API hozzáadása ezen felül nagyon erős absztrakciókat biztosít, mint az SQL, de egy kicsit több konfigurációt igényel. És ha egyszerű felhasználási eseted van, a Spark Structured Streaming általában véve jobb megoldás lehet!

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.