فصل نوزدهم این کتاب به معرفی ابزار Apache Spark می‌پردازد.

Apache Spark یک چارچوب محاسباتی خوشه‌ای برای پردازش داده در مقیاس بزرگ است. برخلاف بسیاری از چارچوب‌های پردازش دیگر که در این کتاب مورد بحث قرار گرفته است، Spark از MapReduce به عنوان موتور اجرا استفاده نمی‌کند. در عوض، برای اجرای کار روی یک خوشه از زمان اجرای توزیع شده خود استفاده می‌کند. با این حال همانطور که در این فصل خواهیم دید، Spark  از نظر API و زمان اجرا، با MapReduce موازی‌های زیادی دارد. Spark  به طوری با Hadoop یکپارچه شده است که می‌تواند YARN را اجرا کند و با فرمت‌های فایل Hadoop و پشتیبان‌های ذخیره‌سازی مانند HDFS کار کند.

Spark به دلیل توانایی نگهداری از مجموعه داده‌های کاری بزرگ در حافظه، بیشتر شناخته شده است.

نصب Spark

نسخه پایدار توزیع باینری Spark را می‌توان از اینجا دریافت کرد و یکی از مواردی را که با توزیع Hadoop مورد استفاده شما مطابقت دارد انتخاب نمود.

اپلیکیشن‌ها، jobها، مراحل و کارها:

Spark نیز مانندMapReduce ، مفهوم job را دارد. یک  job در Spark عمومی‌تر از یک job در MapReduce است.

 مراحل Spark به وظایف تقسیم می شوند و به طور موازی بر روی پارتیشن های RDD پخش شده در خوشه دقیقاً مانند وظایف MapReduce انجام می‌شوند.

یک job همیشه در چارچوب یک برنامه کاربردی ارائه شده توسط یک نمونه SparkContext برای گروه بندی RDDها و متغیرهای مشترک  اجرا می شود.

یک برنامه مستقل Scala

پس از کار با پوسته Spark برای بهسازی یک برنامه ، ممکن است بخواهید آن را به یک برنامه کاربردی خود بسته بندی کنید که می تواند بیش از یک بار اجرا شود.

مجموعه داده های توزیع شده انعطاف پذیر(Resilient Distributed Datasets RDD)

RDD ها در قلب هر برنامه Spark قرار دارند، بنابراین در این بخش با جزئیات بیشتری نحوه کار با آنها بررسی می‌شود.

ایجاد (Creation)

سه راه برای ایجاد RDD وجود دارد: از یک مجموعه حافظه در حافظه (معروف به موازی کردن یک مجموعه)، استفاده از یک مجموعه داده از حافظه خارجی مانند HDFS  یا تبدیل یک RDD موجود. روش اول برای انجام محاسبات با CPU فشرده بر روی مقادیر کمی از داده های ورودی به طور موازی مفید است.

جابجایی و اقدامات (Transformations and Actions)

Spark دو دسته عملیات را بر روی RDD ها ارائه می‌دهد: جابجایی و اقدامات. جابجایی، یک RDD جدید را از یک موجود ایجاد می‌کند، در حالی که یک اقدام باعث محاسبه در RDD می شود و کاری را با نتایج انجام می‌دهد یا آنها را به کاربر بازمی‌گرداند، یا آنها را در حافظه خارجی ذخیره می‌کند.

سریال سازی(Serialization)

در Spark دو جنبه سریال سازی وجود دارد که باید در نظر بگیریم: سریال سازی داده ها و سریال سازی توابع (یا بسته شدن).

متغیرهای مشترک (Shared Variables

برنامه‌های Spark اغلب نیاز به دسترسی به داده‌هایی دارند که جزئی از RDD نیستند.

متغیرهای پخش (Broadcast Variables)

یک متغیر پخش به صورت سریالیزه می‌شود و برای هر اجراکننده ارسال می‌شود، در آنجا ذخیره می‌شود تا کارهای بعدی بتوانند در صورت لزوم به آن دسترسی پیدا کنند. این برخلاف یک متغیر معمولی است که به عنوان بخشی از بسته شدن، سریالی سازی می‌شود‌، که در هر کار یک بار از طریق شبکه منتقل می‌شود. متغیرهای پخش نقش مشابهی با حافظه نهان توزیع شده در MapReduce دارند، اگرچه اجرا در Spark داده‌ها را در حافظه ذخیره می‌کند فقط در صورت خالی شدن حافظه به دیسک ریخته می‌شود.

جمع کننده‌ها (Accumulators)

جمع‌کننده متغیر اشتراکی است که وظایف فقط می‌توانند به آن اضافه شوند مانند پیشخوان‌ها در MapReduce. پس از اتمام کار، می‌توان مقدار نهایی جمع‌کننده را از برنامه درایور بازیابی کرد.

آناتومی یک اجرای کار Spark

در اینجا آنچه را که در انجام یک کار Spark اتفاق می‌افتد را بررسی می‌کنیم. در بالاترین سطح ، دو نهاد مستقل وجود دارد: درایور، که میزبان برنامه (SparkContext) است و وظایف مربوط به یک کار را برنامه‌ریزی می‌کند. و اجراکننده‌ها، که منحصر به برنامه هستند و مدت زمان اجرای برنامه را اجرا می‌کنند و وظایف برنامه را اجرا می کنند. معمولاً درایور به عنوان کلاینت اداره می شود که توسط مدیر خوشه و اجراکننده‌ها در ماشین های موجود در خوشه مدیریت نمی‌شود، اما همیشه اینگونه نیست.

 ارسال کار (Job Submission)

هنگامی که یک عمل (مانند شمارش ()) در RDD انجام می شود، کار Spark به طور خودکار ارسال می شود.

ساخت DAG

برای درک چگونگی تقسیم کار به مراحل، باید به نوع کارهایی بپردازیم که می‌توانند در یک مرحله اجرا شوند. دو نوع وجود دارد: تغییر وظایف نقشه‌ها و وظایف نتیجه‌گیری.

زمانبندی وظیفه (Task Scheduling)

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

اجرای وظیفه (Task Execution)

اجراکننده وظیفه را در 7 مرحله انجام می‌دهد.

اجراکننده‌ها و مدیران خوشه

دیدیم که چگونه Spark برای اجرای وظایف Spark به اجراکننده‌ها متکی است، چگونگی شروع اجراکننده‌ها توضیح داده شد. مدیریت چرخه عمر مدیران به عهده مدیر خوشه است و Spark انواع مختلفی از مدیران خوشه را با مشخصات مختلف ارائه می‌دهد:

  • Local
  • Standalone
  • Mesos
  • YARN

 Spark در YARN

اجرای Spark در YARN محکم ترین ادغام را با سایر اجزای Hadoop فراهم می کند و راحت ترین راه برای استفاده از Spark در هنگام داشتن خوشه Hadoop موجود است. Spark دو حالت استقرار را برای اجرا در YARN فراهم می‌کند: حالت YARN کلاینت، جایی که درایور در کلاینت قرار می‌گیرد و حالت خوشه YARN، که در آن درایور روی خوشه در برنامه مستر YARN اجرا می شود.

مطالعه بیشتر

این فصل فقط اصول اولیه Spark را در بر می‌گرفت. برای اطلاعات بیشتر به Learning Spark by Holden Karau ، Andy Konwinski ، Patrick Wendell و Matei Zaharia مراجعه کنید (O'Reilly، 2014). وب سایت Apache Spark همچنین دارای اسناد به روز در مورد آخرین نسخه Spark است.