بررسی ابزارهای MapReduce در BigData: تفاوت میان نسخه‌ها

از OCCC Wiki
پرش به ناوبری پرش به جستجو
بدون خلاصۀ ویرایش
 
(۲۳ نسخهٔ میانیِ ایجادشده توسط همین کاربر نشان داده نشد)
خط ۱۳: خط ۱۳:
# <big>لایه مدل سازی محاسباتی:</big> لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.
# <big>لایه مدل سازی محاسباتی:</big> لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.
==معرفی ابزار Apache Spark==
 
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می باشد. در واقع یک فریم ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به کار گرفته شد. از مزیت های آن بهبود مدیریت حافظه است.<ref name="r1">Daniel Peralta, Sara del Río, Sergio Ramírez-Gallego, Isaac Triguero, Jose M. Benitez, and Francisco Herrera/Evolutionary Feature Selection for Big Data Classification:
==تعاریف و اصطلاحات (فرهنگ داده‌ها)==
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]</ref><br />
*نگاشت کننده (Mapper): کلاسی که دارای متد map بوده و این متد توسط برنامه نویس پیاده سازی شده و عملیات نگاشت توسط آن انجام می گیرد. <ref name="r6">Mahdi Saber, Simon Hacks, / Supportive Role of Big Data Technologies in Enterprise Architecture Management/2015/[http://www.wiwi.uni-frankfurt.de/en/departments/finance/seminar/finance-seminar-series/winter-term-20152016.html لینک به مقاله]</ref><br/>
در واقع هدف از توسعه Spark رفع محدودیت های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم های قبلی بود.<ref name="r2">Dilpreet Singh and Chandan K Reddy / A survey on platforms for big data analytics /2014/[http://download.springer.com/static/pdf/803/art%253A10.1186%252Fs40537-014-0008-6.pdf?originUrl=http%3A%2F%2Flink.springer.com%2Farticle%2F10.1186%2Fs40537-014-0008-6&token2=exp=1451040314~acl=%2Fstatic%2Fpdf%2F803%2Fart%25253A10.1186%25252Fs40537-014-0008-6.pdf%3ForiginUrl%3Dhttp%253A%252F%252Flink.springer.com%252Farticle%252F10.1186%252Fs40537-014-0008-6*~hmac=0ce9fa4acd94c8c99d70d37241bdca02e44791a92459c1efa4339d02d86ee1d8 لینک به مقاله]</ref><br />
*کاهنده (Reducer): نتایجی که توسط کلاس های نگاشت کننده تولید می شوند، به صورت جفت های کلید-مقدار هستند که برای اعمال عملیات کاهش به کلاس های کاهنده ارسال می شوند. در واقع یک کلاس کاهنده دارای یک متد reduce است که عملیات ادغام مقادیر مربوط به کلید های مشترک را برعهده دارد. <ref name="r6"/><br/>
ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations) می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark زبان های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. <ref name="r2"/> <br />
*سیستم فایل توزیع شده Hadoop یا HDFS: یک سیستم فایل توزیع شده مبتنی بر بلاک و با معماری ذخیره-سازی تکراری (redundant) است که در مدل های نگاشت کاهشی ارایه شده توسط Apache نظیر Hadoop و Spark مورد استفاده قرار می گیرد و دارای کاریی بالا و قابل قبول است. <ref name="r6"/><br/>
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlib است.<br />
*تحمّل در برابر خرابی (Fault Tolerance): در صورتی که در یک شبکه با ایجاد اختلال در یک گره یا چند گره، کل شبکه از کار نیفتد و همچنان شبکه بتواند به سرویس دهی ادامه دهد، آن شبکه دارای قابلیت تحمل در برابر خرابی یا Fault Tolerance است.
*تکرار (Redundancy): به عملیاتی نظیر پشتیبان‌گیری و تهیه نسخه دیگری از داده‌ها به منظور حفاظت از داده در مقابل خرابی، تکرار یا Redundancy اطلاق می‌شود.
*Shard: در وضعیت توزیع‌شده به مجموعه ای از سرورها که شامل یک سرور اصلی و چندین سرور Replica می باشد، اصطلاحا Shard اطلاق می شود. درخواست های صادره از موتور جستجو بین Shardها توزیع می شود.
*Leader: در هر Shard، یک گره به عنوان Leader یا گره اصلی و سایر گره‌ها به عنوان Replica در نظر گرفته می-شوند.
*Replica: گره یا گره هایی که داده ها بصورت تکراری جهت عملیات حفظ و پشتیبانی، بر روی آنها کپی می شوند.


==تاریخچه و معرفی مدل نگاشت کاهشی==
==تاریخچه و معرفی مدل نگاشت کاهشی==
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.<ref name="r1"/>
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.<ref name="r1"/><br/>
 
مدل نگاشت کاهشی بر پایه یک ساختار جفت <کلید ، مقدار> طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت <کلید ، مقدار> به عنوان ورودی گرفته یک لیست میانی از <کلید ، مقدار> به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:<br />
مدل نگاشت کاهشی بر پایه یک ساختار جفت <کلید ، مقدار> طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت <کلید ، مقدار> به عنوان ورودی گرفته یک لیست میانی از <کلید ، مقدار> به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:<br />
map (key1, value1) → {(key2, value2) , . . .}  )                (1)<br />
map (key1, value1) → {(key2, value2) , . . .}  )                (1)<br/>


سپس کتابخانه نگاشت کاهشی تمام جفت های <کلید ، مقدار> میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت <کلید ، مقدار> جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:<br />
سپس کتابخانه نگاشت کاهشی تمام جفت های <کلید ، مقدار> میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت <کلید ، مقدار> جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:<br />


reduce (key2, {value2, . . .}) → (key2, value3)                (2)<br />
reduce (key2, {value2, . . .}) → (key2, value3)                (2)<br/>
 
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.<ref name="r1">Daniel Peralta, Sara del Río, Sergio Ramírez-Gallego, Isaac Triguero, Jose M. Benitez, and Francisco Herrera / Evolutionary Feature Selection for Big Data Classification: A MapReduce Approach / 2015 /[http://www.hindawi.com/journals/mpe/2015/246139/ لینک به مقاله]</ref>
 
==تحقیقات جدید راجع به مدل‌های نگاشت‌کاهشی==
=== روش انتخاب ویژگی تکاملی جهت استفاده در دسته‌بندی (Classification)===
هدف اصلی از به‌کارگیری متدهای کاهش داده، شفاف‌سازی و ساده‌سازی داده های ورودی و درعین حال، حذف نویز و افزونگی داده و بالا بردن کارایی و دقت سیستم است.
دو نوع مدل اصلی برای کاهش داده عبارتند از:  سطح نمونه (انتخاب و تولید نمونه) و سطح ویژگی ها (انتخاب و استخراج ویژگی)
مقاله با عنوان “Evolutionary Feature Selection for Big Data Classification” تکنیک جدیدی برای انتخاب ویژگی‌ها از بین مجموعه‌های بسیار بزرگ داده برای استفاده در تکنیک‌های Classification (که درحال حاضر امکان کار با مجموعه‌های بسیار بزرگ داده را ندارند)، ارایه شده است.<br/>
در الگوریتم نگاشت کاهشی ارایه شده در این مقاله، فازهای نگاشت و کاهش داده به صورت موازی انجام می شوند و این الگوریتم تحت عنوان “Evolutionary Feature  Selection for Big Data Classification” یا به صورت اختصار MR-EFS معرفی شده است. <ref name="r1"/><br/>


دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.<ref name="r1"/>
== معرفی ابزار Apache Hadoop ==
== معرفی ابزار Apache Hadoop ==
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.<ref name="r1"/><br />
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.<ref name="r1"/><br />
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.<ref name="r1"/><br />
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.<ref name="r1"/><br />
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. [3]<br />
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. <ref name="r4">Xing Wu, Yan Liu, Ian Gorton / Exploring Performance Models of Hadoop Applications on Cloud Architecture/2015/[http://dl.acm.org/citation.cfm?id=2737197 لینک به مقاله]</ref><br/>
مولفه های مهم Hadoop عبارتند از:<ref name="r2"/><br />
مولفه های مهم Hadoop عبارتند از:<ref name="r2">Dilpreet Singh and Chandan K Reddy / A survey on platforms for big data analytics/2014/[http://dl.acm.org/citation.cfm?id=2737197 لینک به مقاله]</ref><br/>
* <big>Distributed File System (HDFS)</big><br />
* <big>Distributed File System (HDFS)</big><br />
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.
خط ۴۴: خط ۵۷:
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.
* <big>HBase</big><br />
* <big>HBase</big><br />
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.[2]<br />
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.<ref name="r5"> Anand Loganathan, Ankur Sinha, Muthuramakrishnan V., and Srikanth Natarajan/A Systematic Approach to Big Data Exploration of the Hadoop Framework/2014/[http://www.irphouse.com/volume%20special/ijictv4n9spl.htm لینک به مقاله]</ref><br />
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]
عملکرد Hadoop به این صورت است که حجم بزرگی از داده ها از یک منبع یا منابع مختلف به صورت موازی خوانده شده و بر روی گره های مختلف که در یک کلاستر قرار دارند، توزیع می شوند. مجموعه گره های داخل یک کلاستر (اصطلاحا Mapperها) توسط یک گره اصلی که اصطلاحا به آن Job Tracker اطلاق می شود، مدیریت می شوند.
[[پرونده:Hadoop.png|600px|بندانگشتی|وسط]]
هر Mapper مسئول پردازش مجموعه ای از داده های ورودی است و در هر زمان تنها یک رکورد توسط متد map هر کلاس پردازش خواهد شد. پس از انجام عملیات نگاشت، خروجی ها به کلاس های کاهنده هدایت می شوند و در آنجا مقادیر بر اساس کلیدها ترکیب شده و زوج های کلید-مقدار جدید ایجاد می شود. در نهایت نتایج نهایی بر روی سیستم فایل توزیع شده Hadoop یا HDFS نوشته می شود.<ref name="r6"/><br/>
[[پرونده:Hadoop-Architecture.png|600px|بندانگشتی|وسط]]
سیستم فایل توزیع شده Hadoop دارای یک معماری master-slave بوده و از اجزای زیر تشکیل شده است:
'''Namenode:''' گره ای که Namenode بر روی آن نصب می شود به عنوان گره اصلی (master) بوده و کارهای زیر را انجام می دهد:
مدیریت namespace سیستم
*تنظیمات دسترسی کلاینت به فایل ها
*عملیات سیستمی نظیر تغییرنام، بستن و بازکردن فایل ها و دایرکتوری ها
'''Datanode:''' هر گره در کلاستر دارای یک Datanode می باشد که وظیفه آن مدیریت ذخیره سازی داده در گره مربوطه  است و وظایف زیر را نیز برعهده دارد:
*انجام عملیات خواندن / نوشتن از سیستم فایل به ازای هر درخواست کلاینت
*انجام عملیاتی نظیر ایجاد، حذف و تکرار بلاک داده براساس دستور صادره از سوی Namenode
'''Block:''' معمولا داده کاربر در فایل های HDFS ذخیره می شود. هر فایل در فایل سیستم به یک یا چندین segment جهت ذخیره سازی بر روی Datanode های مختلف تقسیم می شود. به هریک از این segment ها یک بلاک گفته می شود. اندازه پیش فرض بلاک 64 مگابایت است که می توان برحسب نیاز آن را افزایش داد.
==معرفی ابزار Apache Spark==
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می باشد. در واقع یک فریم ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به کار گرفته شد. از مزیت های آن بهبود مدیریت حافظه است. <ref name="r1"/><br/>
در واقع هدف از توسعهSpark رفع محدودیت های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم های قبلی بود. ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations) می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark از زبان های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. <ref name="r2"/><br />
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlibاست.
Spark با استفاده از بلاک هایی موسوم به RDD که مورد استفاده آنها در بازیابی داده های خراب است، از تکرار داده ها جلوگیری نموده و کارایی را بالا می برد.
یکی از اهداف پیاده سازی Spark، سرویس دهی به برنامه هایی است که نیاز به تاخیر کم (نزدیک به بلادرنگ) دارند.
[[پرونده:Spark.png|400px|قاب|وسط]]
اجزای Spark عبارتند از:
#Spark Core: قلب Spark بوده و عملیاتی نظیر زمانبندی کارها را برعهده دارد. وظیفه اصلی Spark Core مدیریت مجموعه بلاک های RDD است که در ادامه توضیحات کاملی در مورد آنها ارایه خواهد شد.
#Spark SQL: ماژولی که با ترکیب پرس و جوهای SQL با الگوریتم های تحلیلی پیچیده امکان کار با داده های ساختیافته را برای کابران آشنا به DBMS ارایه می کند.
#Spark Streaming: این ماژول با پشتیبانی از تحمل پذیری خطا و مقیاس پذیری، برای پردازش جریانی از داده ها به کار می رود و قابلیت یکپارچه سازی با ابزارهای جریان داده نظیر Flume را دارا می باشد.
#MLib:کتابخانه یادگیری ماشین در وضعیت مقیاس پذیر می باشد و مجموعه ای از الگوریتم های آماری و یادگیری ماشین نظیر تست های رگرسیون و classification را پیاده سازی می کند.
#GraphX: تحلیل و محاسبات داده را بر پایه گراف و الگوریتم ها و پردازش های گرافی انجام می دهد.
#Spark R: این ماژول مکانیزم تحلیل داده را با ارایه مکانیزم های سبک و قابل فهم، تسهیل می کند.


==مقایسه ابزارهای Hadoop و Spark==
==مقایسه ابزارهای Hadoop و Spark==
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.[5]<br />
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.<ref name="r3">MATEI ZAHARIA, MOSHARAF CHOWDHURY, TATHAGATA DAS, ANKUR DAVE, JUSTIN MA, MURPHY MCCAULEY, MICHAEL J. FRANKLIN, SCOTT SHENKER, AND ION STOICA / Fast and Interactive Analytics over Hadoop Data with Spark /2012/[https://www.usenix.org/system/files/login/articles/zaharia.pdf لینک به مقاله]</ref><br />
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]<br />
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]<br />
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. [5]<br />
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. <ref name="r3"/><br />
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. [5]<br />
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. <ref name="r3"/><br />
* <big>محدودیت مدل نگاشت کاهشی</big>
* <big>محدودیت مدل نگاشت کاهشی</big>
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.<ref name="r2"/><br />
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.<ref name="r2"/><br />
* <big>واسط برنامه نویسی</big><br />
* <big>واسط برنامه نویسی</big><br />
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستندکه در واقع مجموعه هایی از اشیا بخش بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاستر شده توزیع شده اند و می توانند به صورت موازی کار کنند. به Rdd های ایجاد شده توسط کاربر تبدیل یا transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. [5]<br />
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستند که در واقع مجموعه هایی از اشیاء بخش-بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاسترشده توزیع شده اند و می توانند به صورت موازی کار کنند. به RDD های ایجاد شده توسط کاربر تبدیل یا Transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. <ref name="r3"/><br />
به عنوان مثال قطعه کد زیر یک RDD ایجاد می کند که پیغام های خطا را از طریق جستجوی خطوطی که با عبارت ERROR آغاز می شوند از یک فایل log استخراج کرده و بر روی کنسول نمایش می دهد.<br />
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. <ref name="r3"/><br />
<div dir="ltr">
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.
val lines = spark.textFile(“hdfs://...”)
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. <ref name="r3"/><br />
val errors = lines.filter(line => line.startsWith(“ERROR”))
 
println(“Total errors: “ + errors.count())
</div>
<br/>
خط اول یک RDD بر روی یک فایل HDFS تعریف می کند. خط دوم یک تبدیل از نوع غربال برای استخراج یک RDD جدید از خطوط تعریف می کند. و نهایتا خط آخر با فراخو.انی count که نوع دیگری از RDD به نام action است یک نتیجه را برای برنامه (که در اینجا تعداد عناصر RDD است)، باز می گرداند.
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. [5]
<br />
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.<br />
به عنوان مثال یک کاربر که قصد رفع یک مشکل را دارد، ممکن است با فراخوانی زیر روی یک کلاستر، بخواهد از بین مجموعه های بسیار بزرگی از داده پیغام های خطا را در حافظه بارگذاری کند:<br />
errors.persist()
<br />
پس از این کار می توان پرس و جوهای مختلفی بر روی داده موجود در حافظه اصلی اجرا نمود.<br />
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. [5]<br />
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]<br />
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]<br />
*<big>مقاومت در برابر خرابی (Fault Tolerance)</big><br />
*<big>مقاومت در برابر خرابی (Fault Tolerance)</big><br />
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.<br />
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.<br />
به عنوان مثال فرض کنید عملیات زیر توسط کاربر بر روی خطوط خطا انجام شده است:<br />
 
<div dir="ltr">
// Count the errors mentioning MySQL
errors.filter(line => line.contains(“MySQL”)).count()
// Fetch the MySQL errors as an array of strings
errors.filter(line => line.contains(“MySQL”)).collect()
// Fetch the time fields of errors mentioning PHP as an array
// (assuming time is field number 3 in a tab-separated format):
errors.filter(line => line.contains(“PHP”))
.map(line => line.split(‘\t’)(3)) .collect()
</div>
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.<br />
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.<br />
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]<br />
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]<br />
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. [5]<br />
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. <ref name="r3"/><br />


==نتیجه گیری==
==نتیجه گیری==
مدل های نگاشت کاهشی یا Map-Reduce در واقع مدل های محاسباتی برای سرورهای توزیع شده در مقیاس افقی و با حجم داده بسیار بالا در حد پتابایت می باشند. اهداف اصلی این مدل ها در واقع نگاشت و کاهش نیست، بلکه فراتر بوده و در واقع کارایی آنها در تحمل پذیری خطا و تکرار داده مشخص می شود. لذا در موقعیتی که تنها بر روی یک گره عمل می کنند، حتی ممکن است کارایی آنها از مدل های سنتی نیز پایین تر بیاید.
ابزار Hadoop در واقع اولین ابزار مدل نگاشت کاهشی است که گاهی از آن با نام MapReduce نیز یاد می شود. این ابزار در مقایسه با ابزار Spark به دلیل عدم امکان تعامل با حافظه اصلی از کارایی پایین تری برخوردار است.
از دیگر خصوصیات متمایزکننده Spark استفاده از بلاک های RDD است که کارایی این ابزار را در تحمل پذیری خطا و همچنین صرفه جویی در مصرف دیسک (به دلیل عدم نیاز به تکرار داده) دوچندان می کند.
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:
:
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]<br />
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]<br />


== مراجع ==
== مراجع ==
<div dir="ltr">
1. Daniel Peralta, Sara del Río, Sergio Ramírez-Gallego, Isaac Triguero, Jose M. Benitez, and Francisco Herrera/Evolutionary Feature Selection for Big Data Classification:
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]
2. Anand Loganathan, Ankur Sinha, Muthuramakrishnan V.,
and Srikanth Natarajan/A Systematic Approach to Big Data
Exploration of the Hadoop Framework/2014/[http://www.irphouse.com/volume%20special/ijictv4n9spl.htm لینک به مقاله]
3.Xing Wu, Yan Liu, Ian Gorton / Exploring Performance Models of Hadoop Applications on Cloud Architecture/2015/[http://dl.acm.org/citation.cfm?id=2737197 لینک به مقاله]
4.Xiaoyi Lu ; Dept. of Comput. Sci. & Eng., Ohio State Univ., Columbus, OH, USA ; Rahman, M.W.U. ; Islam, N. ; Shankar, D /
Accelerating Spark with RDMA for Big Data Processing: Early Experiences
/2014/[http://ieeexplore.ieee.org/xpl/articleDetails.jsp?tp=&arnumber=6925713&url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D6925713 لینک به مقاله]
5.MATEI ZAHARIA, MOSHARAF CHOWDHURY, TATHAGATA DAS, ANKUR DAVE, JUSTIN MA, MURPHY MCCAULEY, MICHAEL J. FRANKLIN, SCOTT SHENKER, AND ION STOICA / Fast and Interactive Analytics over Hadoop Data with Spark
/2012/[https://www.usenix.org/system/files/login/articles/zaharia.pdf لینک به مقاله]
6.Dilpreet Singh and Chandan K Reddy / A survey on platforms for big data analytics
/2014/[http://download.springer.com/static/pdf/803/art%253A10.1186%252Fs40537-014-0008-6.pdf?originUrl=http%3A%2F%2Flink.springer.com%2Farticle%2F10.1186%2Fs40537-014-0008-6&token2=exp=1451040314~acl=%2Fstatic%2Fpdf%2F803%2Fart%25253A10.1186%25252Fs40537-014-0008-6.pdf%3ForiginUrl%3Dhttp%253A%252F%252Flink.springer.com%252Farticle%252F10.1186%252Fs40537-014-0008-6*~hmac=0ce9fa4acd94c8c99d70d37241bdca02e44791a92459c1efa4339d02d86ee1d8 لینک به مقاله]
</div>
<div dir="ltr">
<div dir="ltr">
<references/>
<references/>
</div>
</div>

نسخهٔ کنونی تا ‏۶ مارس ۲۰۱۶، ساعت ۰۵:۲۱

چکیده

با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.

Mapreduce.png

در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.

مقدمه

در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند. با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم. دیاگرام زیر معماری کلی گران داده را نمایش می دهد:

Mapreduce-Model.png

همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:

  1. لایه داده فیزیکی: داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.
  2. لایه مدل سازی داده: لایه ای است که برای مدیریت داده فیزیکی به کار می رود.
  3. لایه مدل سازی محاسباتی: لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.

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

تعاریف و اصطلاحات (فرهنگ داده‌ها)

  • نگاشت کننده (Mapper): کلاسی که دارای متد map بوده و این متد توسط برنامه نویس پیاده سازی شده و عملیات نگاشت توسط آن انجام می گیرد. [۱]
  • کاهنده (Reducer): نتایجی که توسط کلاس های نگاشت کننده تولید می شوند، به صورت جفت های کلید-مقدار هستند که برای اعمال عملیات کاهش به کلاس های کاهنده ارسال می شوند. در واقع یک کلاس کاهنده دارای یک متد reduce است که عملیات ادغام مقادیر مربوط به کلید های مشترک را برعهده دارد. [۱]
  • سیستم فایل توزیع شده Hadoop یا HDFS: یک سیستم فایل توزیع شده مبتنی بر بلاک و با معماری ذخیره-سازی تکراری (redundant) است که در مدل های نگاشت کاهشی ارایه شده توسط Apache نظیر Hadoop و Spark مورد استفاده قرار می گیرد و دارای کاریی بالا و قابل قبول است. [۱]
  • تحمّل در برابر خرابی (Fault Tolerance): در صورتی که در یک شبکه با ایجاد اختلال در یک گره یا چند گره، کل شبکه از کار نیفتد و همچنان شبکه بتواند به سرویس دهی ادامه دهد، آن شبکه دارای قابلیت تحمل در برابر خرابی یا Fault Tolerance است.
  • تکرار (Redundancy): به عملیاتی نظیر پشتیبان‌گیری و تهیه نسخه دیگری از داده‌ها به منظور حفاظت از داده در مقابل خرابی، تکرار یا Redundancy اطلاق می‌شود.
  • Shard: در وضعیت توزیع‌شده به مجموعه ای از سرورها که شامل یک سرور اصلی و چندین سرور Replica می باشد، اصطلاحا Shard اطلاق می شود. درخواست های صادره از موتور جستجو بین Shardها توزیع می شود.
  • Leader: در هر Shard، یک گره به عنوان Leader یا گره اصلی و سایر گره‌ها به عنوان Replica در نظر گرفته می-شوند.
  • Replica: گره یا گره هایی که داده ها بصورت تکراری جهت عملیات حفظ و پشتیبانی، بر روی آنها کپی می شوند.

تاریخچه و معرفی مدل نگاشت کاهشی

یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.[۲]

مدل نگاشت کاهشی بر پایه یک ساختار جفت <کلید ، مقدار> طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت <کلید ، مقدار> به عنوان ورودی گرفته یک لیست میانی از <کلید ، مقدار> به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:
map (key1, value1) → {(key2, value2) , . . .} ) (1)

سپس کتابخانه نگاشت کاهشی تمام جفت های <کلید ، مقدار> میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت <کلید ، مقدار> جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:

reduce (key2, {value2, . . .}) → (key2, value3) (2)

دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.[۲]

تحقیقات جدید راجع به مدل‌های نگاشت‌کاهشی

روش انتخاب ویژگی تکاملی جهت استفاده در دسته‌بندی (Classification)

هدف اصلی از به‌کارگیری متدهای کاهش داده، شفاف‌سازی و ساده‌سازی داده های ورودی و درعین حال، حذف نویز و افزونگی داده و بالا بردن کارایی و دقت سیستم است. دو نوع مدل اصلی برای کاهش داده عبارتند از: سطح نمونه (انتخاب و تولید نمونه) و سطح ویژگی ها (انتخاب و استخراج ویژگی) مقاله با عنوان “Evolutionary Feature Selection for Big Data Classification” تکنیک جدیدی برای انتخاب ویژگی‌ها از بین مجموعه‌های بسیار بزرگ داده برای استفاده در تکنیک‌های Classification (که درحال حاضر امکان کار با مجموعه‌های بسیار بزرگ داده را ندارند)، ارایه شده است.
در الگوریتم نگاشت کاهشی ارایه شده در این مقاله، فازهای نگاشت و کاهش داده به صورت موازی انجام می شوند و این الگوریتم تحت عنوان “Evolutionary Feature Selection for Big Data Classification” یا به صورت اختصار MR-EFS معرفی شده است. [۲]

معرفی ابزار Apache Hadoop

Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.[۲]
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.[۲]
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. [۳]
مولفه های مهم Hadoop عبارتند از:[۴]

  • Distributed File System (HDFS)

یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.

  • Hadoop YARN

یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.

  • Apache Pig

یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و LinkedIn و ... از آن استفاده می کنند.

  • Hive

Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.

  • HBase

یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.[۵]

Hadoop-Structure.png

عملکرد Hadoop به این صورت است که حجم بزرگی از داده ها از یک منبع یا منابع مختلف به صورت موازی خوانده شده و بر روی گره های مختلف که در یک کلاستر قرار دارند، توزیع می شوند. مجموعه گره های داخل یک کلاستر (اصطلاحا Mapperها) توسط یک گره اصلی که اصطلاحا به آن Job Tracker اطلاق می شود، مدیریت می شوند.

Hadoop.png

هر Mapper مسئول پردازش مجموعه ای از داده های ورودی است و در هر زمان تنها یک رکورد توسط متد map هر کلاس پردازش خواهد شد. پس از انجام عملیات نگاشت، خروجی ها به کلاس های کاهنده هدایت می شوند و در آنجا مقادیر بر اساس کلیدها ترکیب شده و زوج های کلید-مقدار جدید ایجاد می شود. در نهایت نتایج نهایی بر روی سیستم فایل توزیع شده Hadoop یا HDFS نوشته می شود.[۱]

Hadoop-Architecture.png

سیستم فایل توزیع شده Hadoop دارای یک معماری master-slave بوده و از اجزای زیر تشکیل شده است: Namenode: گره ای که Namenode بر روی آن نصب می شود به عنوان گره اصلی (master) بوده و کارهای زیر را انجام می دهد: مدیریت namespace سیستم

  • تنظیمات دسترسی کلاینت به فایل ها
  • عملیات سیستمی نظیر تغییرنام، بستن و بازکردن فایل ها و دایرکتوری ها

Datanode: هر گره در کلاستر دارای یک Datanode می باشد که وظیفه آن مدیریت ذخیره سازی داده در گره مربوطه است و وظایف زیر را نیز برعهده دارد:

  • انجام عملیات خواندن / نوشتن از سیستم فایل به ازای هر درخواست کلاینت
  • انجام عملیاتی نظیر ایجاد، حذف و تکرار بلاک داده براساس دستور صادره از سوی Namenode

Block: معمولا داده کاربر در فایل های HDFS ذخیره می شود. هر فایل در فایل سیستم به یک یا چندین segment جهت ذخیره سازی بر روی Datanode های مختلف تقسیم می شود. به هریک از این segment ها یک بلاک گفته می شود. اندازه پیش فرض بلاک 64 مگابایت است که می توان برحسب نیاز آن را افزایش داد.

معرفی ابزار Apache Spark

Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می باشد. در واقع یک فریم ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به کار گرفته شد. از مزیت های آن بهبود مدیریت حافظه است. [۲]
در واقع هدف از توسعهSpark رفع محدودیت های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم های قبلی بود. ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations) می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark از زبان های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. [۴]
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlibاست. Spark با استفاده از بلاک هایی موسوم به RDD که مورد استفاده آنها در بازیابی داده های خراب است، از تکرار داده ها جلوگیری نموده و کارایی را بالا می برد. یکی از اهداف پیاده سازی Spark، سرویس دهی به برنامه هایی است که نیاز به تاخیر کم (نزدیک به بلادرنگ) دارند.

Spark.png

اجزای Spark عبارتند از:

  1. Spark Core: قلب Spark بوده و عملیاتی نظیر زمانبندی کارها را برعهده دارد. وظیفه اصلی Spark Core مدیریت مجموعه بلاک های RDD است که در ادامه توضیحات کاملی در مورد آنها ارایه خواهد شد.
  2. Spark SQL: ماژولی که با ترکیب پرس و جوهای SQL با الگوریتم های تحلیلی پیچیده امکان کار با داده های ساختیافته را برای کابران آشنا به DBMS ارایه می کند.
  3. Spark Streaming: این ماژول با پشتیبانی از تحمل پذیری خطا و مقیاس پذیری، برای پردازش جریانی از داده ها به کار می رود و قابلیت یکپارچه سازی با ابزارهای جریان داده نظیر Flume را دارا می باشد.
  4. MLib:کتابخانه یادگیری ماشین در وضعیت مقیاس پذیر می باشد و مجموعه ای از الگوریتم های آماری و یادگیری ماشین نظیر تست های رگرسیون و classification را پیاده سازی می کند.
  5. GraphX: تحلیل و محاسبات داده را بر پایه گراف و الگوریتم ها و پردازش های گرافی انجام می دهد.
  6. Spark R: این ماژول مکانیزم تحلیل داده را با ارایه مکانیزم های سبک و قابل فهم، تسهیل می کند.

مقایسه ابزارهای Hadoop و Spark

Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop تا بیش از 90% قابل کاهش است.[۶]

Hadoop-vs-Spark.png


Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. [۶]
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. [۶]

  • محدودیت مدل نگاشت کاهشی

یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.[۴]

  • واسط برنامه نویسی

اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستند که در واقع مجموعه هایی از اشیاء بخش-بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاسترشده توزیع شده اند و می توانند به صورت موازی کار کنند. به RDD های ایجاد شده توسط کاربر تبدیل یا Transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. [۶]
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. [۶]
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند. در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. [۶]

Hadoop-vs-Spark-Iteration.png


  • مقاومت در برابر خرابی (Fault Tolerance)

در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.

همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.

Spark-Fault-Tolerance.png


عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. [۶]

نتیجه گیری

مدل های نگاشت کاهشی یا Map-Reduce در واقع مدل های محاسباتی برای سرورهای توزیع شده در مقیاس افقی و با حجم داده بسیار بالا در حد پتابایت می باشند. اهداف اصلی این مدل ها در واقع نگاشت و کاهش نیست، بلکه فراتر بوده و در واقع کارایی آنها در تحمل پذیری خطا و تکرار داده مشخص می شود. لذا در موقعیتی که تنها بر روی یک گره عمل می کنند، حتی ممکن است کارایی آنها از مدل های سنتی نیز پایین تر بیاید. ابزار Hadoop در واقع اولین ابزار مدل نگاشت کاهشی است که گاهی از آن با نام MapReduce نیز یاد می شود. این ابزار در مقایسه با ابزار Spark به دلیل عدم امکان تعامل با حافظه اصلی از کارایی پایین تری برخوردار است. از دیگر خصوصیات متمایزکننده Spark استفاده از بلاک های RDD است که کارایی این ابزار را در تحمل پذیری خطا و همچنین صرفه جویی در مصرف دیسک (به دلیل عدم نیاز به تکرار داده) دوچندان می کند. در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:

Hadoop-vs-Spark-Table.png


مراجع

  1. ۱٫۰ ۱٫۱ ۱٫۲ ۱٫۳ Mahdi Saber, Simon Hacks, / Supportive Role of Big Data Technologies in Enterprise Architecture Management/2015/لینک به مقاله
  2. ۲٫۰ ۲٫۱ ۲٫۲ ۲٫۳ ۲٫۴ ۲٫۵ Daniel Peralta, Sara del Río, Sergio Ramírez-Gallego, Isaac Triguero, Jose M. Benitez, and Francisco Herrera / Evolutionary Feature Selection for Big Data Classification: A MapReduce Approach / 2015 /لینک به مقاله
  3. Xing Wu, Yan Liu, Ian Gorton / Exploring Performance Models of Hadoop Applications on Cloud Architecture/2015/لینک به مقاله
  4. ۴٫۰ ۴٫۱ ۴٫۲ Dilpreet Singh and Chandan K Reddy / A survey on platforms for big data analytics/2014/لینک به مقاله
  5. Anand Loganathan, Ankur Sinha, Muthuramakrishnan V., and Srikanth Natarajan/A Systematic Approach to Big Data Exploration of the Hadoop Framework/2014/لینک به مقاله
  6. ۶٫۰ ۶٫۱ ۶٫۲ ۶٫۳ ۶٫۴ ۶٫۵ ۶٫۶ MATEI ZAHARIA, MOSHARAF CHOWDHURY, TATHAGATA DAS, ANKUR DAVE, JUSTIN MA, MURPHY MCCAULEY, MICHAEL J. FRANKLIN, SCOTT SHENKER, AND ION STOICA / Fast and Interactive Analytics over Hadoop Data with Spark /2012/لینک به مقاله