مرا به خاطر بسپار

Apache Spark چیست؟

بازدید: 155 آخرین به‌روزرسانی: 27 مرداد 1405

مقدمه

تصور کنید باید ترابایت‌ها داده — مثلاً گزارش تراکنش‌های میلیون‌ها کاربر یا داده‌های حسگرهای یک شهر هوشمند — را در چند دقیقه تحلیل کنید. یک کامپیوتر معمولی از پس چنین حجمی برنمی‌آید و پردازش سنتی ساعت‌ها یا روزها طول می‌کشد. راه‌حل، تقسیم داده و پردازش هم‌زمان آن روی ده‌ها یا صدها ماشین است؛ و پرکاربردترین ابزار برای این کار، Apache Spark نام دارد.

در این مقاله به زبان ساده توضیح می‌دهیم که Apache Spark چیست، چرا این‌قدر سریع است، از چه اجزایی تشکیل شده و چگونه می‌توانید اولین برنامه‌ پردازش داده‌ی خود را با آن بنویسید.

Apache Spark چیست؟

Apache Spark یک موتور تحلیل و پردازش متن‌باز و یکپارچه برای پردازش داده‌های حجیم در مقیاس بزرگ است. Spark به‌جای آنکه داده‌ها را روی یک ماشین پردازش کند، آن‌ها را میان مجموعه‌ای از ماشین‌ها (یک خوشه) توزیع می‌کند و محاسبات را به‌صورت موازی و هم‌زمان انجام می‌دهد.

این پروژه که ابتدا در دانشگاه برکلی توسعه یافت، امروزه به یکی از محبوب‌ترین ابزارهای اکوسیستم; کلان داده (مطالعه بیشتر) تبدیل شده است. Spark از زبان‌های متعددی مانند Python (با کتابخانه‌ی PySpark)، Scala، Java و R پشتیبانی می‌کند و می‌تواند طیف گسترده‌ای از کارها، از پردازش دسته‌ای (مطالعه بیشتر) و جریانی (مطالعه بیشتر) گرفته تا یادگیری ماشین و پرس‌وجوهای SQL، را انجام دهد.

چرا Spark سریع است و تفاوت آن با Hadoop MapReduce چیست؟

نسل قبلی ابزارهای پردازش کلان داده، یعنی Hadoop MapReduce، در هر مرحله از پردازش نتایج میانی را روی دیسک می‌نوشت و دوباره می‌خواند. این خواندن و نوشتن مکرر روی دیسک بسیار کند بود. راز سرعت Spark در این است که داده‌ها را تا حد امکان در «حافظه‌ی اصلی» (RAM) نگه می‌دارد و از نوشتن‌های غیرضروری روی دیسک پرهیز می‌کند؛ به همین دلیل می‌تواند تا ده‌ها برابر سریع‌تر از MapReduce عمل کند.

 

مهم‌ترین تفاوت‌ها و مزایای Spark عبارت‌اند از:
  • پردازش درون‌حافظه‌ای: نگه‌داشتن داده در RAM (مطالعه بیشتر) به‌جای دیسک، که سرعت را چشمگیر افزایش می‌دهد.

  • یکپارچگی: یک موتور واحد برای پردازش دسته‌ای، جریانی، SQL و یادگیری ماشین، به‌جای ابزارهای جداگانه.

  • سهولت استفاده: واسط‌های ساده در پایتون و SQL که کار با آن را بسیار آسان‌تر از MapReduce می‌کند.

  • تحمل خطا: در صورت از کار افتادن یک ماشین، Spark می‌تواند محاسبات ازدست‌رفته را به‌طور خودکار بازسازی کند.

معماری و اجزای اصلی Spark

یک برنامه‌ی Spark روی یک معماری «اصلی-کارگر» (Master-Worker) اجرا می‌شود که از این اجزا تشکیل شده است:
  • هماهنگ‌کننده (Driver): برنامه‌ی اصلی که منطق کار را تعریف می‌کند، آن را به وظایف کوچک‌تر تقسیم می‌کند و اجرای آن‌ها را هماهنگ می‌کند.
  • مدیر خوشه (Cluster Manager): منابع کلاستر را مدیریت می‌کند و می‌تواند یکی از گزینه‌هایی مانند Standalone، YARN، Mesos یا Kubernetes باشد.
  • اجرا کنندگان (Executors): پردازه‌هایی روی گره‌های کارگر که وظایف واقعی را اجرا می‌کنند و نتایج را نگه می‌دارند.

مفهوم بنیادین داده در Spark، ساختاری به نام RDD (مجموعه‌داده‌ی توزیع‌شده‌ی تاب‌آور) و لایه‌های سطح‌بالاتر آن یعنی DataFrame و Dataset است. این ساختارها داده را به‌صورت توزیع‌شده روی کلاستر نگه می‌دارند و امکان پردازش موازی و تاب‌آور در برابر خطا را فراهم می‌کنند.


نکته‌ مهم دیگر «ارزیابی تنبل» (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 موتور پردازش است و اغلب در کنار اجزای Hadoop مانند سیستم فایل توزیع‌شده (HDFS) و مدیر منابع YARN استفاده می‌شود؛ اما جایگزین بخش پردازشی Hadoop یعنی MapReduce شده است.
  • برای یادگیری Spark چه زبانی بهتر است؟
پایتون (با PySpark) به دلیل سادگی محبوب‌ترین انتخاب است، اما Scala نیز چون Spark با آن نوشته شده کارایی بالایی دارد.
  • RDD و DataFrame چه تفاوتی دارند؟
RDD ساختار پایه و سطح‌پایین Spark است، در حالی که DataFrame لایه‌ای سطح‌بالاتر، بهینه‌تر و شبیه به جدول است که کار با داده‌های ساختاریافته را ساده‌تر می‌کند.
  • آیا برای شروع حتماً به کلاستر نیاز دارم؟
خیر، Spark را می‌توان در حالت محلی (local mode) روی یک کامپیوتر برای یادگیری و آزمایش اجرا کرد؛ برای داده‌های واقعاً حجیم به کلاستر نیاز پیدا می‌کنید.
 
تا چه حد این مطلب برای شما مفید بود؟
بر اساس رای 0 نفر

اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.

ثبت نظر

نظر دادن