Úvod do Apache Spark

1. Úvod

Apache Spark je open-source klastrový výpočtový rámec. Poskytuje elegantné vývojové rozhrania API pre Scala, Java, Python a R, ktoré vývojárom umožňujú vykonávať rôzne dátovo náročné pracovné zaťaženia naprieč rôznymi zdrojmi údajov vrátane HDFS, Cassandra, HBase, S3 atď.

Historicky sa ukázalo, že Hadoop's MapReduce je neúčinný pre niektoré iteratívne a interaktívne výpočtové úlohy, čo nakoniec viedlo k vývoju Sparku. So Sparkom môžeme bežať logiku až o dva rády rýchlejšie ako s Hadoop v pamäti, alebo o jeden rád rýchlejšie na disku.

2. Architektúra iskier

Aplikácie Spark bežia ako nezávislé sady procesov v klastri, ako je popísané v nasledujúcom diagrame:

Tento súbor procesov koordinuje SparkContext objekt vo vašom hlavnom programe (nazýva sa program ovládača). SparkContext sa pripája k niekoľkým typom správcov klastrov (buď samostatný samostatný správca klastrov spoločnosti Spark, Mesos alebo YARN), ktorí alokujú zdroje medzi aplikácie.

Po pripojení Spark získava exekútorov na uzloch v klastri, čo sú procesy, ktoré spúšťajú výpočty a ukladajú údaje pre vašu aplikáciu.

Ďalej odošle kód vašej aplikácie (definovaný súbormi JAR alebo Python odovzdanými do SparkContext) exekútorom. Nakoniec SparkContext posiela úlohy exekútorom na spustenie.

3. Základné komponenty

Nasledujúca schéma poskytuje jasný obraz o rôznych komponentoch Sparku:

3.1. Spark Core

Komponent Spark Core je zodpovedný za všetky základné I / O funkcie, plánovanie a monitorovanie úloh na iskrových klastroch, dispečing úloh, sieťovanie s rôznymi úložnými systémami, zotavenie po poruchách a efektívna správa pamäte.

Na rozdiel od Hadoopu sa Spark vyhýba ukladaniu zdieľaných údajov do sprostredkovateľských obchodov ako Amazon S3 alebo HDFS pomocou špeciálnej dátovej štruktúry známej ako RDD (Resilient Distributed Datasets).

Odolné distribuované datasety sú nemenné, rozdelená zbierka záznamov, s ktorými je možné pracovať - ​​paralelne a umožňuje - výpočty odolné v pamäti „odolné voči chybám“.

RDD podporujú dva druhy operácií:

  • Transformácia - Transformácia Spark RDD je funkcia, ktorá produkuje nové RDD z existujúcich RDD. Transformátor berie RDD ako vstup a produkuje jeden alebo viac RDD ako výstup. Transformácie majú lenivú povahu, t. J. Vykonajú sa, keď zavoláme akciu
  • Akciatransformácie vytvárajú RDD navzájom, ale keď chceme pracovať so skutočnou množinou údajov, v tom okamihu sa vykoná akcia. Teda Akcie sú operácie Spark RDD, ktoré dávajú hodnoty iné ako RDD. Hodnoty akcie sa ukladajú do ovládačov alebo do externého úložného systému

Akcia je jedným zo spôsobov odoslania údajov od exekútora vodičovi.

Exekútori sú agenti zodpovední za vykonanie úlohy. Zatiaľ čo vodičom je proces JVM, ktorý koordinuje pracovníkov a vykonávanie úlohy. Niektoré z akcií Sparku sa spočítajú a zhromaždia.

3.2. Spark SQL

Spark SQL je modul Spark na spracovanie štruktúrovaných údajov. Primárne sa používa na vykonávanie dotazov SQL. DataFrame predstavuje hlavnú abstrakciu pre Spark SQL. Distribuovaný zber údajov usporiadaných do pomenovaných stĺpcov je známy ako a DataFrame v Sparku.

Spark SQL podporuje načítanie údajov z rôznych zdrojov, ako sú Hive, Avro, Parquet, ORC, JSON a JDBC. Taktiež je škálovateľný na tisíce uzlov a viachodinové dotazy pomocou motora Spark - ktorý poskytuje úplnú toleranciu chýb v strede dotazu.

3.3. Streamovanie iskier

Spark Streaming je rozšírenie základného rozhrania Spark API, ktoré umožňuje škálovateľné vysokovýkonné a na chyby odolné streamové spracovanie živých dátových tokov. Údaje je možné prijímať z mnohých zdrojov, ako sú napríklad zásuvky Kafka, Flume, Kinesis alebo TCP.

Nakoniec môžu byť spracované údaje vytlačené do súborových systémov, databáz a aktívnych informačných panelov.

3.4. Spark Mlib

MLlib je knižnica strojového učenia (ML) spoločnosti Spark. Jeho cieľom je dosiahnuť, aby bolo praktické strojové učenie škálovateľné a ľahké. Na vysokej úrovni poskytuje nástroje ako:

  • Algoritmy ML - bežné algoritmy učenia, ako je klasifikácia, regresia, klastrovanie a spoločné filtrovanie
  • Funkcionalizácia - extrakcia, transformácia, redukcia rozmerov a výber prvkov
  • Pipelines - nástroje na konštruovanie, hodnotenie a ladenie ML Pipelines
  • Perzistencia - ukladanie a načítanie algoritmov, modelov a potrubí
  • Pomôcky - lineárna algebra, štatistika, spracovanie údajov atď.

3.5. Spark GraphX

GraphX ​​je komponent pre grafy a grafovo paralelné výpočty. Na vysokej úrovni GraphX ​​rozširuje Spark RDD zavedením novej abstrakcie Graph: smerovaného multigrafu s vlastnosťami pripojenými ku každému vrcholu a hrane.

Na podporu výpočtu grafov GraphX ​​vystavuje množinu základných operátorov (napr. podgraf, joinVerticesa agregované správy).

Okrem toho obsahuje GraphX ​​čoraz väčšiu zbierku grafických algoritmov a nástrojov na zjednodušenie analytických úloh grafov.

4. „Hello World“ v programe Spark

Teraz, keď rozumieme základným komponentom, môžeme prejsť na jednoduchý projekt Spark založený na Maven - na výpočet počtu slov.

Ukážeme si, že Spark beží v lokálnom režime, kde všetky komponenty bežia lokálne na rovnakom stroji, kde je to hlavný uzol, uzly vykonávateľa alebo samostatný správca klastra Sparku.

4.1. Nastavenie Maven

Poďme nastaviť projekt Java Maven so závislosťami súvisiacimi so Sparkom v pom.xml spis:

  org.apache.spark spark-core_2.10 1.6.0 

4.2. Počet slov - Spark Job

Poďme teraz napísať úlohu Spark, ktorá spracuje súbor obsahujúci vety a na výstup odošle odlišné slová a ich počet v súbore:

public static void main (String [] args) vyvolá Výnimku {if (args.length <1) {System.err.println ("Použitie: JavaWordCount"); System.exit (1); } SparkConf sparkConf = nový SparkConf (). SetAppName ("JavaWordCount"); JavaSparkContext ctx = nový JavaSparkContext (sparkConf); Riadky JavaRDD = ctx.textFile (args [0], 1); Slová JavaRDD = lines.flatMap (s -> Arrays.asList (SPACE.split (s)). Iterator ()); JavaPairRDD ones = words.mapToPair (word -> new Tuple2 (word, 1)); JavaPairRDD countts = ones.reduceByKey ((Integer i1, Integer i2) -> i1 + i2); Zoznam výstup = countts.collect (); pre (Tuple2 n-tice: výstup) {System.out.println (tuple._1 () + ":" + tuple._2 ()); } ctx.stop (); }

Všimnite si, že cestu miestneho textového súboru odovzdáme ako argument úlohe Spark.

A SparkContext objekt je hlavným vstupným bodom pre Spark a predstavuje pripojenie k už spustenému klastru Spark. Používa to SparkConf objekt na popis konfigurácie aplikácie. SparkContext sa používa na čítanie textového súboru v pamäti ako JavaRDD objekt.

Ďalej transformujeme čiary JavaRDD namietať proti slovám JavaRDD objekt pomocou flatmap metóda, ktorá najskôr prevedie každý riadok na slová oddelené medzerou a potom vyrovná výstup každého spracovania riadku.

Opäť použijeme transformačnú operáciu mapToPair ktorá v podstate mapuje každý výskyt slova na n-ticu slov a počet 1.

Potom aplikujeme redukovatByKey operácia na zoskupenie viacerých výskytov ľubovoľného slova s ​​počtom 1 do n-tice slov a súčet počtu.

Nakoniec vykonáme collect Akcia RDD na získanie konečných výsledkov.

4.3. Vykonávanie - Spark Job

Poďme teraz vytvoriť projekt pomocou programu Maven na generovanie apache-spark-1.0-SNAPSHOT.jar v cieľovom priečinku.

Ďalej musíme túto úlohu WordCount odoslať Sparku:

$ {spark-install-dir} / bin / spark-submit --class com.baeldung.WordCount --master local $ {WordCount-MavenProject} /target/apache-spark-1.0-SNAPSHOT.jar $ {WordCount-MavenProject} /src/main/resources/spark_example.txt

Pred spustením vyššie uvedeného príkazu je potrebné aktualizovať inštalačný adresár Spark a adresár projektu WordCount Maven.

Pri podaní sa v zákulisí deje niekoľko krokov:

  1. Z kódu vodiča, SparkContext pripája sa k správcovi klastrov (v našom prípade lokálne spúšťa samostatného správcu klastra)
  2. Správca klastrov prideľuje prostriedky medzi ostatné aplikácie
  3. Spark získava exekútorov na uzloch v klastri. Tu získa naša aplikácia na počítanie slov svoje vlastné vykonávacie procesy
  4. Kód aplikácie (súbory jar) sa zasiela exekútorom
  5. Úlohy odosiela SparkContext exekútorom.

Nakoniec sa výsledok úlohy zapálenia vráti ovládaču a ako výstup uvidíme počet slov v súbore:

Ahoj 1 z 2 Baledung 2 Pokračuj v učení 1 Spark 1 Ahoj 1

5. Záver

V tomto článku sme diskutovali o architektúre a rôznych komponentoch Apache Spark. Demonštrovali sme tiež pracovný príklad úlohy Spark, ktorá dáva počty slov zo súboru.

Celý zdrojový kód je ako vždy k dispozícii na serveri GitHub.