ez a bejegyzés egy vendég kiadvány írta Yaroslav Tkachenko, a szoftver építész Activision.
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 a kötegelt munkaterhelésekhez, de most már támogatja az SQL-t, a gépi tanulást és a stream feldolgozást is. Ma a Spark streamingre szeretnék összpontosítani, és néhány rendelkezésre álló lehetőséget mutatok a stream feldolgozásához.
a Stream adatfeldolgozást akkor használják, amikor a dinamikus adatok folyamatosan generálódnak, és gyakran megtalálható a big data felhasználási esetekben. A legtöbb esetben az adatok feldolgozása közel valós időben, egy rekord egy időben, és a betekintést származó adatok is használják, hogy a riasztások, render irányítópultok, és a takarmány gépi tanulási modellek, amelyek gyorsan reagálni az új trendeket az adatok.
DStreams vs.DataFrames
Spark Streaming ment alfa Spark 0.7.0. Ez alapján az ötlet a diszkretizált patakok vagy DStreams. Minden DStream RDD-sorozatként jelenik meg, így könnyen használható, ha alacsony szintű RDD-alapú kötegelt munkaterhelésekből származik. A DStreams sok fejlesztésen ment keresztül ebben az időszakban, de még mindig voltak különféle kihívások, elsősorban azért, mert ez egy nagyon alacsony szintű API.
e kihívások megoldására a Spark strukturált adatfolyamot a Spark 2.0-ban vezették be (és a 2.2-ben stabil lett) a Spark SQL tetejére épített kiterjesztésként. Emiatt kihasználja a Spark SQL kód és a memória optimalizálását. Strukturált Streaming is ad nagyon erős absztrakciók, mint Dataset / DataFrame API-kat, valamint az SQL. Nincs több foglalkozó RDD közvetlenül!
mind a strukturált Streaming, mind a Dstreamekkel történő Streaming mikro-kötegelést használ. A legnagyobb különbség a késleltetés és az üzenet kézbesítési garanciái: a strukturált Streaming pontosan egyszeri kézbesítést kínál 100 + milliszekundumos késleltetéssel, míg a Dstreams-sel történő Streaming csak legalább egyszer garantálja a kézbesítést, de ezredmásodperces késleltetést biztosít.
személy szerint inkább a Spark strukturált streaminget részesítem előnyben az egyszerű használati esetekben, de a Spark Streaming a DStreams segítségével rugalmassága miatt nagyon jó a bonyolultabb topológiákhoz. Ezért szeretném az alábbiakban bemutatni, hogyan kell használni a Streaming-et a DStreams-szel és a Streaming-et a DataFrames-szel (amelyet általában a Spark strukturált Streamingnél használnak) az Apache Kafka adatainak fogyasztására és feldolgozására. Scala, Apache Spark 2.3 és Apache Kafka 2.0.
a példa kedvéért a feladataimat a Qubole által biztosított Apache Zeppelin Notebookok segítségével fogom futtatni. A Qubole egy adatplatform, amelyet naponta használok. Kezeli a Hadoop és a Spark klasztereket, megkönnyíti az ad hoc Hive és Presto lekérdezések futtatását, valamint felügyelt Zeppelin notebookokat is biztosít, amelyeket boldogan használok. A Qubole-val nem kell sokat gondolkodnom a Spark és a Zeppelin konfigurálásán és hangolásán, csak nekem kezelik.
a tényleges használati esetem nagyon egyszerű:
- valamilyen telemetria van írva Kafka: kis JSON üzenetek metaadatokkal és tetszőleges kulcs/érték párokkal
- csatlakozni akarok a Kafka — hoz, fogyasztani és deserializálni akarom ezeket az üzeneteket
- majd szükség esetén transzformációkat alkalmazok
- gyűjts össze néhány összesítést
- 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ák, üres karakterláncok, esetleg helytelen dátumok és egyéb értékek a speciális formátumok stb.
- a feladatnak egy ideig futnia kell, majd automatikusan véget ér. A Spark Streaming jobok általában folyamatosan futnak, de néha hasznos lehet ad hoc módon futtatni elemzés/hibakeresés céljából (vagy például az én esetemben, mivel olyan egyszerű a Spark job futtatása egy notebookban).
Streaming Dstreamekkel
ebben a megközelítésben a Dstreameket használjuk, ami egyszerűen RDD-k gyűjteménye.
Streaming DataFrames
most megpróbálhatjuk kombinálni Streaming DataFrames API, hogy a legjobb mindkét világból!
következtetés
melyik megközelítés jobb? Mivel a DStream csak RDD-k gyűjteménye, jellemzően alacsony szintű transzformációkhoz és feldolgozáshoz használják. A DataFrames API hozzáadása ezen felül nagyon erős absztrakciókat biztosít, mint például az SQL, de egy kicsit több konfigurációt igényel. Ha pedig egyszerű használati esete van, a Spark strukturált Streaming általában jobb megoldás lehet!