Last chance! 50% off DataCamp Premium
Sale ends in
Apache Spark is een uniforme analytics-engine voor grootschalige data engineering, data science en machine learning. Je kunt het gebruiken met Python, SQL, R, Java of Scala. Spark werd oorspronkelijk gestart aan de University of California, Berkeley, in 2009 en is in 2013 geschonken aan de Apache Software Foundation. Het is nu “de meest gebruikte engine voor schaalbare computing,” met duizenden vacatures waarin de technologie wordt gebruikt. Omdat het zo’n waardevolle skill is in de data-engineeringwereld, vind je hier sollicitatievragen die je helpen bij je zoektocht naar een baan of naar talent met Spark-ervaring. De code-antwoorden worden in Python gegeven.
Deze vragen behandelen enkele fundamenten van Spark en zijn geschikt voor wie er slechts basiservaring mee heeft. Als je een opfrisser nodig hebt, is onze cursus Inleiding tot Spark SQL in Python de ideale plek om te beginnen.
Deze vraag toetst de algemene kennis van de kandidaat over Apache Spark en de rol ervan in het big-data-ecosysteem.
Antwoord:
Apache Spark is een open-source, gedistribueerd computingsysteem dat een interface biedt om complete clusters te programmeren met impliciete dataparalleliteit en fouttolerantie. Het wordt gebruikt voor grootschalige dataverwerking vanwege de snelheid en het gebruiksgemak vergeleken met traditioneel MapReduce.
Belangrijkste kenmerken:
Deze vraag test je op de fundamentele concepten van Apache Spark. Zorg dat je een van de cruciale componenten begrijpt die Spark zo krachtig maken.
Resilient Distributed Datasets (RDD’s) zijn de fundamentele bouwstenen van Apache Spark. Ze vertegenwoordigen een onveranderlijke, gedistribueerde verzameling objecten waarop parallelle bewerkingen kunnen worden uitgevoerd in een cluster. Hier volgt een uitleg van de belangrijkste kenmerken en concepten van RDD’s:
YARN is een gedistribueerde container-manager die resources in Hadoop beheert. Spark kan YARN gebruiken wanneer het draait op Hadoop-clusters voor effectiever en efficiënter resourcemanagement. Een van de cruciale componenten van YARN is het efficiënt toewijzen van resources in het cluster, het efficiënt plannen van jobs en fouttolerantie bij node-uitval. Het is een van de vele componenten die Spark tot een krachtig hulpmiddel maken.
Deze vraag laat zien of je verschillende soorten transformaties in Spark RDD’s (Resilient Distributed Datasets) begrijpt.
Antwoord:
.map(): Zet elk element van de RDD om in precies één nieuw element. Het resultaat is een RDD met hetzelfde aantal elementen als de invoer-RDD..flatMap(): Zet elk element van de RDD om in nul of meer nieuwe elementen. Het resultaat is een RDD met mogelijk een ander aantal elementen dan de invoer-RDD.# Example of map
rdd = spark.sparkContext.parallelize([1, 2, 3])
mapped_rdd = rdd.map(lambda x: x * 2)
print(mapped_rdd.collect()) # Output: [2, 4, 6]
# Example of flatMap
flat_mapped_rdd = rdd.flatMap(lambda x: [x, x * 2])
print(flat_mapped_rdd.collect()) # Output: [1, 2, 2, 4, 3, 6]
Deze code laat het verschil zien tussen map en flatMap door een RDD van gehele getallen te transformeren.
Deze vraag controleert of de kandidaat Spark SQL kan gebruiken voor query’s, wat essentieel is voor data-analyse.
Antwoord:
# Register the DataFrame as a SQL temporary view
df.createOrReplaceTempView("table")
# Execute SQL query
result = spark.sql("SELECT column1, SUM(column2) FROM table GROUP BY column1")
# Show the results
result.show()
Dit fragment laat zien hoe je een tijdelijke view van een DataFrame maakt en Spark SQL gebruikt om een group-by-query uit te voeren.
Voor wie de basis beheerst en die in de praktijk heeft toegepast, komen deze vragen vaker voor:
Deze vraag toetst het begrip van een van Sparks kernprincipes, cruciaal voor prestatie-optimalisatie.
Antwoord:
Luie evaluatie betekent dat Spark transformaties niet direct uitvoert wanneer ze worden aangeroepen. In plaats daarvan bouwt het een logisch uitvoeringsplan. De transformaties worden pas uitgevoerd wanneer een actie (zoals collect of count) wordt aangeroepen, die de daadwerkelijke berekening triggert.
Luie evaluatie is belangrijk om twee redenen:
Deze vraag toetst kennis van datapersistentie in Spark, belangrijk voor performance tuning en iteratieve algoritmen.
Antwoord:
Data kan in Spark worden gepersisteerd met de methoden .persist() of .cache(). .cache() is een verkorte vorm van .persist() met het standaardopslagniveau.
Opslagniveaus:
rdd = spark.sparkContext.parallelize([1, 2, 3, 4, 5])
rdd.persist(storageLevel=StorageLevel.MEMORY_AND_DISK)
Deze vraag beoordeelt het begrip van datascheefheid en hoe je die beheert, cruciaal voor efficiënte dataverwerking.
Antwoord:
Datascheefheid ontstaat wanneer sommige partitions aanzienlijk meer data bevatten dan andere, wat prestatieknelpunten veroorzaakt. Strategieën om hiermee om te gaan zijn onder meer:
from pyspark.sql.functions import monotonically_increasing_id, col
# Example of salting
df = df.withColumn("salt", monotonically_increasing_id() % 10)
df = df.withColumn("new_key", col("original_key") + col("salt"))
Deze vraag test het begrip van Sparks uitvoeringsmodel en de impact van verschillende transformatietypen op prestaties.
Antwoord:
.map(), .filter() en .union(). Ze zijn meestal sneller omdat er geen data-shuffle nodig is..groupByKey(), .reduceByKey() en .join(). Ze vereisen data-shuffling over het netwerk, wat tijdrovend kan zijn.# Narrow transformation example
rdd1 = rdd.map(lambda x: x * 2)
# Wide transformation example
rdd2 = rdd.groupByKey()
Spark blinkt uit in het streamen van realtime data uit bronnen zoals Apache Kafka of Amazon Kinesis omdat het schaalbaar en fouttolerant is. Dit gebeurt via de uitbreiding Spark Streaming. Het werkt met externe databronnen via input DStreams, die een continue datastroom vanuit deze bronnen vertegenwoordigen.
Spark Streaming waarborgt fouttolerantie en dataconsistentie via technieken zoals checkpointing en write-ahead logs. Checkpointing slaat periodiek de status van de streamingapplicatie op duurzame opslag (bijv. HDFS) op om te herstellen na fouten, terwijl write-ahead logs fouttolerantie bieden voor data die uit externe bronnen wordt ontvangen.
Deze vragen zijn voor gebruikers met meer hands-on-ervaring met Spark, vooral met meer geavanceerde onderwerpen. Heb je een opfrisser nodig, bekijk dan onze Spark Machine Learning-tutorial.
Deze vraag test het begrip van de omgeving van Spark en de MLlib-bibliotheek.
Sparks MLlib-bibliotheek biedt een rijke set hulpmiddelen en algoritmen voor machinelearning-taken op schaal. Voor feature engineering en preprocessing van grootschalige datasets biedt MLlib diverse geavanceerde technieken en optimalisaties:
Dit test of gebruikers de onderliggende functionaliteit van Spark-gebaseerde systemen begrijpen en hoe Spark samenwerkt met HDFS en Apache Cassandra. Het is belangrijk om te begrijpen hoe je data via code ophaalt en hoe die data door het systeem beweegt.
Broadcast-variabelen in Spark zijn read-only variabelen die worden gecachet en beschikbaar worden gemaakt op alle workernodes in een gedistribueerde Spark-applicatie. Ze worden gebruikt om grote, read-only datasets of waarden efficiënt te distribueren naar workernodes, waardoor de netwerkoverhead afneemt en de taakprestaties verbeteren.
Broadcast-variabelen worden geserialiseerd en slechts één keer naar elke workernode verzonden, waar ze in het geheugen worden gecachet en hergebruikt over meerdere taken. Dit voorkomt dat de variabele bij elke taak meegezonden moet worden, wat datatransfer-overhead vermindert, vooral bij grote datasets.
Deze vraag beoordeelt het vermogen van de kandidaat om Spark-jobs te optimaliseren, een kernvaardigheid om prestaties en efficiëntie te verbeteren. Via Spark performance tuning kunnen we Sparks gedistribueerde framework benutten met partitioning en coalescing, die de werkverdeling over het cluster sturen om bewerkingen sneller uit te voeren.
Antwoord:
.repartition() om het aantal te verhogen of gelijkmatiger te verdelen. Dit is rekenintensiever en moet je alleen gebruiken wanneer je de data gelijkmatig wilt verdelen voor gebalanceerde verwerking..coalesce().# Increasing partitions (full shuffle)
df_repartitioned = df.repartition(10)
# Reducing partitions (no full shuffle)
df_coalesced = df.coalesce(2)
Let op: een vervolgvraag kan gaan over wanneer deze bewerkingen het meest nuttig zijn. Noem dan dat ze vooral effect hebben bij grote datasets en dat je rekenkracht niet moet verspillen aan kleine datasets.
Dataprofessionals werken met een breed scala aan dataformaten. Elk heeft eigen trade-offs. Zorg dat je kunt uitleggen hoe Spark met deze formaten omgaat en geef overwegingen op hoog niveau voor prestaties en voor het bredere ecosysteem.
Deze codeervragen richten zich op het gebruik van PySpark om met een Spark-omgeving te werken.
Deze vraag controleert je vaardigheid om met Spark te werken en het gebruik van mapping in Spark te begrijpen.
from pyspark import SparkContext
# create your spark context
sc = SparkContext("local", "WordCount")
# import a text file from a local path
lines = sc.textFile("path/to/your/text/file.txt")
# split and map the words
# then reduce by using the words as keys and add to the count
word_counts = lines.flatMap(lambda line: line.split(" ")) \
.map(lambda word: (word, 1)) \
.reduceByKey(lambda a, b: a + b)
# order the words and take only the top N frequent words
top_n_words = word_counts.takeOrdered(N, key=lambda x: -x[1])
print(top_n_words)
Deze vraag is een goede manier om te laten zien of iemand weet hoe hij een eenvoudige RDD maakt en ermee werkt. Het gemiddelde van waarden zoeken is een veelvoorkomende taak voor dataprofessionals en het is belangrijk dat je begrijpt hoe je data binnen een Spark-context vormgeeft.
from pyspark import SparkContext
# Create sparkContext and name it “Average”
sc = SparkContext("local", "Average")
# Generate Spark RDD
data = sc.parallelize([1, 2, 3, 4, 5])
# Sum the RDD, count the number of values in RDD
total_sum = data.sum()
count = data.count()
# divide sum by count to get average
average = total_sum / count
print("Average:", average)
Het uitvoeren van datamanipulatie- en transformatietaken zoals joins is een kernonderdeel van SparkSQL. Hiermee kan data uit verschillende bronnen worden gecombineerd voor analyse.
from pyspark import SparkContext
# Create SparkContext
sc = SparkContext("local", "LeftOuterJoin")
# Create two RDDs with tuples sharing keys
rdd1 = sc.parallelize([(1, 'a'), (2, 'b'), (3, 'c')])
rdd2 = sc.parallelize([(1, 'x'), (2, 'y')])
# Use the .leftOuterJoin() method to join the first rdd to the second rdd
joined_rdd = rdd1.leftOuterJoin(rdd2)
# Use the .collect() method to show the rdd
print(joined_rdd.collect())
Dit test je vermogen om data uit externe bronnen binnen te halen en je begrip van hoe Spark met externe bronnen verbindt. Richt je hier op de algemene concepten, zoals de noodzaak om extensies/utilities te importeren voor een bepaalde datastroom, in plaats van exacte code te memoriseren. Merk op dat we voor de SparkContext een appname (KafkaWordCount) als optionele parameter hebben gekozen; het is handig voor duidelijkheid in processen.
# Import the sparkcontext, additionally import streaming context and Kafka
from pyspark import SparkContext
from pyspark.streaming import StreamingContext
from pyspark.streaming.kafka import KafkaUtils
# Create context
sc = SparkContext("local", "KafkaWordCount")
# Use streaming context to bring in data at 10 second intervals
ssc = StreamingContext(sc, 10) # 10-second batch interval
# Use Kafka param dictionary in order to connect to the stream using the streaming context, the topic of interest, and the parameters
kafka_params = {"metadata.broker.list": "broker1:9092,broker2:9092"}
kafka_stream = KafkaUtils.createDirectStream(ssc, ["topic"], kafka_params)
# save the results of this stream to lines
# perform MapReduce in order to generate dictionary and count by keys
lines = kafka_stream.map(lambda x: x[1])
word_counts = lines.flatMap(lambda line: line.split(" ")) \
.map(lambda word: (word, 1)) \
.reduceByKey(lambda a, b: a + b)
# save to external file
word_counts.saveAsTextFiles("hdfs://path/to/save")
# start context until you terminate
ssc.start()
ssc.awaitTermination()
Deze vraag beoordeelt het begrip van DataFrame-bewerkingen in Spark.
Transformaties zijn bewerkingen op DataFrames die een nieuw DataFrame teruggeven, zoals select, filter en groupBy. Acties zijn bewerkingen die de berekening triggeren en resultaten teruggeven, zoals show, count en collect.
Dit fragment laat zien hoe je kolommen selecteert, rijen filtert en een group-by-aggregatie uitvoert.
# Select specific columns
selected_df = df.select("column1", "column2")
# Filter rows based on a condition
filtered_df = df.filter(df["column1"] > 100)
# Group by a column and perform aggregation
grouped_df = df.groupBy("column2").agg({"column1": "sum"})
# Show the results
selected_df.show()
filtered_df.show()
grouped_df.show()
Het beheersen van deze sollicitatievragen is een goede eerste stap richting een carrière als dataprofessional. Spark is een veelgebruikte infrastructuur bij organisaties om hun big-datapijplijnen te beheren. Inzicht in de voordelen en uitdagingen van Spark helpt je opvallen als een kundige dataprofessional. Dit is nog maar het begin! Praktische ervaring met Spark is de beste manier om te leren.
Je kunt aan de slag met de volgende PySpark-cursussen en -tutorials op DataCamp:
Bekijk de DataCamp-cursussen zoals Introduction to PySpark, Introduction to Spark SQL in Python en Big Data with PySpark om te beginnen.
Spark wordt gebruikt voor ETL-pijplijnen, data-exploratie, realtime analytics, machine learning en datawarehousing. Kennis van Spark opent deuren in veel sectoren.
Spark houdt resultaten zoveel mogelijk in het geheugen, terwijl MapReduce tussentijdse resultaten naar schijf schrijft. Spark kan echter Hadoop-infrastructuur zoals YARN gebruiken voor resourcemanagement, dus ze werken vaak samen.
Ja. Spark is ontworpen om te schalen op basis van dataverwerkingsbehoeften. Bepaalde Spark-functionaliteit die gericht is op prestatie-optimalisatie kan rekenkracht verspillen bij kleinere datasets, dus mogelijk moet je je pijplijnen daarop aanpassen.
Ja. Spark is te gebruiken in Scala, Java, R en SQL.
Ik ben een data scientist met ervaring in ruimtelijke analyse, machine learning en datapijplijnen. Ik heb gewerkt met GCP, Hadoop, Hive, Snowflake, Airflow en andere data science- en engineeringprocessen.
Leer Spark met DataCamp
Cursus
Cursus
Cursus

blog
Adel Nehme
15 min