مقدمه
تصور کنید باید ترابایتها داده — مثلاً گزارش تراکنشهای میلیونها کاربر یا دادههای حسگرهای یک شهر هوشمند — را در چند دقیقه تحلیل کنید. یک کامپیوتر معمولی از پس چنین حجمی برنمیآید و پردازش سنتی ساعتها یا روزها طول میکشد. راهحل، تقسیم داده و پردازش همزمان آن روی دهها یا صدها ماشین است؛ و پرکاربردترین ابزار برای این کار، Apache Spark نام دارد.
در این مقاله به زبان ساده توضیح میدهیم که Apache Spark چیست، چرا اینقدر سریع است، از چه اجزایی تشکیل شده و چگونه میتوانید اولین برنامه پردازش دادهی خود را با آن بنویسید.
Apache Spark چیست؟
چرا Spark سریع است و تفاوت آن با Hadoop MapReduce چیست؟
نسل قبلی ابزارهای پردازش کلان داده، یعنی Hadoop MapReduce، در هر مرحله از پردازش نتایج میانی را روی دیسک مینوشت و دوباره میخواند. این خواندن و نوشتن مکرر روی دیسک بسیار کند بود. راز سرعت Spark در این است که دادهها را تا حد امکان در «حافظهی اصلی» (RAM) نگه میدارد و از نوشتنهای غیرضروری روی دیسک پرهیز میکند؛ به همین دلیل میتواند تا دهها برابر سریعتر از MapReduce عمل کند.
-
پردازش درونحافظهای: نگهداشتن داده در RAM (مطالعه بیشتر) بهجای دیسک، که سرعت را چشمگیر افزایش میدهد.
-
یکپارچگی: یک موتور واحد برای پردازش دستهای، جریانی، SQL و یادگیری ماشین، بهجای ابزارهای جداگانه.
-
سهولت استفاده: واسطهای ساده در پایتون و SQL که کار با آن را بسیار آسانتر از MapReduce میکند.
-
تحمل خطا: در صورت از کار افتادن یک ماشین، Spark میتواند محاسبات ازدسترفته را بهطور خودکار بازسازی کند.
معماری و اجزای اصلی Spark
- هماهنگکننده (Driver): برنامهی اصلی که منطق کار را تعریف میکند، آن را به وظایف کوچکتر تقسیم میکند و اجرای آنها را هماهنگ میکند.
- مدیر خوشه (Cluster Manager): منابع کلاستر را مدیریت میکند و میتواند یکی از گزینههایی مانند Standalone، YARN، Mesos یا Kubernetes باشد.
- اجرا کنندگان (Executors): پردازههایی روی گرههای کارگر که وظایف واقعی را اجرا میکنند و نتایج را نگه میدارند.
نکته مهم دیگر «ارزیابی تنبل» (Lazy Evaluation) است: Spark محاسبات را تا زمانی که واقعاً به نتیجه نیاز نباشد به تعویق میاندازد و سپس بهینهترین مسیر اجرا را انتخاب میکند.
نوشتن اولین برنامه Spark
سادهترین راه برای شروع، استفاده از PySpark (واسط پایتون Spark) است. مثال کلاسیک «شمارش کلمات» را ببینیم؛ برنامهای که تعداد تکرار هر کلمه را در یک فایل متنی میشمارد:
from pyspark.sql import SparkSession
# ساخت یک نشست Spark
spark = SparkSession.builder \
.appName("WordCount").getOrCreate()
# خواندن فایل متنی به صورت توزیع شده
text = spark.read.text("data.txt").rdd \
.flatMap(lambda row: row[0].split(" "))
# شمارش هر کلمه به صورت موازی
counts = text.map(lambda w: (w, 1)) \
.reduceByKey(lambda a, b: a + b)
counts.saveAsTextFile("output")
spark.stop()
در این برنامه، Spark فایل را به قطعات کوچک تقسیم میکند، عملیات جداسازی کلمات و شمارش را روی همهی گرهها بهصورت موازی انجام میدهد و در پایان نتیجهی نهایی را جمع میکند. برای اجرای این برنامه از دستور spark-submit استفاده میشود:
spark-submit wordcount.pyاجرای Spark روی کلاستر و ابر سیمرغ
قدرت واقعی Spark زمانی آشکار میشود که روی یک کلاستر با چندین گره اجرا شود. در محیطهای محاسبات با کارایی بالا، میتوان Spark را با استفاده از زمانبند بار کاری مانند SLURM (مطالعه بیشتر) روی چند گره راهاندازی کرد؛ به این صورت که چند گره از طریق SLURM رزرو میشوند و یک کلاستر Spark موقت روی آنها برپا میگردد. نمونهی سادهی درخواست منابع برای این کار:
#!/bin/bash
#SBATCH --job-name=spark_job
#SBATCH --nodes=4
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=8
#SBATCH --time=01:00:00
# راهاندازی کلاستر Spark و اجرای برنامه
spark-submit --master spark://$MASTER:7077 wordcount.pyابر سیمرغ با فراهمکردن گرههای پرتعداد و حافظهی بالا، بستر ایدهآلی برای اجرای بارهای کاری Spark است. میتوانید ابر پردازشی موردنیاز خود را از ابرسیمرغ تهیه کنید، یک کلاستر Spark روی آن بسازید و تحلیل دادههای حجیم را با سرعت بالا و بدون نیاز به زیرساخت فیزیکی گرانقیمت انجام دهید. برای آشنایی بیشتر به وبسایت ابرسیمرغ مراجعه کنید.
جمعبندی
Apache Spark به لطف پردازش درون حافظهای و معماری توزیعشده، به استاندارد عملی پردازش کلان داده تبدیل شده است. با درک مفاهیم پایهای مانند RDD و DataFrame، معماری Driver-Executor و ارزیابی تنبل، میتوانید تحلیل دادههایی را که پیشتر غیرممکن به نظر میرسید، در مقیاس بزرگ و با سرعت بالا انجام دهید.
در مقالههای بعدی به موضوعاتی مانند Spark SQL و کار با DataFrameها، پردازش جریانی با Spark Streaming و یادگیری ماشین با کتابخانهی MLlib خواهیم پرداخت.
سوالات متداول
-
آیا Spark جایگزین Hadoop است؟
- برای یادگیری Spark چه زبانی بهتر است؟
- RDD و DataFrame چه تفاوتی دارند؟
- آیا برای شروع حتماً به کلاستر نیاز دارم؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
ثبت نظر