یک مدل برنامه نویسی یک سبک اساسی و رابط هایی است که توسعه دهندگان می توانند برنامه های محاسباتی را بنویسند. در برنامه نویسی کلان داده ها، کاربران بر روی نوشتن برنامه های موازی داده محور تمرکز دارند که می توانند در محیط های بزرگ و توزیع شده اجرا شوند. انواع مدل های برنامه نویسی متنوعی برای داده های بزرگ با تمرکز و مزایای مختلف ارائه شده است که در زیر فهرست برخی از آنها نشان داده شده است.

  • برنامه نویسی نگاشت کاهش یا MapReduce
  • برنامه نویسی تابعی یا Functional Programming
  • برنامه نویسی بر پایه SQL
  • برنامه نویسی بر پایه عامل یا Actor Based Programming
  •  برنامه نویسی آماری و تحلیلی با زبانی مانند R

برنامه نویسی نگاشت کاهش

برنامه نویسی نگاشت کاهش (MapReduce) چارچوب و شیوه کنونی و شناخته شده برای نوشتن برنامه های موازی محور داده ها (Data Centric Parallel Application) در زمینه های صنعتی و کاری و دانشگاهی است. نگاشت کاهش از دو بخش ۱) نگاشت (Map) و ۲) کاهش (Reduce) است که از شیوه تقسیم و غلبه (Divide and Conquer) در الگوریتم موازی بهره می برد.

در اکوسیستم کلان داده ها، MapReduce مدل برنامه نویسی است که درون هدوپ (Hadoop) تعبیه شده است تا بتوان برنامه نویسی موازی داده محور را انجام داد. در یک سناریوی ساده، یک کلاستر هدوپ با ۲۰۰۰۰ گره (سرور) داریک که بر روی هر یک ۲۵۶ مگابایت بلاک داده نگهداری می شود. بنابراین با داشتن محیط توزیع شدگی به کمک کلاستر هدوپ و انجام برنامه نویسی موازی نگاشت کاهش، می توانیم یکباره ۵۱۲۰۰۰۰ مگابایت یا ۵ ترابایت را پردازش کنیم. آیا این با یک رایانه و برنامه نویسی رویه ای غیر موازی انجام شدنی است؟؟

تابع های درون نگاشت کاهش

چارچوب نگاشت کاهش از دو تابع یا وظیفه به نام Map و Reduce ساخته شده است که هر یک از آنها در یک توالی، پس از دیگری انجام می شود. در آغاز گام نگاشت و سپس گام کاهش انجام می شود. هر یک از این گام ها به گونه یک تابع برنامه نویسی بر روی هر یک از گره (سرورهای)کلاستر هدوپ به موازت یکدیگر انجام می شوند. یک کلاستر هدوپ، دارای چندین سرور است که روی هر یک، سیستم فایل توزیع شده هدوپ (Hadoop Distributed File System یا HDFS) و چارچوب MapReduce انجام می شود.

  • تابع Map داده ها را از دیسک (سیستم فایل HDFS) به گونه دوتایی های Key-Value دریافت کرده و سپس آنها را پردازش می کند و در پایان یک مجموعه دوتایی های Key-Vlaue تازه و میانی را می سازد. توجه کنید بر پایه شکل بالا هر تابع Map روی یکی از سرورهای کلاستر هدوپ انجام می شود.
  • تابع Reduce دوتایی های ساخته شده از Map را دریافت و بازهم روی آنها پردازشی انجام داده و در پایان این بار پاسخ های پایانی ره به گونه دوتایی هایی می سازد.

ورودی ها و خروجی ها، هر دو بر روی سیستم فایل توزیع شده هدوپ یا به گونه فایل های متنی یا درون پایگاه داده های با مدل NoSQL نگهداری می شوند. داده ها ورودی به زیر مجموعه هایی شکسته و تحویل تابع های Map داده می شوند و سپس خود آنها دوتایی هایی را می سازند که به تابع های Reduce فرستاده می شوند. سپس تابع های Reduce پاسخ های پیشین را با یکدیگر بر سر کلیدهای یکسان، تجمیع کرده و پاسخ نهایی را می سازند.

در شکل زیر در آغاز مجموعه داده سادی (سبز رنگ) داریم و می خواهیم شمار هر یک از داده ها را در پایان داشته باشیم، یعنی چند تا A و B و به همین گونه دیگر داده ها. در گام نخست مجموعه داده بر روی گره های کلاستر به تابع های Map سپرده می شود و سپس هر یک شمار داده های خودش را می شمارد و دوتایی های داده و شمار را برگشت می دهد. سپس این دوتایی ها تحویل تابع های Reduce  شده تا هر یک پاسخی را مبنی بر شمار هر یک از داده ها را پردازش کرده و پاسخ نهایی، شمار تک تک داده ها برگشت دهد.

گام های نگاشت کاهش

  • Split و Map: داده ها به تکه های کوچکتر شکسته شده و هر تکه به یکی از تابع های Map بر روی هر یک از گره های کلاستر داده می شود.
  • Combine و Partition: این دو گام های میان Map و Reduce هستند.
  • Combine: یک فرایند اختیاری و كاهش دهنده ای است كه بطور جداگانه در هر سرور نگاشت دهنده (Mapper) اجرا می شود. Combine، داده ها را بر روی هر سرور نگاشت دهنده، برای سادگی بیشتر، کاهش می دهد.
  • Partition: فرایندی است که دوتایی های Key-Value ساخته شده از نگاشت دهنده را برای واگذاری به کاهش دهنده (Reducer) تبدیل به دوتایی مناسب می کند.

بنابراین پیش از فرستادن دوتایی بدست آمده از نگاشت دهنده به کاهش دهنده، باید آنها بهم آمیخته (Shuffle) مرتب (Sort) شوند. توجه کنید هیچ گاه تا به پایان رسیدن نگاشت دهنده ها (Mapper)، هیچ کاهش دهنده ای (Reducer) انجام نمی شود. همچنین خروجی های نگاشت دهنده که دارای مقدارهای یکسان هستند به هر نگاشت دهنده انتساب داده می شود و سپس هر نگاشت دهنده پاسخی برای همان داده خودش پیدا می کند.

ویژگی های چارچوب نگاشت کاهش

یک برنامه MapReduce شامل یک تابع نگاشت است که تبدیل های موازی به دوتایی های کلید-مقدار را انجام می دهد و دارای یک تابع کاهش می دهد که تجمیع موازی و خلاصه کردن برای رسیدن به پاسخ پایانی را انجام می دهد. میان تابع های نگاشت و کاهش، یک گام به نام Shuffle است، که نقش گروه بندی (Grouping) و مرتب سازی خروجی نگاشت دهنده را دارد و سپس این دوتایی های تازه را نگاشت دهنده واگذار می کند.

گفتیم که دوتایی های با مقدارهای یکسان از نگاشت دهنده به هر کاهش دهنده فرستاده می شود.

در MapReduce، داده های ورودی و خروجی به گونه دوتایی های Key-Value با انواع مختلف در نظر گرفته می شوند. این طرح به دلیل نیازهی موازی سازی و مقیاس پذیری است. دوتایی های کلید-مقدار را می توان به راحتی پارتیشن بندی (Partitioned) و توزیع (Distributed) کرد تا در کلاستر های توزیع شده پردازش شوند.

در نوشته مدل های داده در معماری کلان داده ها گفتیم که مدل های داده NoSQL بسیار انعطاف پذیر و مقیاس پذیر هستند. برای نمونه مدل گسترش رکورد را می توان به صورت افقی و عمودی پارتیشن بندی کرد.

مدل داده ها در Apache Ignite و پارتیشن بندی آنها