Bästa svaret
För vad det gäller ramverket som helhet: för närvarande är Apache Spark ett steg före sina konkurrenter , på grund av vissa egenskaper som implementering (och integration) av olika och mycket användbara verktyg (Spark SQL och MLlib bara för att nämna två) och möjligheten att lagra mellanliggande data i RDD. På grund av detta motiv är det många utvecklare som koncentrerar sig på det, och min gissning är att tills ett nytt genombrott i den underliggande tekniken kommer upp kommer alla konkurrenter att vara försumbara.
Annars, om du överväger de enskilda implementeringarna på Apache Spark kan du identifiera några konkurrenter: H2O är en utmanare för Spark MLlib, Storm (har påpekats av Joe) är ett alternativ till Spark-streaming och där ute finns flera SQL-liknande motorer som kan jämföras med Spark SQL .
Svar
Här är några JARGONS från Apache Spark jag kommer att använda.
Jobb: – En kod kod som läser en del inmatningar från HDFS eller lokalt, utför viss beräkning av data och skriver utdata.
Steg: -Jobb är indelade i steg . Stadier klassificeras som en karta eller minskar stadier (det är lättare att förstå om du har arbetat på Hadoop och vill korrelera). Stegen delas utifrån beräkningsgränser, alla beräkningar (operatörer) kan inte uppdateras i ett enda steg. Det händer i många steg.
Uppgifter: – Varje steg har vissa uppgifter, en uppgift per partition. En uppgift körs på en partition av data på en exekverare (maskin).
DAG – DAG står för Directed Acyclic Graph, i det nuvarande sammanhanget är det en DAG av operatörer.
Executor – Processen som ansvarar för att utföra en uppgift.
Driver – Programmet / processen som ansvarar för att köra jobbet över Spark Engine
Master – Maskinen som drivrutinsprogrammet körs på
Slav – Maskinen som Executor-programmet körs på
Alla jobb i gnist består av en serie operatörer och körs på en uppsättning data. Alla operatörer i ett jobb används för att konstruera en DAG (Directed Acyclic Graph). DAG är optimerad genom att omorganisera och kombinera operatörer där det är möjligt. Låt oss till exempel anta att du måste skicka ett gnistjobb som innehåller en kartåtgärd följt av en filteråtgärd. Spark DAG optimizer skulle ordna om dessa operatörers ordning, eftersom filtrering skulle minska antalet poster för att genomgå kartoperation.
Spark har en liten kodbas och systemet är uppdelat i olika lager. Varje lager har vissa ansvarsområden. Skikten är oberoende av varandra.
- Det första lagret är tolk använder Spark en Scala-tolk, med vissa modifieringar.
- När du anger din kod i gnistkonsolen (skapar RDD och använder operatörer ), Spark skapar ett operatörsdiagram.
- När användaren kör en åtgärd (som samla) skickas diagrammet till en DAG-schemaläggare. DAG-schemaläggaren delar upp operatörsdiagram i (kartlägga och reducera) steg.
- Ett steg består av uppgifter baserade på partitioner av ingångsdata. DAG-schemaläggaren rör operatörer tillsammans för att optimera grafen. För t.ex. många kartoperatörer kan schemaläggas i ett enda steg. Denna optimering är nyckeln till Sparks-prestanda. Det slutliga resultatet av en DAG-schemaläggare är en uppsättning steg.
- Stegen skickas till Aktivitetsschemaläggare . Aktivitetsschemaläggaren startar uppgifter via klusterhanterare . (Spark fristående / garn / Mesos). Uppgiftsschemaläggaren vet inte om beroenden mellan steg.
- Arbetare utför uppgifterna på slaven. En ny JVM startas per JOBB: Arbetaren känner bara till koden som skickas till den.
Spark cachar data som ska bearbetas, vilket gör att jag får det 100 gånger snabbare än hadoop. Spark använder Akka för Multithreading, hantera exekveringsstatus, schemalägga uppgifter. Den använder Jetty för att dela filer (burkar och andra filer), Http Broadcast, köra Spark Web UI. Spark är mycket konfigurerbar och kan använda de befintliga komponenter som redan finns i Hadoop Eco-System. Detta har gjort det möjligt för gnistan att växa exponentiellt, och på kort tid använder många organisationer redan den i produktion.
Du kan titta på
för att förstå saker mer detaljerat.