Apache Spark optimering tekniker och prestanda Tuning

av Chandan Gaur|Big Data Engineering|05,oktober,2020

Vad är Apache Spark?

Apache, 2012, beskrev Resilient Distributed Dataset (RDD I Apache Spark) foundation med skrivskyddade distribuerade dataset på distribuerade kluster och namngav det som Apache Spark. Senare introducerar de dataset API och sedan dataframe API för batch och strukturerad streaming av data. Den här artikeln listar de bästa Apache Spark-Optimeringsteknikerna.

Apache Spark är en snabb klusterberäkningsplattform utvecklad för att utföra fler beräkningar och strömbehandling. Spark kan hantera en mängd olika arbetsbelastningar jämfört med traditionella system som kräver flera system för att köra och stödja. Dataanalysledningar underlättas av Spark i kombination med olika bearbetningstyper som är nödvändiga för produktion. Apache Spark är skapad för att fungera med en extern klusterhanterare som garn eller dess fristående chef.

funktioner i Apache Spark

vissa funktioner i Apache Spark inkluderar:-

  • enhetlig plattform för att skriva big data-applikationer.
  • enkel utveckling.
  • utformad för att vara mycket tillgänglig.
  • Spark kan köras oberoende. Således ger det flexibilitet.
  • Kostnadseffektiv.

XenonStack tillhandahåller analystjänster och lösningar för realtids-och Strömdataintag, bearbetning och analys av dataströmmarna snabbt och effektivt för sakernas Internet, övervakning, förebyggande och prediktivt underhåll.

från artikeln, Streaming och Realtidsanalystjänster

förstå hur Apache Spark optimering fungerar?

för att förstå hur Apache Spark-optimering fungerar måste du förstå dess arkitektur först och i det efterföljande avsnittet kommer vi att utarbeta detsamma.

arkitekturen för Apache Spark

Körtidsarkitekturen för Spark består av tre delar-

Spark Driver (Master Process)

Spark Driver konverterar programmen till uppgifter och schemalägger uppgifterna för exekutörer. Uppgiftsschemaläggaren är en del av föraren och hjälper till att distribuera uppgifter till exekutörer.

Spark Cluster Manager

en cluster manager är kärnan i Spark som gör det möjligt att starta exekutörer och ibland drivrutiner kan lanseras av det också. Spark Scheduler schemalägger åtgärder och jobb i Spark ansökan i FIFO sätt på cluster manager själv. Du bör också läsa om Apache Airflow.

exekutörer (Slavprocesser)

exekutörer är de enskilda enheter som den enskilda uppgiften för Jobbet körs på. Exekutörer kommer alltid att köra till livscykeln för en spark ansökan när de lanseras. Misslyckade exekutörer stoppar inte utförandet av spark job.

rdd (Resilient Distributed Datasets)

En RDD är en distribuerad samling oföränderliga dataset på distribuerade noder i klustret. En RDD är uppdelad i en eller flera partitioner. RDD är kärnan i spark som deras fördelning mellan olika noder i klustret som utnyttjar data lokalitet. För att uppnå parallellitet i applikationen är partitioner enheterna för den. Ompartition eller koalesce transformationer kan bidra till att upprätthålla antalet partitioner. Dataåtkomst optimeras med hjälp av RDD-blandning. Eftersom Spark ligger nära data skickar den data över olika noder genom den och skapar nödvändiga partitioner efter behov.

DAG (riktad acyklisk Graf)

Spark tenderar att generera en operatörsgraf när vi anger vår kod till Spark console. När en åtgärd utlöses för att gnista RDD, skickar Spark den grafen till DAGScheduler. Den delar sedan dessa operatörsdiagram till stadier av uppgiften inuti DAGScheduler. Varje steg kan innehålla jobb baserat på flera partitioner av inkommande data. DAGScheduler kopplar samman de enskilda operatörsdiagrammen. Till exempel, kartoperatörsdiagram schema för ett enstegs och dessa steg vidare till. Schemaläggaren i cluster manager för deras utförande. Detta är uppgiften att arbeta eller exekutörer att utföra dessa uppgifter på slaven.

distribuerad bearbetning med partitioner effektivt

att öka antalet exekutörer på kluster ökar också parallelliteten vid bearbetning av Gnistjobb. Men för detta måste man ha tillräcklig information om hur dessa data skulle fördelas mellan dessa exekutörer via partitionering. RDD är till hjälp för detta fall med försumbar trafik för datablandning över dessa exekutörer. Man kan anpassa partitioneringen för par RDD (RDD med nyckelvärdespar). Spark försäkrar att uppsättning nycklar alltid kommer att visas tillsammans i samma nod eftersom det inte finns någon uttrycklig kontroll i det här fallet.

Apache Spark security hjälper autentisering genom en delad hemlighet. Spark-autentisering är konfigurationsparametern genom vilken autentisering kan konfigureras. Det är parametern som kontrollerar om protokollen för spark-kommunikationen gör autentisering med en delad hemlighet eller inte.

från artikeln, Apache Spark Security

misstag att undvika när du skriver Spark-applikationer

reduceByKey eller groupByKey

både groupByKey och reduceByKey ger samma svar men konceptet för att ge resultat är olika. reduceByKey är bäst lämpad för stora dataset eftersom Spark kombinerar utgång med en delad nyckel för varje partition innan blanda av data. På andra sidan blandar groupByKey alla nyckelvärdespar. GroupByKey orsakar onödiga shuffles och överföring av data över nätverket.

behåll önskad storlek på blandningsblocken

som standard kan Spark shuffle block inte överstiga 2 GB. Ju bättre användning är att öka partitioner och minska dess kapacitet till ~128MB per partition som kommer att minska shuffle blockstorlek. Vi kan använda omfördelning eller sammansmältning i vanliga applikationer. Stora partitioner gör processen långsam på grund av en gräns på 2 GB, och få partitioner tillåter inte att skala jobbet och uppnå parallelliteten.

filformat och avgränsare

Att välja rätt filformat för varje datarelaterad specifikation är huvudvärk. Man måste välja klokt dataformatet för Förtäringstyper, mellanliggande typ och Slututgångstyp. Vi kan också klassificera datafilformat för varje typ på flera sätt, till exempel att vi kan använda Avro-filformat för lagring av mediedata eftersom Avro är bäst optimerad för binär data än parkett. Parkett kan användas för att lagra metadatainformation eftersom den är mycket komprimerad.

små datafiler

Broadcasting är en teknik för att ladda små datafiler eller dataset i block av minne så att de kan förenas med mer massiva dataset med mindre overhead av blanda data. Till exempel kan vi lagra små datafiler i n antal block och stora datafiler kan anslutas till dessa datablock i framtiden eftersom stora datafiler kan distribueras mellan dessa block på ett parallellt sätt.

ingen övervakning av Jobbsteg

DAG är en datastruktur som används i Spark som beskriver olika stadier av uppgifter i grafformat. De flesta utvecklare skriver och kör koden, men övervakning av arbetsuppgifter är viktigt. Denna övervakning uppnås bäst genom att hantera DAG och minska stadierna. Jobbet med 20 steg förlängs jämfört med ett jobb med 3-4 steg.

ByKey, ompartition eller andra operationer som utlöser shuffles

de flesta gånger måste vi undvika shuffles så mycket vi kan som data shuffles över många, och ibland blir det väldigt komplicerat att få skalbarhet ur dessa shuffles. GroupByKey kan vara en värdefull tillgång, men dess behov måste beskrivas först.

Förstärkningsinlärning

Förstärkningsinlärning är inte bara konceptet för att få bättre Maskininlärningsmiljö utan också för att bearbeta beslut på ett bättre sätt. Man måste tillämpa deep reinforcement Learning i spark om övergångsmodellen och belöningsmodellen är korrekt byggda på datamängder och även agenter kan uppskatta resultaten.

Apache Spark Optimeringsfaktorer och tekniker

En av de bästa funktionerna i Apache Spark optimering är det hjälper till i minnet databeräkningar. Flaskhalsen för dessa gnistoptimeringsberäkningar kan vara CPU, minne eller någon resurs i klustret. Ett behov av att serialisera data, minska minnet kan uppstå i sådana fall. Dessa faktorer för gnistoptimering, om de används korrekt, kan–

  • eliminera den långvariga jobbprocessen
  • correction execution engine
  • förbättrar prestandatiden genom att hantera resurser

13 enkla tekniker för Apache Spark-optimering

ackumulatorer är globala variabler för exekutörerna som bara kan läggas till genom en associativ och kommutativ operation. Det kan därför vara effektivt parallellt. Ackumulatorer kan användas för att implementera räknare (samma som i Map Reduce) eller en annan uppgift som spårnings-API-samtal.

som standard stöder Spark numeriska ackumulatorer, men programmerare har fördelen att lägga till stöd för nya typer. Spark säkerställer att varje aktivitets uppdatering endast kommer att tillämpas en gång på ackumulatorvariablerna. Under transformationer bör användarna ha en medvetenhet om varje uppgiftsuppdatering eftersom dessa kan tillämpas mer än en gång om jobbstadier körs igen.

Hive Bucketing Performance

Bucketing resultat med ett fast antal filer som vi anger antalet hinkar med en hink. Hive tog fältet, beräkna hash och tilldela en post till den speciella hinken. Bucketing är stabilare när fältet har hög kardinalitet, stor databehandling och poster fördelas jämnt mellan alla hinkar medan partitionering fungerar när partitioneringsfältets kardinalitet är låg.

Bucketing minskar kostnaderna för sortering av filer. Till exempel, om vi ansluter två tabeller som har lika många hinkar i det, spark ansluter data direkt som nycklar redan sorterade hinkar. Antalet hinkfiler kan beräknas som flera partitioner i flera hinkar.

predikat Pushdown optimering

predikat pushdown är en teknik för att bearbeta endast de nödvändiga uppgifterna. Predikat kan tillämpas på SparkSQL genom att definiera filter i where-förhållanden. Genom att använda kommandot förklara för att fråga kan vi kontrollera frågebehandlingsstegen. Om frågeplanen innehåller PushedFilter än frågan är optimerad för att välja endast nödvändiga data som varje predikat returnerar antingen sant eller falskt.

Om det inte finns något PushedFilter som finns i frågeplanen än bättre är att kasta where-villkoret. Predikat Pushdowns begränsar antalet filer och partitioner som SparkSQL läser medan du frågar, vilket minskar disk I/O startar In-Memory Analytics. Fråga på data i hinkar med predikat pushdowns ger resultat snabbare med mindre shuffle.

noll Data serialisering / deserialisering med Apache Arrow

Apache Arrow används som ett in-Memory run-time-format för analytiska frågemotorer. Arrow ger data serialisering / deserialisering noll blandar genom delat minne. Arrow flight skickar de stora datamängderna över nätverket. Arrow har sitt arrow – filformat som tillåter nollkopiering slumpmässig åtkomst till data på diskar. Arrow har ett standarddataåtkomstlager för alla spark-applikationer.

Det minskar omkostnaderna för SerDe-operationer för att blanda data eftersom det har en gemensam plats där all data är bosatt och i pilspecifikt format.

Sopuppsamlingsinställning med G1GC Collection

När du ställer in sopuppsamlare rekommenderar vi först att du använder G1 GC för att köra Spark-applikationer. G1-sopsamlaren hanterar helt växande högar som vanligtvis ses med gnista. Med G1 behövs färre alternativ för att ge både högre genomströmning och lägre latens. För att kontrollera oförutsägbara egenskaper och beteenden hos olika applikationer måste GC-tuning behärskas enligt genererade loggar.

innan detta måste andra optimeringstekniker som Streaming och Realtidsanalyslösningar, i programmets logik och kod tillämpas. För det mesta hjälper G1GC till att optimera paustiden mellan processer som är ganska ofta i Spark-applikationer, vilket minskar jobbkörningstiden med ett mer tillförlitligt system.

minneshantering och inställning

som vi vet att för beräkningar som blandning, sortering och så vidare används Exekveringsminne medan lagringsminne används för cachningsändamål som också sprider interna data. Det kan finnas vissa fall där jobb inte använder någon cache; därför fall av rymdfel under körning. Cachade jobb gäller alltid mindre lagringsutrymme där data inte får vräkas av något exekveringskrav. Dessutom kan Realtidsströmningsapplikation med Apache Spark göras.

Vi kan ställa in gnista.minne.fraktion för att bestämma hur mycket JVM heap utrymme används för Spark exekveringsminne. Vanligtvis är 60% standard. Executor minne måste hållas så mindre som möjligt eftersom det kan leda till fördröjning av JVM sophämtning. Detta faktum är också tillämpligt för små exekutörer eftersom flera uppgifter kan köras på en enda JVM-instans.

data Locality

i Apache Spark optimeras Bearbetningsuppgifterna genom att placera exekveringskoden nära den bearbetade data, kallad data locality. Ibland måste bearbetningsuppgiften vänta innan du får data eftersom data inte är tillgängliga. Men när tiden för gnista.ort.vänta löper ut, Spark försöker mindre lokal nivå, dvs lokal till noden för att rack till någon.

att överföra data mellan diskar är mycket kostsamt, så de flesta av operationerna måste utföras på den plats där data finns. Det hjälper till att ladda endast små men krävde mängden data tillsammans med testdriven utveckling för Apache Spark.

använda Kollokerade anslutningar

Kollokerade anslutningar fattar beslut om omfördelning och sändning. Vi kan definiera små datamängder som ska placeras i flera minnesblock för att uppnå bättre användning av sändningar. När du applicerar kopplingar på två datauppsättningar, sorterar spark först data för båda datauppsättningarna efter nyckel och sammanfogar dem.

Men vi kan också använda Sortera partitionsnyckel innan du går med i dem eller när du skapar dessa dataramar Iapache Arrow Architecture. Detta kommer att optimera körtiden för frågan eftersom det inte skulle finnas några onödiga funktionsanrop att sortera.

Caching i Spark

Caching i Apache Spark med GPU är den bästa tekniken för Apache Spark optimering när vi behöver lite data om och om igen. Men det är alltid inte acceptabelt att cacha data.

Vi måste använda cache () RDD och DataFrames i något av följande fall–

  • när det finns en iterativ slinga som i maskininlärningsalgoritmer.
  • när RDD nås flera gånger i ett enda jobb eller uppgift.
  • när kostnaden för att generera rdd-partitionerna igen är högre.

Cache () och kvarstår (StorageLevel.MEMORY_ONLY) kan användas i stället för varandra. Varje rdd-partition som kastas ut ur minnet måste byggas igen från källan som fortfarande är mycket dyr. En av de bästa lösningarna är att använda persistent (lagringsnivå.MEMORY_AND_DISK_ONLY) som skulle spilla partitioner av RDD till arbetstagarens lokala disk. Detta fall kräver bara att få data från arbetstagarens lokala enhet som är relativt snabb.

Executor Size

När vi kör exekutörer med högt minne resulterar det ofta i alltför stora förseningar i sophämtning. Vi måste hålla kärnantalet per exekutör under fem uppgifter per exekutör. För små exekutörer kom inte ut vara praktiskt när det gäller att köra flera jobb på enstaka JVM.

till exempel måste sändningsvariabler replikeras för varje exekutör exakt en gång, vilket kommer att resultera i fler kopior av data.

Gnistfönsterfunktion

en fönsterfunktion definierar en ram genom vilken vi kan beräkna inmatningsrader i en tabell. På individuell radnivå. Varje rad kan ha en tydlig ram. Fönster tillåter oss att definiera ett fönster för data i dataramen. Vi kan jämföra flera rader i samma dataram.

Vi kan ställa in fönstertiden till ett visst intervall som löser problemet med databeroende med tidigare data. Shuffling i Apache Beam är mindre på tidigare bearbetade data eftersom vi behåller dessa data för window interval.

Vattenmärkesteknik

vattenmärkning är en användbar teknik i Apache Spark-optimering som begränsar systemet genom design och hjälper till att förhindra att det exploderar under körningen. Vattenstämpel tar två argument–

  • kolumn för händelsetid och
  • en tröskeltid som anger hur länge vi måste behandla sena data

frågan i Apache Arrow Architecture uppdateras automatiskt om data faller inom den angivna tröskeln; annars utlöses ingen behandling för den försenade data. Man måste komma ihåg att vi kan använda komplett läge sida vid sida med vattenmärkning eftersom fullt läge först kvarstår Alla data till den resulterande tabellen.

Dataserialisering

Apache Spark-optimering fungerar på data som vi behöver bearbeta för vissa användningsfall som analys eller bara för förflyttning av data. Denna rörelse av data eller analys kan utföras väl om data är i något bättre serialiserat format. Apache Spark stöder dataserialisering för att hantera de dataformat som behövs vid källan eller destinationen effektivt. Som standard använder Apache Spark Java-serialisering men stöder också Kryo-serialisering.

som standard använder Spark Java: s ObjectOutputStream för att serialisera data. Implementeringen kan ske via java.io.Serialiserbar klass. Det kodar objekten i en ström av byte. Det ger lätt uthållighet och flexibel. Men det blir långsamt eftersom det leder till enorma serialiserade format för varje klass det används i. Spark stöder Kryo Serialization library (v4) för serialisering av objekt nästan 10x snabbare än Java serialisering eftersom det är mer kompakt än Java.

Apache Spark Optimering: Ett omfattande tillvägagångssätt

Apache Spark, en öppen källkod distribuerad datormotor, är för närvarande det mest populära ramverket för batchbehandling i minnet, som också stöder streaming i realtid. Med sin avancerade query optimizer och exekveringsmotor kan Apache Spark optimeringstekniker bearbeta och analysera stora datamängder mycket effektivt. Att köra Apache Spark Join optimeringstekniker Utan noggrann inställning kan dock försämra prestanda. Om du vill utnyttja din Apache Spark-applikationskraft, kolla in våra hanterade Apache Spark-tjänster.

kategorier :

Big Data Utveckling, Big Data Lösningar, Strömmande Data Analytics,

Dela:

You might also like

Lämna ett svar

Din e-postadress kommer inte publiceras.