Aportat per Prithviraj Bose
Al meu bloc anterior he parlat de transformacions estatals utilitzant el concepte de finestra de Apache Spark Streaming. El podeu llegir aquí .
En aquest post parlaré de les operacions acumulatives amb estat en Apache Spark Streaming. Si no coneixeu Spark Streaming, us recomano que llegiu el meu bloc anterior per entendre com funciona la finestra.
Tipus de transformació estatal en transmissió d’espurnes (Continuació ...)
> Seguiment acumulat
Havíem utilitzat el reduceByKeyAndWindow (...) API per fer un seguiment dels estats de les claus, tot i que la finestra presenta limitacions per a determinats casos d’ús. Què passa si volem acumular els estats de les tecles en lloc de limitar-lo a una finestra de temps? En aquest cas, hauríem d'utilitzar updateStateByKey (...) INCENDI.
Aquesta API es va introduir a Spark 1.3.0 i ha estat molt popular. Tanmateix, aquesta API té una sobrecàrrega de rendiment, el seu rendiment es degrada a mesura que la mida dels estats augmenta amb el pas del temps. He escrit una mostra per mostrar l'ús d'aquesta API. Podeu trobar el codi aquí .
Spark 1.6.0 va introduir una nova API mapWithState (...) que resol les despeses generals de rendiment plantejades per updateStateByKey (...) . En aquest bloc discutiré aquesta API en particular mitjançant un programa de mostra que he escrit. Podeu trobar el codi aquí .
Abans d’endinsar-me en un recorregut de codi, estalviem algunes paraules sobre el control. Per a qualsevol transformació amb estat, el control és obligatori. El punt de verificació és un mecanisme per restaurar l’estat de les claus en cas que falla el programa del controlador. Quan el controlador es reinicia, l'estat de les claus es restaura des dels fitxers de control. Les ubicacions dels punts de control solen ser HDFS o Amazon S3 o qualsevol emmagatzematge fiable. Mentre es prova el codi, també es pot emmagatzemar al sistema de fitxers local.
Al programa de mostra, escoltem el flux de text de socket a host = localhost i port = 9999. Simbolitza el flux entrant a (paraules, nombre d’ocurrències) i fa un seguiment del recompte de paraules mitjançant l’API 1.6.0 mapWithState (...) . A més, s'eliminen les claus sense actualitzacions mitjançant StateSpec.timeout API. Estem realitzant punts de control en HDFS i la freqüència dels punts de control és cada 20 segons.
Primer creem una sessió de Spark Streaming,
Creem un checkpointDir al HDFS i després truqueu al mètode object getOrCreate (...) . El getOrCreate API comprova el fitxer checkpointDir per veure si hi ha algun estat anterior a restaurar, si existeix, recrea la sessió de Spark Streaming i actualitza els estats de les claus a partir de les dades emmagatzemades als fitxers abans de continuar amb dades noves. En cas contrari, es crea una nova sessió de Spark Streaming.
ec2 crea una instància a partir de la instantània
El getOrCreate pren el nom del directori del punt de control i una funció (que hem anomenat createFunc ) la signatura del qual hauria de ser () => StreamingContext .
Examinem el codi que hi ha a dins createFunc .
Línia núm. 2: creem un context de transmissió amb el nom del treball a 'TestMapWithStateJob' i l'interval de lots = 5 segons.
Línia 5: definiu el directori del punt de control.
Línia núm. 8: definiu l'especificació d'estat mitjançant la classe org.apache.streaming.StateSpec objecte. Primer establim la funció que farà un seguiment de l’estat i, a continuació, establirem el nombre de particions per als DStreams resultants que es generaran durant les transformacions posteriors. Finalment, establim el temps d'espera (a 30 segons), si no es rep cap actualització d'una clau en 30 segons, l'estat de la clau s'eliminarà.
Línia 12 #: configureu el flux de sòcol, aplaneu les dades de lot entrants, creeu un parell clau-valor, truqueu mapWithState , definiu l'interval de punt de control a 20s i, finalment, imprimiu els resultats.
El marc Spark crida th e createFunc per a cada tecla amb el valor anterior i l'estat actual. Calculem la suma i actualitzem l’estat amb la suma acumulativa i, finalment, retornem la suma de la clau.
Fonts de Github -> TestMapStateWithKey.scala , TestUpdateStateByKey.scala
Tens alguna pregunta? Esmenta’l a la secció de comentaris i et respondrem.
Articles Relacionats:
Comenceu amb Apache Spark & Scala