Apache Spark Optimization Techniques and Performance Tuning

By Chandan Gaur / Big Data Engineering / 05, okt, 2020

Wat is Apache Spark?

Apache beschreef in 2012 de Resilient Distributed Dataset (RDD in Apache Spark) foundation met alleen-lezen gedistribueerde datasets op gedistribueerde clusters en noemde het Apache Spark. Later introduceren ze dataset API en vervolgens dataframe API ‘ s voor batch en gestructureerde streaming van gegevens. Dit artikel geeft een overzicht van de beste Apache Spark optimalisatie technieken.

Apache Spark is een snel cluster computing platform ontwikkeld voor het uitvoeren van meer berekeningen en stream processing. Spark kan omgaan met een breed scala aan workloads in vergelijking met traditionele systemen die meerdere systemen nodig hebben om te draaien en te ondersteunen. Data analyse pijpleidingen worden vergemakkelijkt door vonk in combinatie van verschillende soorten verwerking die nodig is voor de productie. Apache Spark is gemaakt om te werken met een externe cluster manager zoals garen of de stand-alone manager.

kenmerken van Apache Spark

enkele kenmerken van Apache Spark zijn::-

  • Verenigd Platform voor het schrijven van big data-applicaties.
  • Ontwikkelingsgemak.
  • ontworpen om zeer toegankelijk te zijn.
  • Spark kan onafhankelijk werken. Zo geeft het flexibiliteit.
  • Kostenefficiënt.XenonStack biedt analysediensten en oplossingen voor realtime en Stream gegevensopname, verwerking en analyse van de gegevensstromen snel en efficiënt voor het Internet der dingen, Monitoring, preventief en voorspellend onderhoud.

    van het artikel, Streaming en Real-Time Analytics diensten

    begrijpen hoe Apache Spark optimalisatie werkt?

    om te begrijpen hoe Apache Spark optimization werkt, moet u eerst de architectuur ervan begrijpen en in de volgende sectie zullen we hetzelfde verder uitwerken.

    de architectuur van Apache Spark

    De Run-time architectuur van Spark bestaat uit drie delen –

    Spark Driver (Master Process)

    De Spark Driver zet de programma ‘ s om in taken en plant de taken voor uitvoerders. De Taakplanner is het deel van het stuurprogramma en helpt bij het verdelen van taken aan uitvoerders.

    Spark Cluster Manager

    een Clustermanager is de kern van Spark die het mogelijk maakt om uitvoerders te starten en soms kunnen ook stuurprogramma ‘ s door Spark worden gestart. Spark Scheduler plant de acties en banen in Spark applicatie in FIFO manier op cluster manager zelf. Je moet ook lezen over Apache Airflow.

    uitvoerders (Slave-processen)

    uitvoerders zijn de individuele entiteiten waarop de individuele taak van taak wordt uitgevoerd. Executors zal altijd lopen tot de levenscyclus van een spark applicatie zodra ze worden gelanceerd. Mislukte uitvoerders niet stoppen met de uitvoering van spark job.

    RDD (Resilient Distributed Datasets)

    een RDD is een gedistribueerde verzameling onveranderlijke datasets op gedistribueerde knooppunten van het cluster. Een RDD wordt gepartitioneerd in een of meerdere partities. RDD is de kern van de vonk als hun distributie over verschillende knooppunten van de cluster die gebruik maakt van data lokaliteit. Om parallellisme binnen de applicatie te bereiken, zijn partities de eenheden daarvoor. Repartition of coalesce transformaties kunnen helpen om het aantal partities te behouden. Toegang tot gegevens is geoptimaliseerd met behulp van RDD shuffling. Als Spark is dicht bij Gegevens, Het stuurt gegevens over verschillende knooppunten door het en maakt de vereiste partities als dat nodig is.

    DAG (gerichte acyclische grafiek)

    Spark heeft de neiging om een operator grafiek te genereren wanneer we onze code naar Spark console invoeren. Wanneer een actie wordt geactiveerd om vonk RDD, Spark legt die grafiek aan de DAGScheduler. Het verdeelt dan die operator grafieken om stadia van de taak in DAGScheduler. Elke stap kan taken bevatten op basis van meerdere partities van de binnenkomende gegevens. De DAGScheduler koppelt die individuele operator grafieken aan elkaar. Bijvoorbeeld, kaart operator grafieken schema voor een single-stage en deze fasen doorgeven aan de. Taakplanner in Clusterbeheer voor de uitvoering ervan. Dit is de taak van het werk of uitvoerders om deze taken uit te voeren op de slaaf.

    gedistribueerde verwerking efficiënt gebruikmakend van partities

    Het verhogen van het aantal uitvoerders op clusters verhoogt ook het parallellisme bij het verwerken van Vonk taak. Maar hiervoor moet men voldoende informatie hebben over hoe die gegevens via partitionering onder die uitvoerders zouden worden verdeeld. RDD is nuttig voor deze zaak met verwaarloosbaar verkeer Voor gegevens schuifelen over deze uitvoerders. Men kan de partitionering voor paar RDD (RDD met sleutel-waarde paren) aanpassen. Spark zorgt ervoor dat een set sleutels altijd samen in hetzelfde knooppunt zal verschijnen omdat er in dit geval geen expliciete controle is.

    Apache Spark beveiliging helpt authenticatie via een gedeeld geheim. Spark authenticatie is de configuratieparameter waarmee authenticatie kan worden geconfigureerd. Het is de parameter die controleert of de protocollen van de vonk communicatie doen authenticatie met behulp van een gedeeld geheim of niet.

    van het artikel, Apache Spark Security

    fouten te vermijden tijdens het schrijven van Spark applicaties

    reduceByKey of groupByKey

    zowel groupByKey als reduceByKey produceren hetzelfde antwoord, maar het concept om resultaten te produceren is anders. reduceByKey is het beste geschikt voor grote dataset omdat in Spark het output combineert met een gedeelde sleutel voor elke partitie voordat gegevens worden geschud. Terwijl aan de andere kant, groupByKey shuffles alle sleutel-waarde paren. GroupByKey veroorzaakt onnodige shuffles en overdracht van gegevens over het netwerk.

    Behoud de vereiste grootte van de shuffle blokken

    standaard mag Spark shuffle block niet groter zijn dan 2 GB. Het betere gebruik is om partities te verhogen en de capaciteit te verminderen tot ~ 128MB per partitie die de shuffle-blokgrootte zal verminderen. We kunnen herpartitioneren of samensmelten in reguliere toepassingen. Grote partities maken het proces traag vanwege een limiet van 2GB, en weinig partities staan niet toe om de taak te schalen en het parallellisme te bereiken.

    bestandsformaten en scheidingstekens

    het kiezen van de juiste bestandsindelingen voor elke gegevensgerelateerde specificatie is een hoofdpijn. Men moet verstandig kiezen voor het gegevensformaat voor ingestie types, Intermediate type, en uiteindelijke output type. We kunnen ook de databestandsformaten voor elk type op verschillende manieren classificeren, zoals we AVRO-bestandsformaat kunnen gebruiken voor het opslaan van mediagegevens, omdat Avro het best geoptimaliseerd is voor binaire gegevens dan parket. Parket kan worden gebruikt voor het opslaan van metadata informatie als het is sterk gecomprimeerd.

    kleine gegevensbestanden

    Broadcasting is een techniek om kleine gegevensbestanden of datasets in geheugenblokken te laden, zodat ze kunnen worden samengevoegd met Massievere datasets met minder overhead aan schuifgegevens. We kunnen bijvoorbeeld kleine databestanden opslaan in n aantal blokken en grote databestanden kunnen in de toekomst met deze datablokken worden verbonden omdat grote databestanden parallel over deze blokken kunnen worden verdeeld.

    geen Monitoring van Takenfasen

    DAG is een gegevensstructuur die in Spark wordt gebruikt en die verschillende takenfasen in grafisch formaat beschrijft. De meeste ontwikkelaars schrijven en voeren de code uit, maar het monitoren van Taaktaken is essentieel. Deze monitoring kan het best worden bereikt door DAG te beheren en de fasen te verminderen. De baan met 20 stappen wordt verlengd in vergelijking met een baan met 3-4 fasen.

    ByKey, repartitie of andere bewerkingen die shuffles activeren

    de meeste keren moeten we shuffles zoveel mogelijk vermijden als gegevens over veel heen en weer schuiven, en soms wordt het erg complex om schaalbaarheid te verkrijgen uit deze shuffles. GroupByKey kan een waardevolle troef zijn, maar de noodzaak ervan moet eerst worden beschreven.

    Reinforcement Learning

    Reinforcement Learning is niet alleen het concept om een betere machine learning omgeving te verkrijgen, maar ook om beslissingen op een betere manier te verwerken. Men moet deep reinforcement Learning toepassen in spark als het Transitiemodel en het beloningsmodel correct zijn gebouwd op datasets en ook agenten in staat zijn om de resultaten te schatten.

    Apache Spark Optimization Factors and Techniques

    een van de beste eigenschappen van Apache Spark optimization is dat het helpt bij in-memory data berekeningen. De bottleneck voor deze vonk optimalisatie berekeningen kunnen CPU, geheugen of een bron in het cluster. Een noodzaak om de gegevens te serialiseren, het geheugen te verminderen kan zich in dergelijke gevallen voordoen. Deze factoren voor vonk optimalisatie, indien goed gebruikt, kan–

    • elimineer het langdurige taakproces
    • Correctieuitvoerengine
    • verbetert de prestatietijd door resources te beheren

    13 eenvoudige technieken voor Apache Spark optimalisatie

    Accumulators zijn globale variabelen voor de uitvoerders die alleen kunnen worden toegevoegd door middel van een associatieve en commutatieve operatie. Het kan dus parallel efficiënt zijn. Accumulators kunnen worden gebruikt om tellers te implementeren (hetzelfde als in Map Reduce) of een andere taak, zoals het bijhouden van API-oproepen.

    standaard ondersteunt Spark numerieke accumulatoren, maar programmeurs hebben het voordeel om ondersteuning toe te voegen voor nieuwe typen. Spark zorgt ervoor dat elke taak update zal slechts eenmaal worden toegepast op de accumulator variabelen. Tijdens transformaties moeten gebruikers zich bewust zijn van de update van elke taak, omdat deze meer dan eens kunnen worden toegepast als taakfasen opnieuw worden uitgevoerd.

    Hive Bucketing Performance

    Bucketing resultaten met een vast aantal bestanden als we het aantal emmers met een emmer specificeren. Hive nam het veld, bereken de hash en wijs een record toe aan die bepaalde emmer. Emmeren is stabieler wanneer het veld een hoge kardinaliteit heeft, grote gegevensverwerking, en records gelijkmatig over alle emmers worden verdeeld, terwijl partitionering werkt wanneer de kardinaliteit van het partitioneringsveld laag is.

    Bucketing vermindert de overhead van het sorteren van bestanden. Als we bijvoorbeeld twee tabellen samenvoegen die een gelijk aantal emmers bevatten, voegt spark de gegevens rechtstreeks toe als sleutels die al gesorteerd zijn. Het aantal bucket-bestanden kan worden berekend als meerdere partities in meerdere emmers.

    predicaat Pushdown optimalisatie

    predicaat pushdown is een techniek om alleen de vereiste gegevens te verwerken. Predicaten kunnen worden toegepast op SparkSQL door filters te definiëren in waar omstandigheden. Door het commando explain te gebruiken om te query kunnen we de query verwerkingsstadia controleren. Als het queryplan PushedFilter bevat, is de query geoptimaliseerd om alleen vereiste gegevens te selecteren, omdat elk predicaat True Of False retourneert.

    als er geen Gepushedfilter gevonden wordt in het query plan dan is het beter om de where-voorwaarde te casten. Predicate Pushdowns beperkt het aantal bestanden en partities dat SparkSQL leest tijdens het opvragen, waardoor disk I/O-start in-Memory Analytics wordt verminderd. Het opvragen van gegevens in emmers met predicaat pushdowns levert sneller resultaten op met minder shuffle.

    Zero Data Serialization / Deserialization using Apache Arrow

    Apache Arrow wordt gebruikt als een in-Memory run-time formaat voor analytische query engines. Arrow biedt data serialisatie / deserialisatie nul shuffles door gedeeld geheugen. Arrow flight verzendt de grote datasets over het netwerk. Arrow heeft zijn arrow-bestandsformaat dat zero-copy willekeurige toegang tot gegevens op-schijven mogelijk maakt. Arrow heeft een standaard datatoegangslaag voor alle spark-toepassingen.

    het reduceert de overhead voor SerDe-bewerkingen voor het schudden van gegevens omdat het een gemeenschappelijke plaats heeft waar alle gegevens zich bevinden en in pijlspecifiek formaat.

    Garbage Collection Tuning gebruikmakend van G1gc Collection

    bij het afstemmen van garbage collectors raden we eerst aan om G1 GC te gebruiken om Spark applicaties uit te voeren. De G1 garbage collector behandelt volledig groeiende hopen die vaak worden gezien met Spark. Met G1 zijn minder opties nodig om zowel een hogere doorvoer als een lagere latentie te bieden. Om onvoorspelbare kenmerken en gedrag van verschillende toepassingen GC tuning te controleren moet worden beheerst volgens gegenereerde logs.

    hiervoor moeten andere optimalisatietechnieken worden toegepast, zoals Streaming en Real-Time analyseoplossingen, in de logica en code van het programma. De meeste van de tijd, G1GC helpt bij het optimaliseren van de pauze tijd tussen processen die vrij vaak in Spark toepassingen, dus vermindert de uitvoering van de taak tijd met een betrouwbaarder systeem.

    geheugenbeheer en Tuning

    omdat we weten dat Voor berekeningen zoals schuifelen, sorteren en ga zo maar door, Uitvoergeheugen wordt gebruikt terwijl voor cachingdoeleinden opslaggeheugen wordt gebruikt dat ook interne gegevens voortbrengt. Er kunnen enkele gevallen zijn waarin taken geen cache gebruiken; daarom zijn er gevallen zonder spatiefout tijdens het uitvoeren. Taken in de cache hebben altijd minder opslagruimte wanneer de gegevens niet mogen worden verwijderd door een uitvoeringsvereiste. Daarnaast kan Real-Time Streaming applicatie met Apache Spark worden gedaan.

    We kunnen spark instellen.geheugen.fractie om te bepalen hoeveel JVM heap ruimte wordt gebruikt voor Vonk uitvoering geheugen. Meestal is 60% de standaard. Uitvoerder geheugen moet zo min mogelijk worden gehouden omdat het kan leiden tot vertraging van JVM Garbage collection. Dit feit is ook van toepassing voor kleine uitvoerders als meerdere taken kunnen draaien op een enkele JVM instantie.

    Data Locality

    in Apache Spark worden verwerkingstaken geoptimaliseerd door de uitvoeringscode dicht bij de verwerkte gegevens te plaatsen, data locality genaamd. Soms moet de verwerkingstaak wachten voordat gegevens worden opgehaald omdat gegevens niet beschikbaar zijn. Echter, wanneer de tijd van vonk.plaats.wait verloopt, Spark probeert minder lokaal niveau, dat wil zeggen, lokaal naar het knooppunt te rack naar elke.

    Het overbrengen van gegevens tussen schijven is zeer kostbaar, dus de meeste bewerkingen moeten worden uitgevoerd op de plaats waar de gegevens zich bevinden. Het helpt om slechts klein te laden, maar vereist de hoeveelheid gegevens, samen met test-driven ontwikkeling voor Apache Spark.

    met behulp van Collocated Joins

    Collocated joins beslissen over herverdeling en uitzending. We kunnen kleine datasets definiëren die in meerdere geheugenblokken moeten worden geplaatst om een beter gebruik van Omroep te bereiken. Tijdens het toepassen van joins op twee datasets, vonk eerst Sorteer de gegevens van beide datasets op sleutel en ze samenvoegen.

    maar we kunnen ook sorteerpartitiesleutel toepassen voordat we ze samenvoegen of tijdens het maken van die dataframes INApache Arrow architectuur. Dit zal de looptijd van de query te optimaliseren als er geen onnodige functie aanroepen te sorteren zou zijn.

    Caching in Spark

    Caching in Apache Spark met GPU is de beste techniek voor Apache Spark optimalisatie wanneer we steeds weer wat data nodig hebben. Maar het is altijd niet acceptabel om gegevens in de cache te zetten.

    We moeten cache () RDD en DataFrames gebruiken in elk van de volgende gevallen–

    • wanneer er een iteratieve lus zoals in machine learning algoritmen.
    • wanneer RDD meerdere keren wordt geopend in een enkele taak of taak.
    • wanneer de kosten om de RDD partities opnieuw te genereren hoger zijn.

    Cache () en persist (StorageLevel.MEMORY_ONLY) kunnen in plaats van elkaar worden gebruikt. Elke RDD-partitie die uit het geheugen wordt verwijderd, moet opnieuw worden gebouwd vanaf de bron die nog steeds erg duur is. Een van de beste oplossingen is het gebruik van persist (Storage level.MEMORY_AND_DISK_ONLY) dat de partities van RDD naar de lokale schijf van de werknemer zou morsen. Dit geval vereist alleen het verkrijgen van gegevens van de lokale schijf van de werknemer die relatief snel is.

    Uitvoerdergrootte

    Wanneer uitvoerders met een hoog geheugen worden uitgevoerd, resulteert dit vaak in buitensporige vertragingen bij het ophalen van vuilnis. We moeten het aantal kernen per uitvoerder onder de vijf taken per uitvoerder houden. Te kleine uitvoerders niet komen van pas in termen van het uitvoeren van meerdere taken op enkele JVM.

    bijvoorbeeld, broadcast variabelen moeten voor elke uitvoerder exact één keer worden gerepliceerd, wat zal resulteren in meer kopieën van de gegevens.

    Vonkvensterfunctie

    een vensterfunctie definieert een frame waarmee we invoerrijen van een tabel kunnen berekenen. Op individueel rijniveau. Elke rij kan een duidelijk kader hebben. Windowing stelt ons in staat om een venster voor gegevens in het dataframe te definiëren. We kunnen meerdere rijen in hetzelfde gegevensframe vergelijken.

    We kunnen de venstertijd instellen op een bepaald interval dat het probleem van gegevensafhankelijkheid met eerdere gegevens zal oplossen. Shuffling in Apache Beam is minder op eerder verwerkte gegevens als we bewaren die gegevens voor window interval.

    watermerken techniek

    watermerken is een nuttige techniek in Apache Spark optimalisatie die het systeem beperkt door het ontwerp en helpt te voorkomen dat het explodeert tijdens het uitvoeren. Watermerk heeft twee argumenten–

    • kolom voor gebeurtenistijd en
    • een drempeltijd die aangeeft hoe lang we late gegevens moeten verwerken

    de query in de Apache Arrow-architectuur wordt automatisch bijgewerkt als gegevens binnen die vastgestelde drempel vallen; anders wordt geen verwerking van die vertraagde gegevens geactiveerd. Men moet niet vergeten dat we de Complete-modus naast watermerken kunnen gebruiken omdat de volledige modus eerst alle gegevens aan de resulterende tabel blijft bestaan.

    data serialisatie

    Apache Spark optimization werkt aan gegevens die we moeten verwerken voor sommige use cases zoals Analytics of alleen voor het verplaatsen van gegevens. Deze beweging van gegevens of Analytics kan goed worden uitgevoerd als de gegevens in een beter geserialiseerd formaat. Apache Spark ondersteunt data serialisatie om de data formaten die nodig zijn bij de bron of bestemming effectief te beheren. Standaard gebruikt Apache Spark Java-serialisatie, maar ondersteunt ook Kryo-serialisatie.

    standaard gebruikt Spark Java ‘ s ObjectOutputStream om de gegevens te serialiseren. De implementatie kan via de java.io.Serialiseerbare klasse. Het codeert de objecten in een stroom van bytes. Het biedt lichtgewicht persistentie en flexibel. Maar het wordt langzaam als het leidt tot enorme serialized formaten voor elke klasse wordt gebruikt in. Spark ondersteunt Kryo Serialization library (v4) voor serialisatie van objecten bijna 10x sneller dan Java serialisatie omdat het compacter is dan Java.

    Apache Spark Optimalisatie: Een uitgebreide aanpak

    Apache Spark, een open-source gedistribueerde computer engine, is momenteel het meest populaire kader voor in-memory batch processing, die ook real-time streaming ondersteunt. Met zijn geavanceerde query optimizer en execution engine kunnen Apache Spark optimalisatietechnieken grote datasets zeer efficiënt verwerken en analyseren. Echter, het uitvoeren van Apache Spark Join optimalisatie technieken zonder zorgvuldige tuning kan de prestaties degraderen. Als u gebruik wilt maken van uw Apache Spark Applicatievermogen, bekijk dan onze Managed Apache Spark Services.

    categorieën :

    Ontwikkeling Van Big Data,Oplossingen Voor Big Data,Streaming Data Analytics,

    Delen:

You might also like

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.