PySpark
DataFrame-uri distribuite, join-uri care nu aruncă clusterul în aer și părțile din Spark care mușcă.
-
Lecția 1
Big data, pe intelesul tuturor
Cand devin datele 'mari' in sens tehnic, de ce o singura masina nu mai e suficienta pana la urma si unde se incadreaza Spark in stiva.
-
Lecția 2
Ideea MapReduce si de ce a contat
Lucrarea Google din 2004, modelul care a facut procesarea distribuita abordabila si de ce toata lumea a trecut mai departe intr-un deceniu.
-
Lecția 3
Ce este Spark si de ce a inlocuit Hadoop MapReduce
Lucrarea lui Matei Zaharia din 2010, executia in memorie, DAG-ul, evaluarea lazy si afirmatia 'de 100 de ori mai rapid' - ce inseamna cu adevarat si ce nu.
-
Lecția 4
Arhitectura Spark: driver, executors, cluster manager
Cum ruleaza efectiv un job Spark pe mai multe masini. Driverul, executorii, cluster manager-ul si modelul de resurse care le leaga.
-
Lecția 5
RDD, DataFrame, Dataset, trei API-uri, un singur engine
De ce Spark are trei API-uri, la ce e bun fiecare, cand sa folosesti pe care, si de ce DataFrame-urile au castigat pentru aproape toata lumea.
-
Lecția 6
PySpark vs Scala Spark: ce traverseaza firul
Cum vorbeste PySpark cu JVM-ul, unde traieste overhead-ul de performanta si cand (rar) ai cobori efectiv la Scala.
-
Lecția 7
Instalarea PySpark local
Instalarea PySpark cu pip, cerinta Java care incurca mereu lumea si capcana cu Hadoop winutils valabila doar pe Windows.
-
Lecția 8
Primul tau SparkSession
Punctul de intrare in orice job PySpark. Ce este un SparkSession, configurarile care conteaza si ce inseamna de fapt `local[*]`.
-
Lecția 9
Citirea datelor: CSV, JSON, Parquet si compromisul schema-on-read
Trei formate de fisiere, trei comportamente implicite si de ce citirile bune devreme te scutesc de o suta de probleme mai tarziu.
-
Lecția 10
Show, count, collect: actiunile pe care orice incepator le ruleaza primele
Cele trei actiuni cu care incepe orice notebook PySpark, diferenta dintre ele si de ce e periculos sa le confunzi la scara mare.
-
Lecția 11
Scrierea datelor: moduri, partitii si problema numarului de fisiere
Save modes, scrieri partitionate, diferenta dintre multe fisiere mici si unul gigant si de ce Parquet e default-ul cu motiv.
-
Lecția 12
Local vs cluster: fluxul de dev care nu te minte
Cand modul local e suficient, cand ai nevoie de un cluster real si bug-urile care apar doar cand exista executori reali in peisaj.
-
Lecția 13
Schema: explicita vs dedusa
Cand sa lasi Spark sa deduca, cand sa o declari tu si de ce in productie codul aproape mereu o declara.
-
Lecția 14
Select si filter: cele doua operatii pe care le vei face de mii de ori
select, where, filter si cele patru moduri de a te referi la o coloana, inclusiv cel care se rupe cand ai spatii in numele coloanei.
-
Lecția 15
Adaugarea de coloane: withColumn, lit si capcana inlantuirii
Cum adaugi sau modifici coloane, de ce apelurile withColumn intr-un loop sunt o capcana de performanta cunoscuta si cand sa folosesti select in loc.
-
Lecția 16
Aggregations 101: groupBy, agg si catalogul functiilor de agregare
groupBy + agg, functiile de agregare de baza, agregari multi-coloana intr-o singura trecere si de ce agg este o transformare wide.
-
Lecția 17
Sortare la scara: orderBy, sort si costul unui sort global
Cum functioneaza sortarea intr-un engine distribuit, de ce un sort global e scump si portita sortWithinPartitions.
-
Lecția 18
Redenumire, drop, cast: operatorii uzuali de cleanup
withColumnRenamed, drop, cast si operatiile mici-dar-frecvente care formeaza jumatate din orice ETL real.
-
Lecția 19
Lazy evaluation: de ce nu se intampla nimic pana cand nu ceri
De ce lantul tau de transformari nu calculeaza efectiv cand il apelezi, ce inseamna cu adevarat 'lazy' in Spark si ajustarea de model mental Pandas pe care trebuie s-o faca orice nou-venit.
-
Lecția 20
Transformations vs actions: dihotomia si catalogul
Fiecare operatie PySpark e fie o transformation, fie o action. Sa stii care e care e jumatate din debugging.
-
Lecția 21
Narrow vs wide transformations: cel mai important concept din Spark
De ce unele transformari sunt aproape gratis si altele cer ca tot clusterul sa faca shuffle. Distinctia care explica fiecare intrebare de performanta din Spark.
-
Lecția 22
DAG-ul: cum isi organizeaza Spark job-ul in stages
Vizualizarea job-ului ca un graf orientat aciclic, citirea tab-ului Stages din Spark UI si relatia dintre stages si shuffles.
-
Lecția 23
Caching si persistence: storage levels, cand are sens fiecare
df.cache() si df.persist(), ce fac de fapt, storage levels-urile pe care le ofera Spark si pattern-urile tipice in care caching-ul da roade.
-
Lecția 24
.cache() nu e gratis — când să-l folosești, când e o capcană
Cache și persist din Spark sună ca niște butoane magice de performanță. Nu sunt. Iată când caching-ul chiar ajută, când face lucrurile mai rele și cum faci diferența.
-
Lecția 25
Ce este de fapt un shuffle, in termeni fizici
Operatia de retea din inima calculului distribuit, ce se intampla in timpul ei si de ce se teme toata lumea de ea.
-
Lecția 26
Join-uri in PySpark: cele sapte tipuri si cand sa folosesti fiecare
Inner, left, right, full outer, semi, anti, cross: ce face fiecare, sintaxa si cazurile de utilizare zilnice.
-
Lecția 27
Broadcast joins: cand tabelele mici calatoresc cu fiecare executor
Cum sar broadcast joins peste shuffle, cand le alege Spark automat si cum sa fortezi sau sa dezactivezi acest comportament.
-
Lecția 28
Problema skew-ului: cand o cheie are de 100 de ori mai multe randuri
Cum incetineste data skew job-urile chiar si cand munca totala e mica, cum sa o vezi in Spark UI si cum arata simptomele in productie.
-
Lecția 29
Salting: solutia standard cand o cheie domina
Cum spargi o cheie fierbinte adaugand un sufix random sintetic, exemplul lucrat si costul trucului.
-
Lecția 31
Ce este o partitie, fizic
Partitii in memorie, partitii pe disc si relatia dintre partitii si task-uri.
-
Lecția 32
spark.sql.shuffle.partitions = 200 si de ce e aproape mereu gresit
Cel mai consecvent default din Spark, de ce nu se potriveste cu cluster-ul tau si cum sa-l tunezi pentru job-ul curent.
-
Lecția 33
repartition vs coalesce: doua moduri de a schimba numarul de partitii
Cand sa folosesti pe care, costul fiecareia si capcana de a-ti serializa accidental jobul intr-un singur task.
-
Lecția 34
Scrieri partitionate: layout de directoare, predicate pushdown si cand sa o faci
Coloane de partitie in stil Hive pe disc, cum le foloseste Spark la read time pentru a sari peste fisiere si capcana cardinalitatii de evitat.
-
Lecția 35
Partiționarea: lucrul care îți omoară job-ul Spark pe tăcute
Cum se împart datele între executoare, de ce valoarea implicită e aproape mereu greșită și dansul repartition/coalesce de care fiecare job Spark are nevoie până la urmă.
-
Lecția 36
Bucketing: cand partitioning nu e suficient
Hash-partitioning intr-un numar fix de bucket-uri la write time, optimizarea de bucket join si de ce bucketing e subutilizat.
-
Lecția 37
PySpark SQL: cand SQL bate sintaxa DataFrame
Inregistrarea de temp views, apelarea spark.sql() si cazurile in care string-ul SQL e sincer mai curat decat lantul DataFrame.
-
Lecția 38
Window functions: ranking, lag/lead, totaluri cumulative
Window.partitionBy().orderBy(), familia de window functions si de ce sunt a doua cea mai utila unealta dupa groupBy.
-
Lecția 39
Pivot si unpivot: din wide in long si inapoi
Reformarea datelor cu pivot(), trucul pentru unpivot inainte de Spark 3.4 si costul tabelelor wide.
-
Lecția 40
UDF-uri: cand ai nevoie de ele, de ce ar trebui sa le eviti
Taxa de serializare Python a UDF-urilor obisnuite, de ce te salveaza pandas_udf si cazurile rare in care Scala e singurul raspuns.
-
Lecția 41
Catalyst: creierul din spatele fiecarui DataFrame
Cum transforma Spark codul tau intr-un query plan, cele patru faze de optimizare si cum sa citesti .explain(True).
-
Lecția 42
Tungsten: generare de cod si layout de memorie columnar
Cum fuzioneaza Spark operatiile in cod compilat, formatul columnar off-heap si de ce Spark cu DataFrame e rapid.
-
Lecția 43
Parquet: de ce e default-ul si pe buna dreptate
Stocarea pe coloane explicata, codecuri de compresie, predicate pushdown si structura row-group care face citirile selective rapide.
-
Lecția 44
ORC, Avro, Delta: alternativele si cand castiga fiecare
Trei familii de formate care nu sunt Parquet, cand este fiecare alegerea corecta si de ce Delta a tot preluat in liniste controlul.
-
Lecția 45
Citirea din JDBC: extragere din Postgres, MySQL, SQL Server
Conectorul de sursa JDBC, trucul partitionColumn si de ce o citire naiva iti omoara baza de date sursa.
-
Lecția 46
Scriere catre JDBC: paralelism, batch-uri, idempotenta
Cum scrii output-ul Spark inapoi intr-o baza de date relationala fara s-o doboari, sa rupi tranzactiile sau sa pierzi date la retry.
-
Lecția 47
Cloud storage: S3, GCS, Azure Blob, ce se schimba
Avertismentele despre consistenta, problema renumirii si de ce exista direct-write committers.
-
Lecția 48
Schema evolution: cand coloanele se schimba sub tine
De ce formatele schema-on-read gestioneaza prost schimbarea, de ce Avro+registry o gestioneaza bine si modul Delta/Iceberg de a le obtine pe ambele.
-
Lecția 49
De ce streaming si ce inseamna 'streaming' in Spark
Date marginite vs nemarginite, batch-vs-streaming ca un continuum si de ce DStreams sunt depreciate in favoarea Structured Streaming.
-
Lecția 50
Bazele Structured Streaming: readStream, writeStream, trigger-e
Punctele de intrare pentru streaming, semantica trigger-elor si checkpoint-ul de care depinde totul.
-
Lecția 51
Sursa Kafka: cea mai comuna ingerare in productie
Cum citeste Spark din Kafka, semantica offset-urilor si intrebarea at-least-once vs exactly-once.
-
Lecția 52
Watermarks si event time: partea pe care majoritatea incepatorilor o inteleg gresit
De ce event time conteaza mai mult decat processing time, ce face de fapt un watermark si exemplul lucrat cu timestamp-uri concrete.
-
Lecția 53
Operatii stateful: agregari, sesiuni si state store
Unde tine Spark Streaming state-ul intre micro-batch-uri, pattern-urile stateful standard si cand sa cobori la mapGroupsWithState.
-
Lecția 54
Output modes si sink-uri idempotente: foreachBatch si pattern-ul upsert
Append vs update vs complete, sink-urile pe care le aduce Spark si escape hatch-ul foreachBatch pentru tot restul.
-
Lecția 55
Spark UI: cea mai importanta unealta pe care o vei invata
Un tur ghidat al fiecarui tab, Jobs, Stages, Tasks, SQL, Storage, Executors, si ce iti spune fiecare cand ceva nu merge.
-
Lecția 56
Citirea execution plans: .explain(True), de la parsed la physical
Cum sa citesti fiecare linie din output-ul .explain(), operatorii care conteaza si pasii optimizatorului care ii produc.
-
Lecția 57
Memory tuning: executor memory, overhead, diagnosticare OOM
Cele patru config-uri care chiar conteaza, ce inseamna spill, cum sa citesti un stack trace OOM si regula pentru sizing-ul executorilor.
-
Lecția 58
Debugging la job-uri Spark lente: checklist-ul de 30 de minute
Bucla sistematica de a-ti da seama ce nu e in regula cu un job lent: citesti UI-ul, gasesti stage-ul lent, te uiti la skew, GC, volum de shuffle, in ordinea asta.
-
Lecția 59
Adaptive Query Execution: feature-ul killer din Spark 3.x
Coalescing dinamic al partitiilor, gestionarea skew-ului la runtime si comutarea strategiei de join: configurile de stiut si cazurile in care AQE tot nu te poate ajuta.
-
Lecția 60
Un health check de 30 de minute pe un cluster Spark pe care nu l-ai mai vazut
Checklist-ul capstone: ti se da laptopul, ai timp pana la ora 17 sa-ti dai seama ce e stricat.
