Felsöka Apache Spark Streaming-program

Den här guiden vägleder dig genom de olika felsökningsalternativ som är tillgängliga för att granska det interna Apache Spark Streaming-programmet. De tre viktiga platserna att titta på är:

  • Spark-användargränssnitt
  • Drivrutinsloggar
  • Körloggar

Spark-användargränssnitt

När du startar strömningsjobbet finns det en mängd information som är tillgänglig i Spark- och Streaming-användargränssnittet för att veta mer om vad som händer i ditt strömmande program. För att komma till Spark-användargränssnittet kan du klicka på det anslutna klustret:

Välj Spark-användargränssnitt

Fliken Direktuppspelning

När du kommer till Spark-användargränssnittet visas fliken Direktuppspelning om ett strömningsjobb körs i det här klustret. Om det inte körs något strömningsjobb i det här klustret visas inte den här fliken. Du kan gå vidare till Drivrutinsloggar om du vill lära dig hur du söker efter undantag som kan ha inträffat när strömningsjobbet startades.

Det första du letar efter på den här sidan är att kontrollera om ditt strömmande program tar emot indatahändelser från källan. I det här fallet kan du se att jobbet tar emot 1 000 händelser per sekund.

Om du har ett program som tar emot flera indataströmmar kan du klicka på länken Input Rate (Indatahastighet) som visar antalet händelser som tagits emot för varje mottagare.

Indatahastighet

Bearbetningstid

När du rullar nedåt hittar du diagrammet för Bearbetningstid. Det här är en av de viktigaste graferna för att förstå prestandan för ditt strömningsjobb. Som en allmän tumregel är det bra om du kan bearbeta varje batch inom 80 % av batchbearbetningstiden.

För det här programmet var batchintervallet 2 sekunder. Den genomsnittliga bearbetningstiden är 450 ms, vilket ligger väl under batchintervallet. Om den genomsnittliga bearbetningstiden är närmare eller större än batchintervallet har du ett strömmande program som börjar köa, vilket resulterar i bundna uppgifter snart, vilket kan göra att ditt strömningsjobb till slut blir av.

Bearbetningstid

Slutförda batchar

Mot slutet av sidan visas en lista över alla slutförda batchar. Sidan visar information om de senaste 1 000 batcharna som slutfördes. Från tabellen kan du hämta antalet händelser som bearbetas för varje batch och deras bearbetningstid. Om du vill veta mer om vad som hände i en av batcharna kan du klicka på batchlänken för att komma till sidan batchinformation.

Slutförda batchar

Sida med Batch-information

Den här sidan innehåller all information som du vill veta om en batch. Två viktiga saker är:

  • Indata: Den innehåller information om indata till batchen. I det här fallet innehåller den information om avsnittet Apache Kafka, partition och förskjutningar som läses av Spark Streaming för den här batchen. När det gäller TextFileStream visas en lista över filnamn som har lästs för den här batchen. Det här är det bästa sättet att börja felsöka ett strömmande program som läser från textfiler.
  • Bearbetning: Du kan klicka på länken till jobb-ID:t som innehåller all information om bearbetningen som utförs under den här batchen.

Batch-information

Sidan Jobbinformation

Jobbinformationssidan visar visualiseringen DStream DAG för batchen. Det här är en mycket användbar visualisering för att förstå DAG för åtgärder för varje batch. I det här fallet kan du se att batchen läser indata från Kafka-direktströmmen följt av en platt map-åtgärd och sedan en map-åtgärd. Resulterande DStream användes sedan för att uppdatera ett globalt tillstånd med updateStateByKey. (De grå rutorna representerar överhoppade faser. Spark är tillräckligt smart för att hoppa över vissa faser om de inte behöver kompileras om. Om data är kontrollpunkterade eller cachelagrade hoppar Spark över omberäkningen av dessa steg. I det här fallet motsvarar dessa faser beroendet av tidigare batchar på grund av updateStateBykey . Eftersom Spark Streaming internt kontrollerar DStream och läses från kontrollpunkten i stället för att vara beroende av föregående batchar visas de som gråtonade faser.)

Längst ned på sidan finns även en lista över jobb som har körts för den här batchen. Du kan klicka på länkarna i beskrivningen för att öka detaljnivån för körning på aktivitetsnivå.

Jobbinformation

Slutförda faser

Sidan Aktivitetsinformation

Det här är den mest detaljerade nivån av felsökning som du kan komma åt från Spark-användargränssnittet för ett Spark Streaming-program. Den här sidan innehåller alla aktiviteter som har körts för den här batchen. Om du undersöker prestandaproblem för ditt strömmande program skulle den här sidan ge information som antal uppgifter som har körts och var de kördes (på vilka utförare), blanda information osv.

Tips

Se till att uppgifterna körs på flera utförare (noder) i klustret för att ha tillräcklig parallellitet under bearbetningen. Om du har en enda mottagare kan det hända att endast en utförare utför allt arbete trots att du har fler än en utförare i klustret.

Uppgiftsinformation

Drivrutinsloggar

Drivrutinsloggar är användbara för två syften:

  • Undantag: Ibland kanske du inte ser fliken Direktuppspelning i Spark-användargränssnittet. Det beror på att strömningsjobbet inte startades på grund av något undantag. Du kan gå in på detalj i drivrutinsloggarna och titta på stackspårningen för undantaget. I vissa fall kan strömningsjobbet ha startats korrekt. Men du ser att alla batchar aldrig går till avsnittet Slutförda batchar. De kan alla vara i bearbetnings- eller misslyckat tillstånd. I sådana fall kan även drivrutinsloggar vara praktiska för att förstå de underliggande problemens natur.

  • Skriver ut: Alla utskriftsuttryck som en del av DStream DAG visas också i loggarna. Om du snabbt vill kontrollera innehållet i en DStream kan du göra dstream.print() det (Scala) eller dstream.pprint() (Python). Innehållet i DStream finns i loggarna. Du kan också göra dstream.foreachRDD{ print statements here } . De visas också i loggarna.

    Anteckning

    Att bara ha utskriftsuttryck i strömningsfunktionen utanför DStream DAG visas inte i loggarna. Spark Streaming genererar och kör endast DStream DAG. Utskriftsuttrycken måste alltså ingå i dag.

I följande tabell visas DStream-transformeringen och var motsvarande loggplats skulle vara om transformeringen hade en utskriftsuttryck:

Beskrivning Location
foreachRDD(), transform() Driver Stdout-loggar
foreachPartition() Utförare:s Stdout-loggar

För att komma till drivrutinsloggarna kan du klicka på det anslutna klustret.

Välj drivrutinsloggar

Drivrutinslogg

Anteckning

För PySpark-strömning visas inte alla utskrifter och undantag automatiskt i loggarna. Den aktuella begränsningen är att en notebook-cell måste vara aktiv för att loggarna ska visas. Eftersom strömningsjobbet körs i bakgrundstråden går loggarna förlorade. Om du vill se loggarna när du kör ett pyspark-strömmande program kan du ange i ssc.awaitTerminationOrTimeout(x) en av cellerna i anteckningsboken. Då behålls cellen i "x" sekunder. Efter "x"-sekunderna finns alla utskrifter och undantag under den tiden i loggarna.

Körloggar

Körningsloggar är ibland användbara om du ser att vissa uppgifter fungerar felaktigt och vill se loggarna för specifika uppgifter. Från sidan med uppgiftsinformation som visas ovan kan du hämta den utförare där aktiviteten har körts. När du har gjort det kan du gå till klustergränssnittssidan, klicka på noderna # och sedan på huvudnoden. På huvudsidan visas alla arbetare. Du kan välja den arbetsroll där den misstänkta aktiviteten har körts och sedan komma till log4j-utdata.

Välj huvud

Spark-huvud

Spark-arbetsroll