﻿<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fa">
	<id>http://wiki.occc.ir/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=94131572</id>
	<title>OCCC Wiki - مشارکت‌های کاربر [fa]</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.occc.ir/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=94131572"/>
	<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D9%88%DB%8C%DA%98%D9%87:%D9%85%D8%B4%D8%A7%D8%B1%DA%A9%D8%AA%E2%80%8C%D9%87%D8%A7/94131572"/>
	<updated>2026-05-27T07:08:56Z</updated>
	<subtitle>مشارکت‌های کاربر</subtitle>
	<generator>MediaWiki 1.38.4</generator>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=14164</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=14164"/>
		<updated>2016-03-06T01:51:00Z</updated>

		<summary type="html">&lt;p&gt;94131572: /* تاریخچه و معرفی مدل نگاشت کاهشی */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
&lt;br /&gt;
==تعاریف و اصطلاحات (فرهنگ داده‌ها)==&lt;br /&gt;
*نگاشت کننده (Mapper): کلاسی که دارای متد map بوده و این متد توسط برنامه نویس پیاده سازی شده و عملیات نگاشت توسط آن انجام می گیرد. &amp;lt;ref name=&amp;quot;r6&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
*کاهنده (Reducer): نتایجی که توسط کلاس های نگاشت کننده تولید می شوند، به صورت جفت های کلید-مقدار هستند که برای اعمال عملیات کاهش به کلاس های کاهنده ارسال می شوند. در واقع یک کلاس کاهنده دارای یک متد reduce است که عملیات ادغام مقادیر مربوط به کلید های مشترک را برعهده دارد. &amp;lt;ref name=&amp;quot;r6&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
*سیستم فایل توزیع شده Hadoop یا HDFS: یک سیستم فایل توزیع شده مبتنی بر بلاک و با معماری ذخیره-سازی تکراری (redundant) است که در مدل های نگاشت کاهشی ارایه شده توسط Apache نظیر Hadoop و Spark مورد استفاده قرار می گیرد و دارای کاریی بالا و قابل قبول است. &amp;lt;ref name=&amp;quot;r6&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
*تحمّل در برابر خرابی (Fault Tolerance): در صورتی که در یک شبکه با ایجاد اختلال در یک گره یا چند گره، کل شبکه از کار نیفتد و همچنان شبکه بتواند به سرویس دهی ادامه دهد، آن شبکه دارای قابلیت تحمل در برابر خرابی یا Fault Tolerance است.&lt;br /&gt;
*تکرار (Redundancy): به عملیاتی نظیر پشتیبان‌گیری و تهیه نسخه دیگری از داده‌ها به منظور حفاظت از داده در مقابل خرابی، تکرار یا Redundancy اطلاق می‌شود.&lt;br /&gt;
*Shard: در وضعیت توزیع‌شده به مجموعه ای از سرورها که شامل یک سرور اصلی و چندین سرور Replica می باشد، اصطلاحا Shard اطلاق می شود. درخواست های صادره از موتور جستجو بین Shardها توزیع می شود.&lt;br /&gt;
*Leader: در هر Shard، یک گره به عنوان Leader یا گره اصلی و سایر گره‌ها به عنوان Replica در نظر گرفته می-شوند.&lt;br /&gt;
*Replica: گره یا گره هایی که داده ها بصورت تکراری جهت عملیات حفظ و پشتیبانی، بر روی آنها کپی می شوند.&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.&amp;lt;ref name=&amp;quot;r1&amp;quot;&amp;gt;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/ لینک به مقاله]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==تحقیقات جدید راجع به مدل‌های نگاشت‌کاهشی==&lt;br /&gt;
=== روش انتخاب ویژگی تکاملی جهت استفاده در دسته‌بندی (Classification)===&lt;br /&gt;
هدف اصلی از به‌کارگیری متدهای کاهش داده، شفاف‌سازی و ساده‌سازی داده های ورودی و درعین حال، حذف نویز و افزونگی داده و بالا بردن کارایی و دقت سیستم است.&lt;br /&gt;
دو نوع مدل اصلی برای کاهش داده عبارتند از:  سطح نمونه (انتخاب و تولید نمونه) و سطح ویژگی ها (انتخاب و استخراج ویژگی)&lt;br /&gt;
مقاله با عنوان “Evolutionary Feature Selection for Big Data Classification” تکنیک جدیدی برای انتخاب ویژگی‌ها از بین مجموعه‌های بسیار بزرگ داده برای استفاده در تکنیک‌های Classification (که درحال حاضر امکان کار با مجموعه‌های بسیار بزرگ داده را ندارند)، ارایه شده است.&amp;lt;br/&amp;gt;&lt;br /&gt;
در الگوریتم نگاشت کاهشی ارایه شده در این مقاله، فازهای نگاشت و کاهش داده به صورت موازی انجام می شوند و این الگوریتم تحت عنوان “Evolutionary Feature  Selection for Big Data Classification” یا به صورت اختصار MR-EFS معرفی شده است. &amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. &amp;lt;ref name=&amp;quot;r4&amp;quot;&amp;gt;Xing Wu, Yan Liu, Ian Gorton / Exploring Performance Models of Hadoop Applications on Cloud Architecture/2015/[http://dl.acm.org/citation.cfm?id=2737197 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:&amp;lt;ref name=&amp;quot;r2&amp;quot;&amp;gt;Dilpreet Singh and Chandan K Reddy / A survey on platforms for big data analytics/2014/[http://dl.acm.org/citation.cfm?id=2737197 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.&amp;lt;ref name=&amp;quot;r5&amp;quot;&amp;gt; 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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
عملکرد Hadoop به این صورت است که حجم بزرگی از داده ها از یک منبع یا منابع مختلف به صورت موازی خوانده شده و بر روی گره های مختلف که در یک کلاستر قرار دارند، توزیع می شوند. مجموعه گره های داخل یک کلاستر (اصطلاحا Mapperها) توسط یک گره اصلی که اصطلاحا به آن Job Tracker اطلاق می شود، مدیریت می شوند. &lt;br /&gt;
[[پرونده:Hadoop.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
هر Mapper مسئول پردازش مجموعه ای از داده های ورودی است و در هر زمان تنها یک رکورد توسط متد map هر کلاس پردازش خواهد شد. پس از انجام عملیات نگاشت، خروجی ها به کلاس های کاهنده هدایت می شوند و در آنجا مقادیر بر اساس کلیدها ترکیب شده و زوج های کلید-مقدار جدید ایجاد می شود. در نهایت نتایج نهایی بر روی سیستم فایل توزیع شده Hadoop یا HDFS نوشته می شود.&amp;lt;ref name=&amp;quot;r6&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Architecture.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
سیستم فایل توزیع شده Hadoop دارای یک معماری master-slave بوده و از اجزای زیر تشکیل شده است:&lt;br /&gt;
'''Namenode:''' گره ای که Namenode بر روی آن نصب می شود به عنوان گره اصلی (master) بوده و کارهای زیر را انجام می دهد:&lt;br /&gt;
مدیریت namespace سیستم&lt;br /&gt;
*تنظیمات دسترسی کلاینت به فایل ها&lt;br /&gt;
*عملیات سیستمی نظیر تغییرنام، بستن و بازکردن فایل ها و دایرکتوری ها&lt;br /&gt;
&lt;br /&gt;
'''Datanode:''' هر گره در کلاستر دارای یک Datanode می باشد که وظیفه آن مدیریت ذخیره سازی داده در گره مربوطه  است و وظایف زیر را نیز برعهده دارد:&lt;br /&gt;
*انجام عملیات خواندن / نوشتن از سیستم فایل به ازای هر درخواست کلاینت&lt;br /&gt;
*انجام عملیاتی نظیر ایجاد، حذف و تکرار بلاک داده براساس دستور صادره از سوی Namenode&lt;br /&gt;
&lt;br /&gt;
'''Block:''' معمولا داده کاربر در فایل های HDFS ذخیره می شود. هر فایل در فایل سیستم به یک یا چندین segment جهت ذخیره سازی بر روی Datanode های مختلف تقسیم می شود. به هریک از این segment ها یک بلاک گفته می شود. اندازه پیش فرض بلاک 64 مگابایت است که می توان برحسب نیاز آن را افزایش داد.&lt;br /&gt;
&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می باشد. در واقع یک فریم ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به کار گرفته شد. از مزیت های آن بهبود مدیریت حافظه است. &amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
در واقع هدف از توسعهSpark رفع محدودیت های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم های قبلی بود. ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations) می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark از زبان های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. &amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlibاست.&lt;br /&gt;
Spark با استفاده از بلاک هایی موسوم به RDD که مورد استفاده آنها در بازیابی داده های خراب است، از تکرار داده ها جلوگیری نموده و کارایی را بالا می برد.&lt;br /&gt;
یکی از اهداف پیاده سازی Spark، سرویس دهی به برنامه هایی است که نیاز به تاخیر کم (نزدیک به بلادرنگ) دارند.&lt;br /&gt;
[[پرونده:Spark.png|400px|قاب|وسط]]&lt;br /&gt;
اجزای Spark عبارتند از:&lt;br /&gt;
#Spark Core: قلب Spark بوده و عملیاتی نظیر زمانبندی کارها را برعهده دارد. وظیفه اصلی Spark Core مدیریت مجموعه بلاک های RDD است که در ادامه توضیحات کاملی در مورد آنها ارایه خواهد شد.&lt;br /&gt;
#Spark SQL: ماژولی که با ترکیب پرس و جوهای SQL با الگوریتم های تحلیلی پیچیده امکان کار با داده های ساختیافته را برای کابران آشنا به DBMS ارایه می کند.&lt;br /&gt;
#Spark Streaming: این ماژول با پشتیبانی از تحمل پذیری خطا و مقیاس پذیری، برای پردازش جریانی از داده ها به کار می رود و قابلیت یکپارچه سازی با ابزارهای جریان داده نظیر Flume را دارا می باشد.&lt;br /&gt;
#MLib:کتابخانه یادگیری ماشین در وضعیت مقیاس پذیر می باشد و مجموعه ای از الگوریتم های آماری و یادگیری ماشین نظیر تست های رگرسیون و classification را پیاده سازی می کند.&lt;br /&gt;
#GraphX: تحلیل و محاسبات داده را بر پایه گراف و الگوریتم ها و پردازش های گرافی انجام می دهد.&lt;br /&gt;
#Spark R: این ماژول مکانیزم تحلیل داده را با ارایه مکانیزم های سبک و قابل فهم، تسهیل می کند.&lt;br /&gt;
&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.&amp;lt;ref name=&amp;quot;r3&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستند که در واقع مجموعه هایی از اشیاء بخش-بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاسترشده توزیع شده اند و می توانند به صورت موازی کار کنند. به RDD های ایجاد شده توسط کاربر تبدیل یا Transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark  به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
مدل های نگاشت کاهشی یا Map-Reduce در واقع مدل های محاسباتی برای سرورهای توزیع شده در مقیاس افقی و با حجم داده بسیار بالا در حد پتابایت می باشند. اهداف اصلی این مدل ها در واقع نگاشت و کاهش نیست، بلکه فراتر بوده و در واقع کارایی آنها در تحمل پذیری خطا و تکرار داده مشخص می شود. لذا در موقعیتی که تنها بر روی یک گره عمل می کنند، حتی ممکن است کارایی آنها از مدل های سنتی نیز پایین تر بیاید.&lt;br /&gt;
ابزار Hadoop در واقع اولین ابزار مدل نگاشت کاهشی است که گاهی از آن با نام MapReduce نیز یاد می شود. این ابزار در مقایسه با ابزار Spark به دلیل عدم امکان تعامل با حافظه اصلی از کارایی پایین تری برخوردار است. &lt;br /&gt;
از دیگر خصوصیات متمایزکننده Spark استفاده از بلاک های RDD است که کارایی این ابزار را در تحمل پذیری خطا و همچنین صرفه جویی در مصرف دیسک (به دلیل عدم نیاز به تکرار داده) دوچندان می کند.&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=14163</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=14163"/>
		<updated>2016-03-06T01:45:00Z</updated>

		<summary type="html">&lt;p&gt;94131572: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
&lt;br /&gt;
==تعاریف و اصطلاحات (فرهنگ داده‌ها)==&lt;br /&gt;
*نگاشت کننده (Mapper): کلاسی که دارای متد map بوده و این متد توسط برنامه نویس پیاده سازی شده و عملیات نگاشت توسط آن انجام می گیرد. &amp;lt;ref name=&amp;quot;r6&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
*کاهنده (Reducer): نتایجی که توسط کلاس های نگاشت کننده تولید می شوند، به صورت جفت های کلید-مقدار هستند که برای اعمال عملیات کاهش به کلاس های کاهنده ارسال می شوند. در واقع یک کلاس کاهنده دارای یک متد reduce است که عملیات ادغام مقادیر مربوط به کلید های مشترک را برعهده دارد. &amp;lt;ref name=&amp;quot;r6&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
*سیستم فایل توزیع شده Hadoop یا HDFS: یک سیستم فایل توزیع شده مبتنی بر بلاک و با معماری ذخیره-سازی تکراری (redundant) است که در مدل های نگاشت کاهشی ارایه شده توسط Apache نظیر Hadoop و Spark مورد استفاده قرار می گیرد و دارای کاریی بالا و قابل قبول است. &amp;lt;ref name=&amp;quot;r6&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
*تحمّل در برابر خرابی (Fault Tolerance): در صورتی که در یک شبکه با ایجاد اختلال در یک گره یا چند گره، کل شبکه از کار نیفتد و همچنان شبکه بتواند به سرویس دهی ادامه دهد، آن شبکه دارای قابلیت تحمل در برابر خرابی یا Fault Tolerance است.&lt;br /&gt;
*تکرار (Redundancy): به عملیاتی نظیر پشتیبان‌گیری و تهیه نسخه دیگری از داده‌ها به منظور حفاظت از داده در مقابل خرابی، تکرار یا Redundancy اطلاق می‌شود.&lt;br /&gt;
*Shard: در وضعیت توزیع‌شده به مجموعه ای از سرورها که شامل یک سرور اصلی و چندین سرور Replica می باشد، اصطلاحا Shard اطلاق می شود. درخواست های صادره از موتور جستجو بین Shardها توزیع می شود.&lt;br /&gt;
*Leader: در هر Shard، یک گره به عنوان Leader یا گره اصلی و سایر گره‌ها به عنوان Replica در نظر گرفته می-شوند.&lt;br /&gt;
*Replica: گره یا گره هایی که داده ها بصورت تکراری جهت عملیات حفظ و پشتیبانی، بر روی آنها کپی می شوند.&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.&amp;lt;ref name=&amp;quot;r1&amp;quot;&amp;gt;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&amp;lt;/ref&amp;gt;&lt;br /&gt;
==تحقیقات جدید راجع به مدل‌های نگاشت‌کاهشی==&lt;br /&gt;
=== روش انتخاب ویژگی تکاملی جهت استفاده در دسته‌بندی (Classification)===&lt;br /&gt;
هدف اصلی از به‌کارگیری متدهای کاهش داده، شفاف‌سازی و ساده‌سازی داده های ورودی و درعین حال، حذف نویز و افزونگی داده و بالا بردن کارایی و دقت سیستم است.&lt;br /&gt;
دو نوع مدل اصلی برای کاهش داده عبارتند از:  سطح نمونه (انتخاب و تولید نمونه) و سطح ویژگی ها (انتخاب و استخراج ویژگی)&lt;br /&gt;
مقاله با عنوان “Evolutionary Feature Selection for Big Data Classification” تکنیک جدیدی برای انتخاب ویژگی‌ها از بین مجموعه‌های بسیار بزرگ داده برای استفاده در تکنیک‌های Classification (که درحال حاضر امکان کار با مجموعه‌های بسیار بزرگ داده را ندارند)، ارایه شده است.&amp;lt;br/&amp;gt;&lt;br /&gt;
در الگوریتم نگاشت کاهشی ارایه شده در این مقاله، فازهای نگاشت و کاهش داده به صورت موازی انجام می شوند و این الگوریتم تحت عنوان “Evolutionary Feature  Selection for Big Data Classification” یا به صورت اختصار MR-EFS معرفی شده است. &amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. &amp;lt;ref name=&amp;quot;r4&amp;quot;&amp;gt;Xing Wu, Yan Liu, Ian Gorton / Exploring Performance Models of Hadoop Applications on Cloud Architecture/2015/[http://dl.acm.org/citation.cfm?id=2737197 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:&amp;lt;ref name=&amp;quot;r2&amp;quot;&amp;gt;Dilpreet Singh and Chandan K Reddy / A survey on platforms for big data analytics/2014/[http://dl.acm.org/citation.cfm?id=2737197 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.&amp;lt;ref name=&amp;quot;r5&amp;quot;&amp;gt; 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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
عملکرد Hadoop به این صورت است که حجم بزرگی از داده ها از یک منبع یا منابع مختلف به صورت موازی خوانده شده و بر روی گره های مختلف که در یک کلاستر قرار دارند، توزیع می شوند. مجموعه گره های داخل یک کلاستر (اصطلاحا Mapperها) توسط یک گره اصلی که اصطلاحا به آن Job Tracker اطلاق می شود، مدیریت می شوند. &lt;br /&gt;
[[پرونده:Hadoop.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
هر Mapper مسئول پردازش مجموعه ای از داده های ورودی است و در هر زمان تنها یک رکورد توسط متد map هر کلاس پردازش خواهد شد. پس از انجام عملیات نگاشت، خروجی ها به کلاس های کاهنده هدایت می شوند و در آنجا مقادیر بر اساس کلیدها ترکیب شده و زوج های کلید-مقدار جدید ایجاد می شود. در نهایت نتایج نهایی بر روی سیستم فایل توزیع شده Hadoop یا HDFS نوشته می شود.&amp;lt;ref name=&amp;quot;r6&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Architecture.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
سیستم فایل توزیع شده Hadoop دارای یک معماری master-slave بوده و از اجزای زیر تشکیل شده است:&lt;br /&gt;
'''Namenode:''' گره ای که Namenode بر روی آن نصب می شود به عنوان گره اصلی (master) بوده و کارهای زیر را انجام می دهد:&lt;br /&gt;
مدیریت namespace سیستم&lt;br /&gt;
*تنظیمات دسترسی کلاینت به فایل ها&lt;br /&gt;
*عملیات سیستمی نظیر تغییرنام، بستن و بازکردن فایل ها و دایرکتوری ها&lt;br /&gt;
&lt;br /&gt;
'''Datanode:''' هر گره در کلاستر دارای یک Datanode می باشد که وظیفه آن مدیریت ذخیره سازی داده در گره مربوطه  است و وظایف زیر را نیز برعهده دارد:&lt;br /&gt;
*انجام عملیات خواندن / نوشتن از سیستم فایل به ازای هر درخواست کلاینت&lt;br /&gt;
*انجام عملیاتی نظیر ایجاد، حذف و تکرار بلاک داده براساس دستور صادره از سوی Namenode&lt;br /&gt;
&lt;br /&gt;
'''Block:''' معمولا داده کاربر در فایل های HDFS ذخیره می شود. هر فایل در فایل سیستم به یک یا چندین segment جهت ذخیره سازی بر روی Datanode های مختلف تقسیم می شود. به هریک از این segment ها یک بلاک گفته می شود. اندازه پیش فرض بلاک 64 مگابایت است که می توان برحسب نیاز آن را افزایش داد.&lt;br /&gt;
&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می باشد. در واقع یک فریم ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به کار گرفته شد. از مزیت های آن بهبود مدیریت حافظه است. &amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
در واقع هدف از توسعهSpark رفع محدودیت های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم های قبلی بود. ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations) می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark از زبان های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. &amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlibاست.&lt;br /&gt;
Spark با استفاده از بلاک هایی موسوم به RDD که مورد استفاده آنها در بازیابی داده های خراب است، از تکرار داده ها جلوگیری نموده و کارایی را بالا می برد.&lt;br /&gt;
یکی از اهداف پیاده سازی Spark، سرویس دهی به برنامه هایی است که نیاز به تاخیر کم (نزدیک به بلادرنگ) دارند.&lt;br /&gt;
[[پرونده:Spark.png|400px|قاب|وسط]]&lt;br /&gt;
اجزای Spark عبارتند از:&lt;br /&gt;
#Spark Core: قلب Spark بوده و عملیاتی نظیر زمانبندی کارها را برعهده دارد. وظیفه اصلی Spark Core مدیریت مجموعه بلاک های RDD است که در ادامه توضیحات کاملی در مورد آنها ارایه خواهد شد.&lt;br /&gt;
#Spark SQL: ماژولی که با ترکیب پرس و جوهای SQL با الگوریتم های تحلیلی پیچیده امکان کار با داده های ساختیافته را برای کابران آشنا به DBMS ارایه می کند.&lt;br /&gt;
#Spark Streaming: این ماژول با پشتیبانی از تحمل پذیری خطا و مقیاس پذیری، برای پردازش جریانی از داده ها به کار می رود و قابلیت یکپارچه سازی با ابزارهای جریان داده نظیر Flume را دارا می باشد.&lt;br /&gt;
#MLib:کتابخانه یادگیری ماشین در وضعیت مقیاس پذیر می باشد و مجموعه ای از الگوریتم های آماری و یادگیری ماشین نظیر تست های رگرسیون و classification را پیاده سازی می کند.&lt;br /&gt;
#GraphX: تحلیل و محاسبات داده را بر پایه گراف و الگوریتم ها و پردازش های گرافی انجام می دهد.&lt;br /&gt;
#Spark R: این ماژول مکانیزم تحلیل داده را با ارایه مکانیزم های سبک و قابل فهم، تسهیل می کند.&lt;br /&gt;
&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.&amp;lt;ref name=&amp;quot;r3&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستند که در واقع مجموعه هایی از اشیاء بخش-بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاسترشده توزیع شده اند و می توانند به صورت موازی کار کنند. به RDD های ایجاد شده توسط کاربر تبدیل یا Transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark  به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
مدل های نگاشت کاهشی یا Map-Reduce در واقع مدل های محاسباتی برای سرورهای توزیع شده در مقیاس افقی و با حجم داده بسیار بالا در حد پتابایت می باشند. اهداف اصلی این مدل ها در واقع نگاشت و کاهش نیست، بلکه فراتر بوده و در واقع کارایی آنها در تحمل پذیری خطا و تکرار داده مشخص می شود. لذا در موقعیتی که تنها بر روی یک گره عمل می کنند، حتی ممکن است کارایی آنها از مدل های سنتی نیز پایین تر بیاید.&lt;br /&gt;
ابزار Hadoop در واقع اولین ابزار مدل نگاشت کاهشی است که گاهی از آن با نام MapReduce نیز یاد می شود. این ابزار در مقایسه با ابزار Spark به دلیل عدم امکان تعامل با حافظه اصلی از کارایی پایین تری برخوردار است. &lt;br /&gt;
از دیگر خصوصیات متمایزکننده Spark استفاده از بلاک های RDD است که کارایی این ابزار را در تحمل پذیری خطا و همچنین صرفه جویی در مصرف دیسک (به دلیل عدم نیاز به تکرار داده) دوچندان می کند.&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=14162</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=14162"/>
		<updated>2016-03-06T01:34:19Z</updated>

		<summary type="html">&lt;p&gt;94131572: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
&lt;br /&gt;
==تعاریف و اصطلاحات (فرهنگ داده‌ها)==&lt;br /&gt;
*نگاشت کننده (Mapper): کلاسی که دارای متد map بوده و این متد توسط برنامه نویس پیاده سازی شده و عملیات نگاشت توسط آن انجام می گیرد. &amp;lt;ref name=&amp;quot;r6&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
*کاهنده (Reducer): نتایجی که توسط کلاس های نگاشت کننده تولید می شوند، به صورت جفت های کلید-مقدار هستند که برای اعمال عملیات کاهش به کلاس های کاهنده ارسال می شوند. در واقع یک کلاس کاهنده دارای یک متد reduce است که عملیات ادغام مقادیر مربوط به کلید های مشترک را برعهده دارد. &amp;lt;ref name=&amp;quot;r6&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
*سیستم فایل توزیع شده Hadoop یا HDFS: یک سیستم فایل توزیع شده مبتنی بر بلاک و با معماری ذخیره-سازی تکراری (redundant) است که در مدل های نگاشت کاهشی ارایه شده توسط Apache نظیر Hadoop و Spark مورد استفاده قرار می گیرد و دارای کاریی بالا و قابل قبول است. &amp;lt;ref name=&amp;quot;r6&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
*تحمّل در برابر خرابی (Fault Tolerance): در صورتی که در یک شبکه با ایجاد اختلال در یک گره یا چند گره، کل شبکه از کار نیفتد و همچنان شبکه بتواند به سرویس دهی ادامه دهد، آن شبکه دارای قابلیت تحمل در برابر خرابی یا Fault Tolerance است.&lt;br /&gt;
*تکرار (Redundancy): به عملیاتی نظیر پشتیبان‌گیری و تهیه نسخه دیگری از داده‌ها به منظور حفاظت از داده در مقابل خرابی، تکرار یا Redundancy اطلاق می‌شود.&lt;br /&gt;
*Shard: در وضعیت توزیع‌شده به مجموعه ای از سرورها که شامل یک سرور اصلی و چندین سرور Replica می باشد، اصطلاحا Shard اطلاق می شود. درخواست های صادره از موتور جستجو بین Shardها توزیع می شود.&lt;br /&gt;
*Leader: در هر Shard، یک گره به عنوان Leader یا گره اصلی و سایر گره‌ها به عنوان Replica در نظر گرفته می-شوند.&lt;br /&gt;
*Replica: گره یا گره هایی که داده ها بصورت تکراری جهت عملیات حفظ و پشتیبانی، بر روی آنها کپی می شوند.&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&lt;br /&gt;
==تحقیقات جدید راجع به مدل‌های نگاشت‌کاهشی==&lt;br /&gt;
=== روش انتخاب ویژگی تکاملی جهت استفاده در دسته‌بندی (Classification)===&lt;br /&gt;
هدف اصلی از به‌کارگیری متدهای کاهش داده، شفاف‌سازی و ساده‌سازی داده های ورودی و درعین حال، حذف نویز و افزونگی داده و بالا بردن کارایی و دقت سیستم است.&lt;br /&gt;
دو نوع مدل اصلی برای کاهش داده عبارتند از:  سطح نمونه (انتخاب و تولید نمونه) و سطح ویژگی ها (انتخاب و استخراج ویژگی)&lt;br /&gt;
مقاله با عنوان “Evolutionary Feature Selection for Big Data Classification” تکنیک جدیدی برای انتخاب ویژگی‌ها از بین مجموعه‌های بسیار بزرگ داده برای استفاده در تکنیک‌های Classification (که درحال حاضر امکان کار با مجموعه‌های بسیار بزرگ داده را ندارند)، ارایه شده است.&amp;lt;br/&amp;gt;&lt;br /&gt;
در الگوریتم نگاشت کاهشی ارایه شده در این مقاله، فازهای نگاشت و کاهش داده به صورت موازی انجام می شوند و این الگوریتم تحت عنوان “Evolutionary Feature  Selection for Big Data Classification” یا به صورت اختصار MR-EFS معرفی شده است. &amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. &amp;lt;ref name=&amp;quot;r4&amp;quot;&amp;gt;Xing Wu, Yan Liu, Ian Gorton / Exploring Performance Models of Hadoop Applications on Cloud Architecture/2015/[http://dl.acm.org/citation.cfm?id=2737197 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:&amp;lt;ref name=&amp;quot;r2&amp;quot;&amp;gt;Dilpreet Singh and Chandan K Reddy / A survey on platforms for big data analytics/2014/[http://dl.acm.org/citation.cfm?id=2737197 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.&amp;lt;ref name=&amp;quot;r5&amp;quot;&amp;gt; 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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
عملکرد Hadoop به این صورت است که حجم بزرگی از داده ها از یک منبع یا منابع مختلف به صورت موازی خوانده شده و بر روی گره های مختلف که در یک کلاستر قرار دارند، توزیع می شوند. مجموعه گره های داخل یک کلاستر (اصطلاحا Mapperها) توسط یک گره اصلی که اصطلاحا به آن Job Tracker اطلاق می شود، مدیریت می شوند. &lt;br /&gt;
[[پرونده:Hadoop.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
هر Mapper مسئول پردازش مجموعه ای از داده های ورودی است و در هر زمان تنها یک رکورد توسط متد map هر کلاس پردازش خواهد شد. پس از انجام عملیات نگاشت، خروجی ها به کلاس های کاهنده هدایت می شوند و در آنجا مقادیر بر اساس کلیدها ترکیب شده و زوج های کلید-مقدار جدید ایجاد می شود. در نهایت نتایج نهایی بر روی سیستم فایل توزیع شده Hadoop یا HDFS نوشته می شود.&amp;lt;ref name=&amp;quot;r6&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Architecture.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
سیستم فایل توزیع شده Hadoop دارای یک معماری master-slave بوده و از اجزای زیر تشکیل شده است:&lt;br /&gt;
'''Namenode:''' گره ای که Namenode بر روی آن نصب می شود به عنوان گره اصلی (master) بوده و کارهای زیر را انجام می دهد:&lt;br /&gt;
مدیریت namespace سیستم&lt;br /&gt;
*تنظیمات دسترسی کلاینت به فایل ها&lt;br /&gt;
*عملیات سیستمی نظیر تغییرنام، بستن و بازکردن فایل ها و دایرکتوری ها&lt;br /&gt;
&lt;br /&gt;
'''Datanode:''' هر گره در کلاستر دارای یک Datanode می باشد که وظیفه آن مدیریت ذخیره سازی داده در گره مربوطه  است و وظایف زیر را نیز برعهده دارد:&lt;br /&gt;
*انجام عملیات خواندن / نوشتن از سیستم فایل به ازای هر درخواست کلاینت&lt;br /&gt;
*انجام عملیاتی نظیر ایجاد، حذف و تکرار بلاک داده براساس دستور صادره از سوی Namenode&lt;br /&gt;
&lt;br /&gt;
'''Block:''' معمولا داده کاربر در فایل های HDFS ذخیره می شود. هر فایل در فایل سیستم به یک یا چندین segment جهت ذخیره سازی بر روی Datanode های مختلف تقسیم می شود. به هریک از این segment ها یک بلاک گفته می شود. اندازه پیش فرض بلاک 64 مگابایت است که می توان برحسب نیاز آن را افزایش داد.&lt;br /&gt;
&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می باشد. در واقع یک فریم ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به کار گرفته شد. از مزیت های آن بهبود مدیریت حافظه است. &amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
در واقع هدف از توسعهSpark رفع محدودیت های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم های قبلی بود. ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations) می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark از زبان های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. &amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlibاست.&lt;br /&gt;
Spark با استفاده از بلاک هایی موسوم به RDD که مورد استفاده آنها در بازیابی داده های خراب است، از تکرار داده ها جلوگیری نموده و کارایی را بالا می برد.&lt;br /&gt;
یکی از اهداف پیاده سازی Spark، سرویس دهی به برنامه هایی است که نیاز به تاخیر کم (نزدیک به بلادرنگ) دارند.&lt;br /&gt;
[[پرونده:Spark.png|400px|قاب|وسط]]&lt;br /&gt;
اجزای Spark عبارتند از:&lt;br /&gt;
#Spark Core: قلب Spark بوده و عملیاتی نظیر زمانبندی کارها را برعهده دارد. وظیفه اصلی Spark Core مدیریت مجموعه بلاک های RDD است که در ادامه توضیحات کاملی در مورد آنها ارایه خواهد شد.&lt;br /&gt;
#Spark SQL: ماژولی که با ترکیب پرس و جوهای SQL با الگوریتم های تحلیلی پیچیده امکان کار با داده های ساختیافته را برای کابران آشنا به DBMS ارایه می کند.&lt;br /&gt;
#Spark Streaming: این ماژول با پشتیبانی از تحمل پذیری خطا و مقیاس پذیری، برای پردازش جریانی از داده ها به کار می رود و قابلیت یکپارچه سازی با ابزارهای جریان داده نظیر Flume را دارا می باشد.&lt;br /&gt;
#MLib:کتابخانه یادگیری ماشین در وضعیت مقیاس پذیر می باشد و مجموعه ای از الگوریتم های آماری و یادگیری ماشین نظیر تست های رگرسیون و classification را پیاده سازی می کند.&lt;br /&gt;
#GraphX: تحلیل و محاسبات داده را بر پایه گراف و الگوریتم ها و پردازش های گرافی انجام می دهد.&lt;br /&gt;
#Spark R: این ماژول مکانیزم تحلیل داده را با ارایه مکانیزم های سبک و قابل فهم، تسهیل می کند.&lt;br /&gt;
&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.&amp;lt;ref name=&amp;quot;r3&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستند که در واقع مجموعه هایی از اشیاء بخش-بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاسترشده توزیع شده اند و می توانند به صورت موازی کار کنند. به RDD های ایجاد شده توسط کاربر تبدیل یا Transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark  به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
مدل های نگاشت کاهشی یا Map-Reduce در واقع مدل های محاسباتی برای سرورهای توزیع شده در مقیاس افقی و با حجم داده بسیار بالا در حد پتابایت می باشند. اهداف اصلی این مدل ها در واقع نگاشت و کاهش نیست، بلکه فراتر بوده و در واقع کارایی آنها در تحمل پذیری خطا و تکرار داده مشخص می شود. لذا در موقعیتی که تنها بر روی یک گره عمل می کنند، حتی ممکن است کارایی آنها از مدل های سنتی نیز پایین تر بیاید.&lt;br /&gt;
ابزار Hadoop در واقع اولین ابزار مدل نگاشت کاهشی است که گاهی از آن با نام MapReduce نیز یاد می شود. این ابزار در مقایسه با ابزار Spark به دلیل عدم امکان تعامل با حافظه اصلی از کارایی پایین تری برخوردار است. &lt;br /&gt;
از دیگر خصوصیات متمایزکننده Spark استفاده از بلاک های RDD است که کارایی این ابزار را در تحمل پذیری خطا و همچنین صرفه جویی در مصرف دیسک (به دلیل عدم نیاز به تکرار داده) دوچندان می کند.&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=14161</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=14161"/>
		<updated>2016-03-06T01:21:08Z</updated>

		<summary type="html">&lt;p&gt;94131572: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
&lt;br /&gt;
==تعاریف و اصطلاحات (فرهنگ داده‌ها)==&lt;br /&gt;
*نگاشت کننده (Mapper): کلاسی که دارای متد map بوده و این متد توسط برنامه نویس پیاده سازی شده و عملیات نگاشت توسط آن انجام می گیرد. &amp;lt;ref name=&amp;quot;r6&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*کاهنده (Reducer): نتایجی که توسط کلاس های نگاشت کننده تولید می شوند، به صورت جفت های کلید-مقدار هستند که برای اعمال عملیات کاهش به کلاس های کاهنده ارسال می شوند. در واقع یک کلاس کاهنده دارای یک متد reduce است که عملیات ادغام مقادیر مربوط به کلید های مشترک را برعهده دارد. &amp;lt;ref name=&amp;quot;r6&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
*سیستم فایل توزیع شده Hadoop یا HDFS: یک سیستم فایل توزیع شده مبتنی بر بلاک و با معماری ذخیره-سازی تکراری (redundant) است که در مدل های نگاشت کاهشی ارایه شده توسط Apache نظیر Hadoop و Spark مورد استفاده قرار می گیرد و دارای کاریی بالا و قابل قبول است. &amp;lt;ref name=&amp;quot;r6&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
*تحمّل در برابر خرابی (Fault Tolerance): در صورتی که در یک شبکه با ایجاد اختلال در یک گره یا چند گره، کل شبکه از کار نیفتد و همچنان شبکه بتواند به سرویس دهی ادامه دهد، آن شبکه دارای قابلیت تحمل در برابر خرابی یا Fault Tolerance است.&lt;br /&gt;
*تکرار (Redundancy): به عملیاتی نظیر پشتیبان‌گیری و تهیه نسخه دیگری از داده‌ها به منظور حفاظت از داده در مقابل خرابی، تکرار یا Redundancy اطلاق می‌شود.&lt;br /&gt;
*Shard: در وضعیت توزیع‌شده به مجموعه ای از سرورها که شامل یک سرور اصلی و چندین سرور Replica می باشد، اصطلاحا Shard اطلاق می شود. درخواست های صادره از موتور جستجو بین Shardها توزیع می شود.&lt;br /&gt;
*Leader: در هر Shard، یک گره به عنوان Leader یا گره اصلی و سایر گره‌ها به عنوان Replica در نظر گرفته می-شوند.&lt;br /&gt;
*Replica: گره یا گره هایی که داده ها بصورت تکراری جهت عملیات حفظ و پشتیبانی، بر روی آنها کپی می شوند.&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&lt;br /&gt;
==تحقیقات جدید راجع به مدل‌های نگاشت‌کاهشی==&lt;br /&gt;
=== روش انتخاب ویژگی تکاملی جهت استفاده در دسته‌بندی (Classification)===&lt;br /&gt;
هدف اصلی از به‌کارگیری متدهای کاهش داده، شفاف‌سازی و ساده‌سازی داده های ورودی و درعین حال، حذف نویز و افزونگی داده و بالا بردن کارایی و دقت سیستم است.&lt;br /&gt;
دو نوع مدل اصلی برای کاهش داده عبارتند از:  سطح نمونه (انتخاب و تولید نمونه) و سطح ویژگی ها (انتخاب و استخراج ویژگی)&lt;br /&gt;
مقاله با عنوان “Evolutionary Feature Selection for Big Data Classification” تکنیک جدیدی برای انتخاب ویژگی‌ها از بین مجموعه‌های بسیار بزرگ داده برای استفاده در تکنیک‌های Classification (که درحال حاضر امکان کار با مجموعه‌های بسیار بزرگ داده را ندارند)، ارایه شده است.&amp;lt;br/&amp;gt;&lt;br /&gt;
در الگوریتم نگاشت کاهشی ارایه شده در این مقاله، فازهای نگاشت و کاهش داده به صورت موازی انجام می شوند و این الگوریتم تحت عنوان “Evolutionary Feature  Selection for Big Data Classification” یا به صورت اختصار MR-EFS معرفی شده است. &amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. &amp;lt;ref name=&amp;quot;r4&amp;quot;&amp;gt;Xing Wu, Yan Liu, Ian Gorton / Exploring Performance Models of Hadoop Applications on Cloud Architecture/2015/[http://dl.acm.org/citation.cfm?id=2737197 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.&amp;lt;ref name=&amp;quot;r5&amp;quot;&amp;gt; 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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
عملکرد Hadoop به این صورت است که حجم بزرگی از داده ها از یک منبع یا منابع مختلف به صورت موازی خوانده شده و بر روی گره های مختلف که در یک کلاستر قرار دارند، توزیع می شوند. مجموعه گره های داخل یک کلاستر (اصطلاحا Mapperها) توسط یک گره اصلی که اصطلاحا به آن Job Tracker اطلاق می شود، مدیریت می شوند. &lt;br /&gt;
[[پرونده:Hadoop.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
هر Mapper مسئول پردازش مجموعه ای از داده های ورودی است و در هر زمان تنها یک رکورد توسط متد map هر کلاس پردازش خواهد شد. پس از انجام عملیات نگاشت، خروجی ها به کلاس های کاهنده هدایت می شوند و در آنجا مقادیر بر اساس کلیدها ترکیب شده و زوج های کلید-مقدار جدید ایجاد می شود. در نهایت نتایج نهایی بر روی سیستم فایل توزیع شده Hadoop یا HDFS نوشته می شود.&amp;lt;ref name=&amp;quot;r6&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Architecture.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
سیستم فایل توزیع شده Hadoop دارای یک معماری master-slave بوده و از اجزای زیر تشکیل شده است:&lt;br /&gt;
'''Namenode:''' گره ای که Namenode بر روی آن نصب می شود به عنوان گره اصلی (master) بوده و کارهای زیر را انجام می دهد:&lt;br /&gt;
مدیریت namespace سیستم&lt;br /&gt;
*تنظیمات دسترسی کلاینت به فایل ها&lt;br /&gt;
*عملیات سیستمی نظیر تغییرنام، بستن و بازکردن فایل ها و دایرکتوری ها&lt;br /&gt;
&lt;br /&gt;
'''Datanode:''' هر گره در کلاستر دارای یک Datanode می باشد که وظیفه آن مدیریت ذخیره سازی داده در گره مربوطه  است و وظایف زیر را نیز برعهده دارد:&lt;br /&gt;
*انجام عملیات خواندن / نوشتن از سیستم فایل به ازای هر درخواست کلاینت&lt;br /&gt;
*انجام عملیاتی نظیر ایجاد، حذف و تکرار بلاک داده براساس دستور صادره از سوی Namenode&lt;br /&gt;
&lt;br /&gt;
'''Block:''' معمولا داده کاربر در فایل های HDFS ذخیره می شود. هر فایل در فایل سیستم به یک یا چندین segment جهت ذخیره سازی بر روی Datanode های مختلف تقسیم می شود. به هریک از این segment ها یک بلاک گفته می شود. اندازه پیش فرض بلاک 64 مگابایت است که می توان برحسب نیاز آن را افزایش داد.&lt;br /&gt;
&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می باشد. در واقع یک فریم ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به کار گرفته شد. از مزیت های آن بهبود مدیریت حافظه است. &amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
در واقع هدف از توسعهSpark رفع محدودیت های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم های قبلی بود. ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations) می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark از زبان های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. &amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlibاست.&lt;br /&gt;
Spark با استفاده از بلاک هایی موسوم به RDD که مورد استفاده آنها در بازیابی داده های خراب است، از تکرار داده ها جلوگیری نموده و کارایی را بالا می برد.&lt;br /&gt;
یکی از اهداف پیاده سازی Spark، سرویس دهی به برنامه هایی است که نیاز به تاخیر کم (نزدیک به بلادرنگ) دارند.&lt;br /&gt;
[[پرونده:Spark.png|400px|قاب|وسط]]&lt;br /&gt;
اجزای Spark عبارتند از:&lt;br /&gt;
#Spark Core: قلب Spark بوده و عملیاتی نظیر زمانبندی کارها را برعهده دارد. وظیفه اصلی Spark Core مدیریت مجموعه بلاک های RDD است که در ادامه توضیحات کاملی در مورد آنها ارایه خواهد شد.&lt;br /&gt;
#Spark SQL: ماژولی که با ترکیب پرس و جوهای SQL با الگوریتم های تحلیلی پیچیده امکان کار با داده های ساختیافته را برای کابران آشنا به DBMS ارایه می کند.&lt;br /&gt;
#Spark Streaming: این ماژول با پشتیبانی از تحمل پذیری خطا و مقیاس پذیری، برای پردازش جریانی از داده ها به کار می رود و قابلیت یکپارچه سازی با ابزارهای جریان داده نظیر Flume را دارا می باشد.&lt;br /&gt;
#MLib:کتابخانه یادگیری ماشین در وضعیت مقیاس پذیر می باشد و مجموعه ای از الگوریتم های آماری و یادگیری ماشین نظیر تست های رگرسیون و classification را پیاده سازی می کند.&lt;br /&gt;
#GraphX: تحلیل و محاسبات داده را بر پایه گراف و الگوریتم ها و پردازش های گرافی انجام می دهد.&lt;br /&gt;
#Spark R: این ماژول مکانیزم تحلیل داده را با ارایه مکانیزم های سبک و قابل فهم، تسهیل می کند.&lt;br /&gt;
&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.&amp;lt;ref name=&amp;quot;r3&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستند که در واقع مجموعه هایی از اشیاء بخش-بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاسترشده توزیع شده اند و می توانند به صورت موازی کار کنند. به RDD های ایجاد شده توسط کاربر تبدیل یا Transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark  به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
مدل های نگاشت کاهشی یا Map-Reduce در واقع مدل های محاسباتی برای سرورهای توزیع شده در مقیاس افقی و با حجم داده بسیار بالا در حد پتابایت می باشند. اهداف اصلی این مدل ها در واقع نگاشت و کاهش نیست، بلکه فراتر بوده و در واقع کارایی آنها در تحمل پذیری خطا و تکرار داده مشخص می شود. لذا در موقعیتی که تنها بر روی یک گره عمل می کنند، حتی ممکن است کارایی آنها از مدل های سنتی نیز پایین تر بیاید.&lt;br /&gt;
ابزار Hadoop در واقع اولین ابزار مدل نگاشت کاهشی است که گاهی از آن با نام MapReduce نیز یاد می شود. این ابزار در مقایسه با ابزار Spark به دلیل عدم امکان تعامل با حافظه اصلی از کارایی پایین تری برخوردار است. &lt;br /&gt;
از دیگر خصوصیات متمایزکننده Spark استفاده از بلاک های RDD است که کارایی این ابزار را در تحمل پذیری خطا و همچنین صرفه جویی در مصرف دیسک (به دلیل عدم نیاز به تکرار داده) دوچندان می کند.&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=14160</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=14160"/>
		<updated>2016-03-06T01:17:37Z</updated>

		<summary type="html">&lt;p&gt;94131572: /* تحقیقات جدید راجع به مدل‌های نگاشت‌کاهشی */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
&lt;br /&gt;
==تعاریف و اصطلاحات (فرهنگ داده‌ها)==&lt;br /&gt;
*نگاشت کننده (Mapper): کلاسی که دارای متد map بوده و این متد توسط برنامه نویس پیاده سازی شده و عملیات نگاشت توسط آن انجام می گیرد. &amp;lt;ref name=&amp;quot;r6&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*کاهنده (Reducer): نتایجی که توسط کلاس های نگاشت کننده تولید می شوند، به صورت جفت های کلید-مقدار هستند که برای اعمال عملیات کاهش به کلاس های کاهنده ارسال می شوند. در واقع یک کلاس کاهنده دارای یک متد reduce است که عملیات ادغام مقادیر مربوط به کلید های مشترک را برعهده دارد. &amp;lt;ref name=&amp;quot;r6&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*سیستم فایل توزیع شده Hadoop یا HDFS: یک سیستم فایل توزیع شده مبتنی بر بلاک و با معماری ذخیره-سازی تکراری (redundant) است که در مدل های نگاشت کاهشی ارایه شده توسط Apache نظیر Hadoop و Spark مورد استفاده قرار می گیرد و دارای کاریی بالا و قابل قبول است. &amp;lt;ref name=&amp;quot;r6&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*تحمّل در برابر خرابی (Fault Tolerance): در صورتی که در یک شبکه با ایجاد اختلال در یک گره یا چند گره، کل شبکه از کار نیفتد و همچنان شبکه بتواند به سرویس دهی ادامه دهد، آن شبکه دارای قابلیت تحمل در برابر خرابی یا Fault Tolerance است.&lt;br /&gt;
*تکرار (Redundancy): به عملیاتی نظیر پشتیبان‌گیری و تهیه نسخه دیگری از داده‌ها به منظور حفاظت از داده در مقابل خرابی، تکرار یا Redundancy اطلاق می‌شود.&lt;br /&gt;
*Shard: در وضعیت توزیع‌شده به مجموعه ای از سرورها که شامل یک سرور اصلی و چندین سرور Replica می باشد، اصطلاحا Shard اطلاق می شود. درخواست های صادره از موتور جستجو بین Shardها توزیع می شود.&lt;br /&gt;
*Leader: در هر Shard، یک گره به عنوان Leader یا گره اصلی و سایر گره‌ها به عنوان Replica در نظر گرفته می-شوند.&lt;br /&gt;
*Replica: گره یا گره هایی که داده ها بصورت تکراری جهت عملیات حفظ و پشتیبانی، بر روی آنها کپی می شوند.&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&lt;br /&gt;
==تحقیقات جدید راجع به مدل‌های نگاشت‌کاهشی==&lt;br /&gt;
=== روش انتخاب ویژگی تکاملی جهت استفاده در دسته‌بندی (Classification)===&lt;br /&gt;
هدف اصلی از به‌کارگیری متدهای کاهش داده، شفاف‌سازی و ساده‌سازی داده های ورودی و درعین حال، حذف نویز و افزونگی داده و بالا بردن کارایی و دقت سیستم است.&lt;br /&gt;
دو نوع مدل اصلی برای کاهش داده عبارتند از:  سطح نمونه (انتخاب و تولید نمونه) و سطح ویژگی ها (انتخاب و استخراج ویژگی)&lt;br /&gt;
مقاله با عنوان “Evolutionary Feature Selection for Big Data Classification” تکنیک جدیدی برای انتخاب ویژگی‌ها از بین مجموعه‌های بسیار بزرگ داده برای استفاده در تکنیک‌های Classification (که درحال حاضر امکان کار با مجموعه‌های بسیار بزرگ داده را ندارند)، ارایه شده است.&amp;lt;br/&amp;gt;&lt;br /&gt;
در الگوریتم نگاشت کاهشی ارایه شده در این مقاله، فازهای نگاشت و کاهش داده به صورت موازی انجام می شوند و این الگوریتم تحت عنوان “Evolutionary Feature  Selection for Big Data Classification” یا به صورت اختصار MR-EFS معرفی شده است. &amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. &amp;lt;ref name=&amp;quot;r4&amp;quot;&amp;gt;Xing Wu, Yan Liu, Ian Gorton / Exploring Performance Models of Hadoop Applications on Cloud Architecture/2015/[http://dl.acm.org/citation.cfm?id=2737197 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.&amp;lt;ref name=&amp;quot;r5&amp;quot;&amp;gt; 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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
عملکرد Hadoop به این صورت است که حجم بزرگی از داده ها از یک منبع یا منابع مختلف به صورت موازی خوانده شده و بر روی گره های مختلف که در یک کلاستر قرار دارند، توزیع می شوند. مجموعه گره های داخل یک کلاستر (اصطلاحا Mapperها) توسط یک گره اصلی که اصطلاحا به آن Job Tracker اطلاق می شود، مدیریت می شوند. &lt;br /&gt;
[[پرونده:Hadoop.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
هر Mapper مسئول پردازش مجموعه ای از داده های ورودی است و در هر زمان تنها یک رکورد توسط متد map هر کلاس پردازش خواهد شد. پس از انجام عملیات نگاشت، خروجی ها به کلاس های کاهنده هدایت می شوند و در آنجا مقادیر بر اساس کلیدها ترکیب شده و زوج های کلید-مقدار جدید ایجاد می شود. در نهایت نتایج نهایی بر روی سیستم فایل توزیع شده Hadoop یا HDFS نوشته می شود.&amp;lt;ref name=&amp;quot;r6&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Architecture.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
سیستم فایل توزیع شده Hadoop دارای یک معماری master-slave بوده و از اجزای زیر تشکیل شده است:&lt;br /&gt;
'''Namenode:''' گره ای که Namenode بر روی آن نصب می شود به عنوان گره اصلی (master) بوده و کارهای زیر را انجام می دهد:&lt;br /&gt;
مدیریت namespace سیستم&lt;br /&gt;
*تنظیمات دسترسی کلاینت به فایل ها&lt;br /&gt;
*عملیات سیستمی نظیر تغییرنام، بستن و بازکردن فایل ها و دایرکتوری ها&lt;br /&gt;
&lt;br /&gt;
'''Datanode:''' هر گره در کلاستر دارای یک Datanode می باشد که وظیفه آن مدیریت ذخیره سازی داده در گره مربوطه  است و وظایف زیر را نیز برعهده دارد:&lt;br /&gt;
*انجام عملیات خواندن / نوشتن از سیستم فایل به ازای هر درخواست کلاینت&lt;br /&gt;
*انجام عملیاتی نظیر ایجاد، حذف و تکرار بلاک داده براساس دستور صادره از سوی Namenode&lt;br /&gt;
&lt;br /&gt;
'''Block:''' معمولا داده کاربر در فایل های HDFS ذخیره می شود. هر فایل در فایل سیستم به یک یا چندین segment جهت ذخیره سازی بر روی Datanode های مختلف تقسیم می شود. به هریک از این segment ها یک بلاک گفته می شود. اندازه پیش فرض بلاک 64 مگابایت است که می توان برحسب نیاز آن را افزایش داد.&lt;br /&gt;
&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می¬باشد. در واقع یک فریم¬ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به¬کار گرفته شد. از مزیت¬های آن بهبود مدیریت حافظه است. &amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در واقع هدف از توسعهSpark رفع محدودیت¬های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم¬های قبلی بود. ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations) می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark از زبان¬های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. &amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlibاست.&lt;br /&gt;
Spark با استفاده از بلاک¬هایی موسوم به RDD که مورد استفاده آنها در بازیابی داده¬های خراب است، از تکرار داده¬ها جلوگیری نموده و کارایی را بالا می¬برد.&lt;br /&gt;
یکی از اهداف پیاده¬سازی Spark، سرویس¬دهی به برنامه¬هایی است که نیاز به تاخیر کم (نزدیک به بلادرنگ) دارند.&lt;br /&gt;
[[پرونده:Spark.png|400px|قاب|وسط]]&lt;br /&gt;
اجزای Spark عبارتند از:&lt;br /&gt;
#Spark Core: قلب Spark بوده و عملیاتی نظیر زمانبندی کارها را برعهده دارد. وظیفه اصلی Spark Core مدیریت مجموعه بلاک¬های RDD است که در ادامه توضیحات کاملی در مورد آنها ارایه خواهد شد.&lt;br /&gt;
#Spark SQL: ماژولی که با ترکیب پرس و جوهای SQL با الگوریتم¬های تحلیلی پیچیده امکان کار با داده¬های ساختیافته را برای کابران آشنا به DBMS ارایه می¬کند.&lt;br /&gt;
#Spark Streaming: این ماژول با پشتیبانی از تحمل¬پذیری خطا و مقیاس¬پذیری، برای پردازش جریانی از داده¬ها به کار می¬رود و قابلیت یکپارچه¬سازی با ابزارهای جریان داده نظیر Flume را دارا می¬باشد.&lt;br /&gt;
#MLib:کتابخانه یادگیری ماشین در وضعیت مقیاس¬پذیر می¬باشد و مجموعه¬ای از الگوریتم¬های آماری و یادگیری ماشین نظیر تست¬های رگرسیون و classification را پیاده¬سازی می¬کند.&lt;br /&gt;
#GraphX: تحلیل و محاسبات داده را بر پایه گراف و الگوریتم¬ها و پردازش¬های گرافی انجام می¬دهد.&lt;br /&gt;
#Spark R: این ماژول مکانیزم تحلیل داده را با ارایه مکانیزم¬های سبک و قابل فهم، تسهیل می¬کند.&lt;br /&gt;
&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.&amp;lt;ref name=&amp;quot;r3&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستند که در واقع مجموعه هایی از اشیاء بخش-بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاسترشده توزیع شده اند و می توانند به صورت موازی کار کنند. به RDD های ایجاد شده توسط کاربر تبدیل یا Transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark  به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
مدل های نگاشت کاهشی یا Map-Reduce در واقع مدل های محاسباتی برای سرورهای توزیع شده در مقیاس افقی و با حجم داده بسیار بالا در حد پتابایت می باشند. اهداف اصلی این مدل ها در واقع نگاشت و کاهش نیست، بلکه فراتر بوده و در واقع کارایی آنها در تحمل پذیری خطا و تکرار داده مشخص می شود. لذا در موقعیتی که تنها بر روی یک گره عمل می کنند، حتی ممکن است کارایی آنها از مدل های سنتی نیز پایین تر بیاید.&lt;br /&gt;
ابزار Hadoop در واقع اولین ابزار مدل نگاشت کاهشی است که گاهی از آن با نام MapReduce نیز یاد می شود. این ابزار در مقایسه با ابزار Spark به دلیل عدم امکان تعامل با حافظه اصلی از کارایی پایین تری برخوردار است. &lt;br /&gt;
از دیگر خصوصیات متمایزکننده Spark استفاده از بلاک های RDD است که کارایی این ابزار را در تحمل پذیری خطا و همچنین صرفه جویی در مصرف دیسک (به دلیل عدم نیاز به تکرار داده) دوچندان می کند.&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=14159</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=14159"/>
		<updated>2016-03-06T01:15:53Z</updated>

		<summary type="html">&lt;p&gt;94131572: /* تاریخچه و معرفی مدل نگاشت کاهشی */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
&lt;br /&gt;
==تعاریف و اصطلاحات (فرهنگ داده‌ها)==&lt;br /&gt;
*نگاشت کننده (Mapper): کلاسی که دارای متد map بوده و این متد توسط برنامه نویس پیاده سازی شده و عملیات نگاشت توسط آن انجام می گیرد. &amp;lt;ref name=&amp;quot;r6&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*کاهنده (Reducer): نتایجی که توسط کلاس های نگاشت کننده تولید می شوند، به صورت جفت های کلید-مقدار هستند که برای اعمال عملیات کاهش به کلاس های کاهنده ارسال می شوند. در واقع یک کلاس کاهنده دارای یک متد reduce است که عملیات ادغام مقادیر مربوط به کلید های مشترک را برعهده دارد. &amp;lt;ref name=&amp;quot;r6&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*سیستم فایل توزیع شده Hadoop یا HDFS: یک سیستم فایل توزیع شده مبتنی بر بلاک و با معماری ذخیره-سازی تکراری (redundant) است که در مدل های نگاشت کاهشی ارایه شده توسط Apache نظیر Hadoop و Spark مورد استفاده قرار می گیرد و دارای کاریی بالا و قابل قبول است. &amp;lt;ref name=&amp;quot;r6&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*تحمّل در برابر خرابی (Fault Tolerance): در صورتی که در یک شبکه با ایجاد اختلال در یک گره یا چند گره، کل شبکه از کار نیفتد و همچنان شبکه بتواند به سرویس دهی ادامه دهد، آن شبکه دارای قابلیت تحمل در برابر خرابی یا Fault Tolerance است.&lt;br /&gt;
*تکرار (Redundancy): به عملیاتی نظیر پشتیبان‌گیری و تهیه نسخه دیگری از داده‌ها به منظور حفاظت از داده در مقابل خرابی، تکرار یا Redundancy اطلاق می‌شود.&lt;br /&gt;
*Shard: در وضعیت توزیع‌شده به مجموعه ای از سرورها که شامل یک سرور اصلی و چندین سرور Replica می باشد، اصطلاحا Shard اطلاق می شود. درخواست های صادره از موتور جستجو بین Shardها توزیع می شود.&lt;br /&gt;
*Leader: در هر Shard، یک گره به عنوان Leader یا گره اصلی و سایر گره‌ها به عنوان Replica در نظر گرفته می-شوند.&lt;br /&gt;
*Replica: گره یا گره هایی که داده ها بصورت تکراری جهت عملیات حفظ و پشتیبانی، بر روی آنها کپی می شوند.&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&lt;br /&gt;
==تحقیقات جدید راجع به مدل‌های نگاشت‌کاهشی==&lt;br /&gt;
=== روش انتخاب ویژگی تکاملی جهت استفاده در دسته‌بندی (Classification)===&lt;br /&gt;
هدف اصلی از به‌کارگیری متدهای کاهش داده، شفاف‌سازی و ساده‌سازی داده های ورودی و درعین حال، حذف نویز و افزونگی داده و بالا بردن کارایی و دقت سیستم است.&lt;br /&gt;
دو نوع مدل اصلی برای کاهش داده عبارتند از:  سطح نمونه (انتخاب و تولید نمونه) و سطح ویژگی ها (انتخاب و استخراج ویژگی)&lt;br /&gt;
مقاله با عنوان “Evolutionary Feature Selection for Big Data Classification” تکنیک جدیدی برای انتخاب ویژگی‌ها از بین مجموعه‌های بسیار بزرگ داده برای استفاده در تکنیک‌های Classification (که درحال حاضر امکان کار با مجموعه‌های بسیار بزرگ داده را ندارند)، ارایه شده است.&lt;br /&gt;
 در الگوریتم نگاشت کاهشی ارایه شده در این مقاله، فازهای نگاشت و کاهش داده به صورت موازی انجام می شوند و این الگوریتم تحت عنوان “Evolutionary Feature  Selection for Big Data Classification” یا به صورت اختصار MR-EFS معرفی شده است. &amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. &amp;lt;ref name=&amp;quot;r4&amp;quot;&amp;gt;Xing Wu, Yan Liu, Ian Gorton / Exploring Performance Models of Hadoop Applications on Cloud Architecture/2015/[http://dl.acm.org/citation.cfm?id=2737197 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.&amp;lt;ref name=&amp;quot;r5&amp;quot;&amp;gt; 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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
عملکرد Hadoop به این صورت است که حجم بزرگی از داده ها از یک منبع یا منابع مختلف به صورت موازی خوانده شده و بر روی گره های مختلف که در یک کلاستر قرار دارند، توزیع می شوند. مجموعه گره های داخل یک کلاستر (اصطلاحا Mapperها) توسط یک گره اصلی که اصطلاحا به آن Job Tracker اطلاق می شود، مدیریت می شوند. &lt;br /&gt;
[[پرونده:Hadoop.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
هر Mapper مسئول پردازش مجموعه ای از داده های ورودی است و در هر زمان تنها یک رکورد توسط متد map هر کلاس پردازش خواهد شد. پس از انجام عملیات نگاشت، خروجی ها به کلاس های کاهنده هدایت می شوند و در آنجا مقادیر بر اساس کلیدها ترکیب شده و زوج های کلید-مقدار جدید ایجاد می شود. در نهایت نتایج نهایی بر روی سیستم فایل توزیع شده Hadoop یا HDFS نوشته می شود.&amp;lt;ref name=&amp;quot;r6&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Architecture.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
سیستم فایل توزیع شده Hadoop دارای یک معماری master-slave بوده و از اجزای زیر تشکیل شده است:&lt;br /&gt;
'''Namenode:''' گره ای که Namenode بر روی آن نصب می شود به عنوان گره اصلی (master) بوده و کارهای زیر را انجام می دهد:&lt;br /&gt;
مدیریت namespace سیستم&lt;br /&gt;
*تنظیمات دسترسی کلاینت به فایل ها&lt;br /&gt;
*عملیات سیستمی نظیر تغییرنام، بستن و بازکردن فایل ها و دایرکتوری ها&lt;br /&gt;
&lt;br /&gt;
'''Datanode:''' هر گره در کلاستر دارای یک Datanode می باشد که وظیفه آن مدیریت ذخیره سازی داده در گره مربوطه  است و وظایف زیر را نیز برعهده دارد:&lt;br /&gt;
*انجام عملیات خواندن / نوشتن از سیستم فایل به ازای هر درخواست کلاینت&lt;br /&gt;
*انجام عملیاتی نظیر ایجاد، حذف و تکرار بلاک داده براساس دستور صادره از سوی Namenode&lt;br /&gt;
&lt;br /&gt;
'''Block:''' معمولا داده کاربر در فایل های HDFS ذخیره می شود. هر فایل در فایل سیستم به یک یا چندین segment جهت ذخیره سازی بر روی Datanode های مختلف تقسیم می شود. به هریک از این segment ها یک بلاک گفته می شود. اندازه پیش فرض بلاک 64 مگابایت است که می توان برحسب نیاز آن را افزایش داد.&lt;br /&gt;
&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می¬باشد. در واقع یک فریم¬ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به¬کار گرفته شد. از مزیت¬های آن بهبود مدیریت حافظه است. &amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در واقع هدف از توسعهSpark رفع محدودیت¬های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم¬های قبلی بود. ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations) می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark از زبان¬های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. &amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlibاست.&lt;br /&gt;
Spark با استفاده از بلاک¬هایی موسوم به RDD که مورد استفاده آنها در بازیابی داده¬های خراب است، از تکرار داده¬ها جلوگیری نموده و کارایی را بالا می¬برد.&lt;br /&gt;
یکی از اهداف پیاده¬سازی Spark، سرویس¬دهی به برنامه¬هایی است که نیاز به تاخیر کم (نزدیک به بلادرنگ) دارند.&lt;br /&gt;
[[پرونده:Spark.png|400px|قاب|وسط]]&lt;br /&gt;
اجزای Spark عبارتند از:&lt;br /&gt;
#Spark Core: قلب Spark بوده و عملیاتی نظیر زمانبندی کارها را برعهده دارد. وظیفه اصلی Spark Core مدیریت مجموعه بلاک¬های RDD است که در ادامه توضیحات کاملی در مورد آنها ارایه خواهد شد.&lt;br /&gt;
#Spark SQL: ماژولی که با ترکیب پرس و جوهای SQL با الگوریتم¬های تحلیلی پیچیده امکان کار با داده¬های ساختیافته را برای کابران آشنا به DBMS ارایه می¬کند.&lt;br /&gt;
#Spark Streaming: این ماژول با پشتیبانی از تحمل¬پذیری خطا و مقیاس¬پذیری، برای پردازش جریانی از داده¬ها به کار می¬رود و قابلیت یکپارچه¬سازی با ابزارهای جریان داده نظیر Flume را دارا می¬باشد.&lt;br /&gt;
#MLib:کتابخانه یادگیری ماشین در وضعیت مقیاس¬پذیر می¬باشد و مجموعه¬ای از الگوریتم¬های آماری و یادگیری ماشین نظیر تست¬های رگرسیون و classification را پیاده¬سازی می¬کند.&lt;br /&gt;
#GraphX: تحلیل و محاسبات داده را بر پایه گراف و الگوریتم¬ها و پردازش¬های گرافی انجام می¬دهد.&lt;br /&gt;
#Spark R: این ماژول مکانیزم تحلیل داده را با ارایه مکانیزم¬های سبک و قابل فهم، تسهیل می¬کند.&lt;br /&gt;
&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.&amp;lt;ref name=&amp;quot;r3&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستند که در واقع مجموعه هایی از اشیاء بخش-بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاسترشده توزیع شده اند و می توانند به صورت موازی کار کنند. به RDD های ایجاد شده توسط کاربر تبدیل یا Transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark  به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
مدل های نگاشت کاهشی یا Map-Reduce در واقع مدل های محاسباتی برای سرورهای توزیع شده در مقیاس افقی و با حجم داده بسیار بالا در حد پتابایت می باشند. اهداف اصلی این مدل ها در واقع نگاشت و کاهش نیست، بلکه فراتر بوده و در واقع کارایی آنها در تحمل پذیری خطا و تکرار داده مشخص می شود. لذا در موقعیتی که تنها بر روی یک گره عمل می کنند، حتی ممکن است کارایی آنها از مدل های سنتی نیز پایین تر بیاید.&lt;br /&gt;
ابزار Hadoop در واقع اولین ابزار مدل نگاشت کاهشی است که گاهی از آن با نام MapReduce نیز یاد می شود. این ابزار در مقایسه با ابزار Spark به دلیل عدم امکان تعامل با حافظه اصلی از کارایی پایین تری برخوردار است. &lt;br /&gt;
از دیگر خصوصیات متمایزکننده Spark استفاده از بلاک های RDD است که کارایی این ابزار را در تحمل پذیری خطا و همچنین صرفه جویی در مصرف دیسک (به دلیل عدم نیاز به تکرار داده) دوچندان می کند.&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=14158</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=14158"/>
		<updated>2016-03-06T01:14:50Z</updated>

		<summary type="html">&lt;p&gt;94131572: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
&lt;br /&gt;
==تعاریف و اصطلاحات (فرهنگ داده‌ها)==&lt;br /&gt;
*نگاشت کننده (Mapper): کلاسی که دارای متد map بوده و این متد توسط برنامه نویس پیاده سازی شده و عملیات نگاشت توسط آن انجام می گیرد. &amp;lt;ref name=&amp;quot;r6&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*کاهنده (Reducer): نتایجی که توسط کلاس های نگاشت کننده تولید می شوند، به صورت جفت های کلید-مقدار هستند که برای اعمال عملیات کاهش به کلاس های کاهنده ارسال می شوند. در واقع یک کلاس کاهنده دارای یک متد reduce است که عملیات ادغام مقادیر مربوط به کلید های مشترک را برعهده دارد. &amp;lt;ref name=&amp;quot;r6&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*سیستم فایل توزیع شده Hadoop یا HDFS: یک سیستم فایل توزیع شده مبتنی بر بلاک و با معماری ذخیره-سازی تکراری (redundant) است که در مدل های نگاشت کاهشی ارایه شده توسط Apache نظیر Hadoop و Spark مورد استفاده قرار می گیرد و دارای کاریی بالا و قابل قبول است. &amp;lt;ref name=&amp;quot;r6&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*تحمّل در برابر خرابی (Fault Tolerance): در صورتی که در یک شبکه با ایجاد اختلال در یک گره یا چند گره، کل شبکه از کار نیفتد و همچنان شبکه بتواند به سرویس دهی ادامه دهد، آن شبکه دارای قابلیت تحمل در برابر خرابی یا Fault Tolerance است.&lt;br /&gt;
*تکرار (Redundancy): به عملیاتی نظیر پشتیبان‌گیری و تهیه نسخه دیگری از داده‌ها به منظور حفاظت از داده در مقابل خرابی، تکرار یا Redundancy اطلاق می‌شود.&lt;br /&gt;
*Shard: در وضعیت توزیع‌شده به مجموعه ای از سرورها که شامل یک سرور اصلی و چندین سرور Replica می باشد، اصطلاحا Shard اطلاق می شود. درخواست های صادره از موتور جستجو بین Shardها توزیع می شود.&lt;br /&gt;
*Leader: در هر Shard، یک گره به عنوان Leader یا گره اصلی و سایر گره‌ها به عنوان Replica در نظر گرفته می-شوند.&lt;br /&gt;
*Replica: گره یا گره هایی که داده ها بصورت تکراری جهت عملیات حفظ و پشتیبانی، بر روی آنها کپی می شوند.&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&lt;br /&gt;
--تحقیقات جدید راجع به مدل‌های نگاشت‌کاهشی--&lt;br /&gt;
--- روش انتخاب ویژگی تکاملی جهت استفاده در دسته‌بندی (Classification)---&lt;br /&gt;
هدف اصلی از به‌کارگیری متدهای کاهش داده، شفاف‌سازی و ساده‌سازی داده های ورودی و درعین حال، حذف نویز و افزونگی داده و بالا بردن کارایی و دقت سیستم است.&lt;br /&gt;
دو نوع مدل اصلی برای کاهش داده عبارتند از:  سطح نمونه (انتخاب و تولید نمونه) و سطح ویژگی ها (انتخاب و استخراج ویژگی)&lt;br /&gt;
مقاله با عنوان “Evolutionary Feature Selection for Big Data Classification” تکنیک جدیدی برای انتخاب ویژگی‌ها از بین مجموعه‌های بسیار بزرگ داده برای استفاده در تکنیک‌های Classification (که درحال حاضر امکان کار با مجموعه‌های بسیار بزرگ داده را ندارند)، ارایه شده است.&lt;br /&gt;
 در الگوریتم نگاشت کاهشی ارایه شده در این مقاله، فازهای نگاشت و کاهش داده به صورت موازی انجام می شوند و این الگوریتم تحت عنوان “Evolutionary Feature  Selection for Big Data Classification” یا به صورت اختصار MR-EFS معرفی شده است. &amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. &amp;lt;ref name=&amp;quot;r4&amp;quot;&amp;gt;Xing Wu, Yan Liu, Ian Gorton / Exploring Performance Models of Hadoop Applications on Cloud Architecture/2015/[http://dl.acm.org/citation.cfm?id=2737197 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.&amp;lt;ref name=&amp;quot;r5&amp;quot;&amp;gt; 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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
عملکرد Hadoop به این صورت است که حجم بزرگی از داده ها از یک منبع یا منابع مختلف به صورت موازی خوانده شده و بر روی گره های مختلف که در یک کلاستر قرار دارند، توزیع می شوند. مجموعه گره های داخل یک کلاستر (اصطلاحا Mapperها) توسط یک گره اصلی که اصطلاحا به آن Job Tracker اطلاق می شود، مدیریت می شوند. &lt;br /&gt;
[[پرونده:Hadoop.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
هر Mapper مسئول پردازش مجموعه ای از داده های ورودی است و در هر زمان تنها یک رکورد توسط متد map هر کلاس پردازش خواهد شد. پس از انجام عملیات نگاشت، خروجی ها به کلاس های کاهنده هدایت می شوند و در آنجا مقادیر بر اساس کلیدها ترکیب شده و زوج های کلید-مقدار جدید ایجاد می شود. در نهایت نتایج نهایی بر روی سیستم فایل توزیع شده Hadoop یا HDFS نوشته می شود.&amp;lt;ref name=&amp;quot;r6&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Architecture.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
سیستم فایل توزیع شده Hadoop دارای یک معماری master-slave بوده و از اجزای زیر تشکیل شده است:&lt;br /&gt;
'''Namenode:''' گره ای که Namenode بر روی آن نصب می شود به عنوان گره اصلی (master) بوده و کارهای زیر را انجام می دهد:&lt;br /&gt;
مدیریت namespace سیستم&lt;br /&gt;
*تنظیمات دسترسی کلاینت به فایل ها&lt;br /&gt;
*عملیات سیستمی نظیر تغییرنام، بستن و بازکردن فایل ها و دایرکتوری ها&lt;br /&gt;
&lt;br /&gt;
'''Datanode:''' هر گره در کلاستر دارای یک Datanode می باشد که وظیفه آن مدیریت ذخیره سازی داده در گره مربوطه  است و وظایف زیر را نیز برعهده دارد:&lt;br /&gt;
*انجام عملیات خواندن / نوشتن از سیستم فایل به ازای هر درخواست کلاینت&lt;br /&gt;
*انجام عملیاتی نظیر ایجاد، حذف و تکرار بلاک داده براساس دستور صادره از سوی Namenode&lt;br /&gt;
&lt;br /&gt;
'''Block:''' معمولا داده کاربر در فایل های HDFS ذخیره می شود. هر فایل در فایل سیستم به یک یا چندین segment جهت ذخیره سازی بر روی Datanode های مختلف تقسیم می شود. به هریک از این segment ها یک بلاک گفته می شود. اندازه پیش فرض بلاک 64 مگابایت است که می توان برحسب نیاز آن را افزایش داد.&lt;br /&gt;
&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می¬باشد. در واقع یک فریم¬ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به¬کار گرفته شد. از مزیت¬های آن بهبود مدیریت حافظه است. &amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در واقع هدف از توسعهSpark رفع محدودیت¬های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم¬های قبلی بود. ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations) می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark از زبان¬های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. &amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlibاست.&lt;br /&gt;
Spark با استفاده از بلاک¬هایی موسوم به RDD که مورد استفاده آنها در بازیابی داده¬های خراب است، از تکرار داده¬ها جلوگیری نموده و کارایی را بالا می¬برد.&lt;br /&gt;
یکی از اهداف پیاده¬سازی Spark، سرویس¬دهی به برنامه¬هایی است که نیاز به تاخیر کم (نزدیک به بلادرنگ) دارند.&lt;br /&gt;
[[پرونده:Spark.png|400px|قاب|وسط]]&lt;br /&gt;
اجزای Spark عبارتند از:&lt;br /&gt;
#Spark Core: قلب Spark بوده و عملیاتی نظیر زمانبندی کارها را برعهده دارد. وظیفه اصلی Spark Core مدیریت مجموعه بلاک¬های RDD است که در ادامه توضیحات کاملی در مورد آنها ارایه خواهد شد.&lt;br /&gt;
#Spark SQL: ماژولی که با ترکیب پرس و جوهای SQL با الگوریتم¬های تحلیلی پیچیده امکان کار با داده¬های ساختیافته را برای کابران آشنا به DBMS ارایه می¬کند.&lt;br /&gt;
#Spark Streaming: این ماژول با پشتیبانی از تحمل¬پذیری خطا و مقیاس¬پذیری، برای پردازش جریانی از داده¬ها به کار می¬رود و قابلیت یکپارچه¬سازی با ابزارهای جریان داده نظیر Flume را دارا می¬باشد.&lt;br /&gt;
#MLib:کتابخانه یادگیری ماشین در وضعیت مقیاس¬پذیر می¬باشد و مجموعه¬ای از الگوریتم¬های آماری و یادگیری ماشین نظیر تست¬های رگرسیون و classification را پیاده¬سازی می¬کند.&lt;br /&gt;
#GraphX: تحلیل و محاسبات داده را بر پایه گراف و الگوریتم¬ها و پردازش¬های گرافی انجام می¬دهد.&lt;br /&gt;
#Spark R: این ماژول مکانیزم تحلیل داده را با ارایه مکانیزم¬های سبک و قابل فهم، تسهیل می¬کند.&lt;br /&gt;
&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.&amp;lt;ref name=&amp;quot;r3&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستند که در واقع مجموعه هایی از اشیاء بخش-بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاسترشده توزیع شده اند و می توانند به صورت موازی کار کنند. به RDD های ایجاد شده توسط کاربر تبدیل یا Transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark  به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
مدل های نگاشت کاهشی یا Map-Reduce در واقع مدل های محاسباتی برای سرورهای توزیع شده در مقیاس افقی و با حجم داده بسیار بالا در حد پتابایت می باشند. اهداف اصلی این مدل ها در واقع نگاشت و کاهش نیست، بلکه فراتر بوده و در واقع کارایی آنها در تحمل پذیری خطا و تکرار داده مشخص می شود. لذا در موقعیتی که تنها بر روی یک گره عمل می کنند، حتی ممکن است کارایی آنها از مدل های سنتی نیز پایین تر بیاید.&lt;br /&gt;
ابزار Hadoop در واقع اولین ابزار مدل نگاشت کاهشی است که گاهی از آن با نام MapReduce نیز یاد می شود. این ابزار در مقایسه با ابزار Spark به دلیل عدم امکان تعامل با حافظه اصلی از کارایی پایین تری برخوردار است. &lt;br /&gt;
از دیگر خصوصیات متمایزکننده Spark استفاده از بلاک های RDD است که کارایی این ابزار را در تحمل پذیری خطا و همچنین صرفه جویی در مصرف دیسک (به دلیل عدم نیاز به تکرار داده) دوچندان می کند.&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=14157</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=14157"/>
		<updated>2016-03-06T01:11:38Z</updated>

		<summary type="html">&lt;p&gt;94131572: /* معرفی ابزار Apache Hadoop */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
&lt;br /&gt;
==تعاریف و اصطلاحات (فرهنگ داده‌ها)==&lt;br /&gt;
*نگاشت کننده (Mapper): کلاسی که دارای متد map بوده و این متد توسط برنامه نویس پیاده سازی شده و عملیات نگاشت توسط آن انجام می گیرد. &amp;lt;ref name=&amp;quot;r6&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*کاهنده (Reducer): نتایجی که توسط کلاس های نگاشت کننده تولید می شوند، به صورت جفت های کلید-مقدار هستند که برای اعمال عملیات کاهش به کلاس های کاهنده ارسال می شوند. در واقع یک کلاس کاهنده دارای یک متد reduce است که عملیات ادغام مقادیر مربوط به کلید های مشترک را برعهده دارد. &amp;lt;ref name=&amp;quot;r6&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*سیستم فایل توزیع شده Hadoop یا HDFS: یک سیستم فایل توزیع شده مبتنی بر بلاک و با معماری ذخیره-سازی تکراری (redundant) است که در مدل های نگاشت کاهشی ارایه شده توسط Apache نظیر Hadoop و Spark مورد استفاده قرار می گیرد و دارای کاریی بالا و قابل قبول است. &amp;lt;ref name=&amp;quot;r6&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*تحمّل در برابر خرابی (Fault Tolerance): در صورتی که در یک شبکه با ایجاد اختلال در یک گره یا چند گره، کل شبکه از کار نیفتد و همچنان شبکه بتواند به سرویس دهی ادامه دهد، آن شبکه دارای قابلیت تحمل در برابر خرابی یا Fault Tolerance است.&lt;br /&gt;
*تکرار (Redundancy): به عملیاتی نظیر پشتیبان‌گیری و تهیه نسخه دیگری از داده‌ها به منظور حفاظت از داده در مقابل خرابی، تکرار یا Redundancy اطلاق می‌شود.&lt;br /&gt;
*Shard: در وضعیت توزیع‌شده به مجموعه ای از سرورها که شامل یک سرور اصلی و چندین سرور Replica می باشد، اصطلاحا Shard اطلاق می شود. درخواست های صادره از موتور جستجو بین Shardها توزیع می شود.&lt;br /&gt;
*Leader: در هر Shard، یک گره به عنوان Leader یا گره اصلی و سایر گره‌ها به عنوان Replica در نظر گرفته می-شوند.&lt;br /&gt;
*Replica: گره یا گره هایی که داده ها بصورت تکراری جهت عملیات حفظ و پشتیبانی، بر روی آنها کپی می شوند.&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. &amp;lt;ref name=&amp;quot;r4&amp;quot;&amp;gt;Xing Wu, Yan Liu, Ian Gorton / Exploring Performance Models of Hadoop Applications on Cloud Architecture/2015/[http://dl.acm.org/citation.cfm?id=2737197 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.&amp;lt;ref name=&amp;quot;r5&amp;quot;&amp;gt; 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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
عملکرد Hadoop به این صورت است که حجم بزرگی از داده ها از یک منبع یا منابع مختلف به صورت موازی خوانده شده و بر روی گره های مختلف که در یک کلاستر قرار دارند، توزیع می شوند. مجموعه گره های داخل یک کلاستر (اصطلاحا Mapperها) توسط یک گره اصلی که اصطلاحا به آن Job Tracker اطلاق می شود، مدیریت می شوند. &lt;br /&gt;
[[پرونده:Hadoop.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
هر Mapper مسئول پردازش مجموعه ای از داده های ورودی است و در هر زمان تنها یک رکورد توسط متد map هر کلاس پردازش خواهد شد. پس از انجام عملیات نگاشت، خروجی ها به کلاس های کاهنده هدایت می شوند و در آنجا مقادیر بر اساس کلیدها ترکیب شده و زوج های کلید-مقدار جدید ایجاد می شود. در نهایت نتایج نهایی بر روی سیستم فایل توزیع شده Hadoop یا HDFS نوشته می شود.&amp;lt;ref name=&amp;quot;r6&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Architecture.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
سیستم فایل توزیع شده Hadoop دارای یک معماری master-slave بوده و از اجزای زیر تشکیل شده است:&lt;br /&gt;
'''Namenode:''' گره ای که Namenode بر روی آن نصب می شود به عنوان گره اصلی (master) بوده و کارهای زیر را انجام می دهد:&lt;br /&gt;
مدیریت namespace سیستم&lt;br /&gt;
*تنظیمات دسترسی کلاینت به فایل ها&lt;br /&gt;
*عملیات سیستمی نظیر تغییرنام، بستن و بازکردن فایل ها و دایرکتوری ها&lt;br /&gt;
&lt;br /&gt;
'''Datanode:''' هر گره در کلاستر دارای یک Datanode می باشد که وظیفه آن مدیریت ذخیره سازی داده در گره مربوطه  است و وظایف زیر را نیز برعهده دارد:&lt;br /&gt;
*انجام عملیات خواندن / نوشتن از سیستم فایل به ازای هر درخواست کلاینت&lt;br /&gt;
*انجام عملیاتی نظیر ایجاد، حذف و تکرار بلاک داده براساس دستور صادره از سوی Namenode&lt;br /&gt;
&lt;br /&gt;
'''Block:''' معمولا داده کاربر در فایل های HDFS ذخیره می شود. هر فایل در فایل سیستم به یک یا چندین segment جهت ذخیره سازی بر روی Datanode های مختلف تقسیم می شود. به هریک از این segment ها یک بلاک گفته می شود. اندازه پیش فرض بلاک 64 مگابایت است که می توان برحسب نیاز آن را افزایش داد.&lt;br /&gt;
&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می¬باشد. در واقع یک فریم¬ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به¬کار گرفته شد. از مزیت¬های آن بهبود مدیریت حافظه است. &amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در واقع هدف از توسعهSpark رفع محدودیت¬های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم¬های قبلی بود. ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations) می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark از زبان¬های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. &amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlibاست.&lt;br /&gt;
Spark با استفاده از بلاک¬هایی موسوم به RDD که مورد استفاده آنها در بازیابی داده¬های خراب است، از تکرار داده¬ها جلوگیری نموده و کارایی را بالا می¬برد.&lt;br /&gt;
یکی از اهداف پیاده¬سازی Spark، سرویس¬دهی به برنامه¬هایی است که نیاز به تاخیر کم (نزدیک به بلادرنگ) دارند.&lt;br /&gt;
[[پرونده:Spark.png|400px|قاب|وسط]]&lt;br /&gt;
اجزای Spark عبارتند از:&lt;br /&gt;
#Spark Core: قلب Spark بوده و عملیاتی نظیر زمانبندی کارها را برعهده دارد. وظیفه اصلی Spark Core مدیریت مجموعه بلاک¬های RDD است که در ادامه توضیحات کاملی در مورد آنها ارایه خواهد شد.&lt;br /&gt;
#Spark SQL: ماژولی که با ترکیب پرس و جوهای SQL با الگوریتم¬های تحلیلی پیچیده امکان کار با داده¬های ساختیافته را برای کابران آشنا به DBMS ارایه می¬کند.&lt;br /&gt;
#Spark Streaming: این ماژول با پشتیبانی از تحمل¬پذیری خطا و مقیاس¬پذیری، برای پردازش جریانی از داده¬ها به کار می¬رود و قابلیت یکپارچه¬سازی با ابزارهای جریان داده نظیر Flume را دارا می¬باشد.&lt;br /&gt;
#MLib:کتابخانه یادگیری ماشین در وضعیت مقیاس¬پذیر می¬باشد و مجموعه¬ای از الگوریتم¬های آماری و یادگیری ماشین نظیر تست¬های رگرسیون و classification را پیاده¬سازی می¬کند.&lt;br /&gt;
#GraphX: تحلیل و محاسبات داده را بر پایه گراف و الگوریتم¬ها و پردازش¬های گرافی انجام می¬دهد.&lt;br /&gt;
#Spark R: این ماژول مکانیزم تحلیل داده را با ارایه مکانیزم¬های سبک و قابل فهم، تسهیل می¬کند.&lt;br /&gt;
&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.&amp;lt;ref name=&amp;quot;r3&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستند که در واقع مجموعه هایی از اشیاء بخش-بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاسترشده توزیع شده اند و می توانند به صورت موازی کار کنند. به RDD های ایجاد شده توسط کاربر تبدیل یا Transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark  به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
مدل های نگاشت کاهشی یا Map-Reduce در واقع مدل های محاسباتی برای سرورهای توزیع شده در مقیاس افقی و با حجم داده بسیار بالا در حد پتابایت می باشند. اهداف اصلی این مدل ها در واقع نگاشت و کاهش نیست، بلکه فراتر بوده و در واقع کارایی آنها در تحمل پذیری خطا و تکرار داده مشخص می شود. لذا در موقعیتی که تنها بر روی یک گره عمل می کنند، حتی ممکن است کارایی آنها از مدل های سنتی نیز پایین تر بیاید.&lt;br /&gt;
ابزار Hadoop در واقع اولین ابزار مدل نگاشت کاهشی است که گاهی از آن با نام MapReduce نیز یاد می شود. این ابزار در مقایسه با ابزار Spark به دلیل عدم امکان تعامل با حافظه اصلی از کارایی پایین تری برخوردار است. &lt;br /&gt;
از دیگر خصوصیات متمایزکننده Spark استفاده از بلاک های RDD است که کارایی این ابزار را در تحمل پذیری خطا و همچنین صرفه جویی در مصرف دیسک (به دلیل عدم نیاز به تکرار داده) دوچندان می کند.&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=14156</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=14156"/>
		<updated>2016-03-06T01:09:31Z</updated>

		<summary type="html">&lt;p&gt;94131572: /* معرفی ابزار Apache Hadoop */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
&lt;br /&gt;
==تعاریف و اصطلاحات (فرهنگ داده‌ها)==&lt;br /&gt;
*نگاشت کننده (Mapper): کلاسی که دارای متد map بوده و این متد توسط برنامه نویس پیاده سازی شده و عملیات نگاشت توسط آن انجام می گیرد. &amp;lt;ref name=&amp;quot;r6&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*کاهنده (Reducer): نتایجی که توسط کلاس های نگاشت کننده تولید می شوند، به صورت جفت های کلید-مقدار هستند که برای اعمال عملیات کاهش به کلاس های کاهنده ارسال می شوند. در واقع یک کلاس کاهنده دارای یک متد reduce است که عملیات ادغام مقادیر مربوط به کلید های مشترک را برعهده دارد. &amp;lt;ref name=&amp;quot;r6&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*سیستم فایل توزیع شده Hadoop یا HDFS: یک سیستم فایل توزیع شده مبتنی بر بلاک و با معماری ذخیره-سازی تکراری (redundant) است که در مدل های نگاشت کاهشی ارایه شده توسط Apache نظیر Hadoop و Spark مورد استفاده قرار می گیرد و دارای کاریی بالا و قابل قبول است. &amp;lt;ref name=&amp;quot;r6&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*تحمّل در برابر خرابی (Fault Tolerance): در صورتی که در یک شبکه با ایجاد اختلال در یک گره یا چند گره، کل شبکه از کار نیفتد و همچنان شبکه بتواند به سرویس دهی ادامه دهد، آن شبکه دارای قابلیت تحمل در برابر خرابی یا Fault Tolerance است.&lt;br /&gt;
*تکرار (Redundancy): به عملیاتی نظیر پشتیبان‌گیری و تهیه نسخه دیگری از داده‌ها به منظور حفاظت از داده در مقابل خرابی، تکرار یا Redundancy اطلاق می‌شود.&lt;br /&gt;
*Shard: در وضعیت توزیع‌شده به مجموعه ای از سرورها که شامل یک سرور اصلی و چندین سرور Replica می باشد، اصطلاحا Shard اطلاق می شود. درخواست های صادره از موتور جستجو بین Shardها توزیع می شود.&lt;br /&gt;
*Leader: در هر Shard، یک گره به عنوان Leader یا گره اصلی و سایر گره‌ها به عنوان Replica در نظر گرفته می-شوند.&lt;br /&gt;
*Replica: گره یا گره هایی که داده ها بصورت تکراری جهت عملیات حفظ و پشتیبانی، بر روی آنها کپی می شوند.&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. &amp;lt;ref name=&amp;quot;r4&amp;quot;&amp;gt;Xing Wu, Yan Liu, Ian Gorton / Exploring Performance Models of Hadoop Applications on Cloud Architecture/2015/[http://dl.acm.org/citation.cfm?id=2737197 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.&amp;lt;ref name=&amp;quot;r5&amp;quot;&amp;gt; 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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
عملکرد Hadoop به این صورت است که حجم بزرگی از داده ها از یک منبع یا منابع مختلف به صورت موازی خوانده شده و بر روی گره های مختلف که در یک کلاستر قرار دارند، توزیع می شوند. مجموعه گره های داخل یک کلاستر (اصطلاحا Mapperها) توسط یک گره اصلی که اصطلاحا به آن Job Tracker اطلاق می شود، مدیریت می شوند. &lt;br /&gt;
[[پرونده:Hadoop.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
هر Mapper مسئول پردازش مجموعه ای از داده های ورودی است و در هر زمان تنها یک رکورد توسط متد map هر کلاس پردازش خواهد شد. پس از انجام عملیات نگاشت، خروجی ها به کلاس های کاهنده هدایت می شوند و در آنجا مقادیر بر اساس کلیدها ترکیب شده و زوج های کلید-مقدار جدید ایجاد می شود. در نهایت نتایج نهایی بر روی سیستم فایل توزیع شده Hadoop یا HDFS نوشته می شود.&amp;lt;ref name=&amp;quot;r6&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Architecture.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
سیستم فایل توزیع شده Hadoop دارای یک معماری master-slave بوده و از اجزای زیر تشکیل شده است:&lt;br /&gt;
#Namenode: گره ای که Namenode بر روی آن نصب می شود به عنوان گره اصلی (master) بوده و کارهای زیر را انجام می دهد:&lt;br /&gt;
مدیریت namespace سیستم&lt;br /&gt;
*تنظیمات دسترسی کلاینت به فایل ها&lt;br /&gt;
*عملیات سیستمی نظیر تغییرنام، بستن و بازکردن فایل ها و دایرکتوری ها&lt;br /&gt;
&lt;br /&gt;
#Datanode: هر گره در کلاستر دارای یک Datanode می باشد که وظیفه آن مدیریت ذخیره سازی داده در گره مربوطه  است و وظایف زیر را نیز برعهده دارد:&lt;br /&gt;
*انجام عملیات خواندن / نوشتن از سیستم فایل به ازای هر درخواست کلاینت&lt;br /&gt;
*انجام عملیاتی نظیر ایجاد، حذف و تکرار بلاک داده براساس دستور صادره از سوی Namenode&lt;br /&gt;
&lt;br /&gt;
#Block: معمولا داده کاربر در فایل های HDFS ذخیره می شود. هر فایل در فایل سیستم به یک یا چندین segment جهت ذخیره سازی بر روی Datanode های مختلف تقسیم می شود. به هریک از این segment ها یک بلاک گفته می شود. اندازه پیش فرض بلاک 64 مگابایت است که می توان برحسب نیاز آن را افزایش داد.&lt;br /&gt;
&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می¬باشد. در واقع یک فریم¬ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به¬کار گرفته شد. از مزیت¬های آن بهبود مدیریت حافظه است. &amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در واقع هدف از توسعهSpark رفع محدودیت¬های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم¬های قبلی بود. ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations) می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark از زبان¬های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. &amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlibاست.&lt;br /&gt;
Spark با استفاده از بلاک¬هایی موسوم به RDD که مورد استفاده آنها در بازیابی داده¬های خراب است، از تکرار داده¬ها جلوگیری نموده و کارایی را بالا می¬برد.&lt;br /&gt;
یکی از اهداف پیاده¬سازی Spark، سرویس¬دهی به برنامه¬هایی است که نیاز به تاخیر کم (نزدیک به بلادرنگ) دارند.&lt;br /&gt;
[[پرونده:Spark.png|400px|قاب|وسط]]&lt;br /&gt;
اجزای Spark عبارتند از:&lt;br /&gt;
#Spark Core: قلب Spark بوده و عملیاتی نظیر زمانبندی کارها را برعهده دارد. وظیفه اصلی Spark Core مدیریت مجموعه بلاک¬های RDD است که در ادامه توضیحات کاملی در مورد آنها ارایه خواهد شد.&lt;br /&gt;
#Spark SQL: ماژولی که با ترکیب پرس و جوهای SQL با الگوریتم¬های تحلیلی پیچیده امکان کار با داده¬های ساختیافته را برای کابران آشنا به DBMS ارایه می¬کند.&lt;br /&gt;
#Spark Streaming: این ماژول با پشتیبانی از تحمل¬پذیری خطا و مقیاس¬پذیری، برای پردازش جریانی از داده¬ها به کار می¬رود و قابلیت یکپارچه¬سازی با ابزارهای جریان داده نظیر Flume را دارا می¬باشد.&lt;br /&gt;
#MLib:کتابخانه یادگیری ماشین در وضعیت مقیاس¬پذیر می¬باشد و مجموعه¬ای از الگوریتم¬های آماری و یادگیری ماشین نظیر تست¬های رگرسیون و classification را پیاده¬سازی می¬کند.&lt;br /&gt;
#GraphX: تحلیل و محاسبات داده را بر پایه گراف و الگوریتم¬ها و پردازش¬های گرافی انجام می¬دهد.&lt;br /&gt;
#Spark R: این ماژول مکانیزم تحلیل داده را با ارایه مکانیزم¬های سبک و قابل فهم، تسهیل می¬کند.&lt;br /&gt;
&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.&amp;lt;ref name=&amp;quot;r3&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستند که در واقع مجموعه هایی از اشیاء بخش-بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاسترشده توزیع شده اند و می توانند به صورت موازی کار کنند. به RDD های ایجاد شده توسط کاربر تبدیل یا Transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark  به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
مدل های نگاشت کاهشی یا Map-Reduce در واقع مدل های محاسباتی برای سرورهای توزیع شده در مقیاس افقی و با حجم داده بسیار بالا در حد پتابایت می باشند. اهداف اصلی این مدل ها در واقع نگاشت و کاهش نیست، بلکه فراتر بوده و در واقع کارایی آنها در تحمل پذیری خطا و تکرار داده مشخص می شود. لذا در موقعیتی که تنها بر روی یک گره عمل می کنند، حتی ممکن است کارایی آنها از مدل های سنتی نیز پایین تر بیاید.&lt;br /&gt;
ابزار Hadoop در واقع اولین ابزار مدل نگاشت کاهشی است که گاهی از آن با نام MapReduce نیز یاد می شود. این ابزار در مقایسه با ابزار Spark به دلیل عدم امکان تعامل با حافظه اصلی از کارایی پایین تری برخوردار است. &lt;br /&gt;
از دیگر خصوصیات متمایزکننده Spark استفاده از بلاک های RDD است که کارایی این ابزار را در تحمل پذیری خطا و همچنین صرفه جویی در مصرف دیسک (به دلیل عدم نیاز به تکرار داده) دوچندان می کند.&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D9%BE%D8%B1%D9%88%D9%86%D8%AF%D9%87:Hadoop-Architecture.png&amp;diff=14155</id>
		<title>پرونده:Hadoop-Architecture.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D9%BE%D8%B1%D9%88%D9%86%D8%AF%D9%87:Hadoop-Architecture.png&amp;diff=14155"/>
		<updated>2016-03-06T01:05:31Z</updated>

		<summary type="html">&lt;p&gt;94131572: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D9%BE%D8%B1%D9%88%D9%86%D8%AF%D9%87:Hadoop.png&amp;diff=14154</id>
		<title>پرونده:Hadoop.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D9%BE%D8%B1%D9%88%D9%86%D8%AF%D9%87:Hadoop.png&amp;diff=14154"/>
		<updated>2016-03-06T01:03:48Z</updated>

		<summary type="html">&lt;p&gt;94131572: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=14153</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=14153"/>
		<updated>2016-03-06T01:00:16Z</updated>

		<summary type="html">&lt;p&gt;94131572: /* معرفی ابزار Apache Spark */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
&lt;br /&gt;
==تعاریف و اصطلاحات (فرهنگ داده‌ها)==&lt;br /&gt;
*نگاشت کننده (Mapper): کلاسی که دارای متد map بوده و این متد توسط برنامه نویس پیاده سازی شده و عملیات نگاشت توسط آن انجام می گیرد. &amp;lt;ref name=&amp;quot;r6&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*کاهنده (Reducer): نتایجی که توسط کلاس های نگاشت کننده تولید می شوند، به صورت جفت های کلید-مقدار هستند که برای اعمال عملیات کاهش به کلاس های کاهنده ارسال می شوند. در واقع یک کلاس کاهنده دارای یک متد reduce است که عملیات ادغام مقادیر مربوط به کلید های مشترک را برعهده دارد. &amp;lt;ref name=&amp;quot;r6&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*سیستم فایل توزیع شده Hadoop یا HDFS: یک سیستم فایل توزیع شده مبتنی بر بلاک و با معماری ذخیره-سازی تکراری (redundant) است که در مدل های نگاشت کاهشی ارایه شده توسط Apache نظیر Hadoop و Spark مورد استفاده قرار می گیرد و دارای کاریی بالا و قابل قبول است. &amp;lt;ref name=&amp;quot;r6&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*تحمّل در برابر خرابی (Fault Tolerance): در صورتی که در یک شبکه با ایجاد اختلال در یک گره یا چند گره، کل شبکه از کار نیفتد و همچنان شبکه بتواند به سرویس دهی ادامه دهد، آن شبکه دارای قابلیت تحمل در برابر خرابی یا Fault Tolerance است.&lt;br /&gt;
*تکرار (Redundancy): به عملیاتی نظیر پشتیبان‌گیری و تهیه نسخه دیگری از داده‌ها به منظور حفاظت از داده در مقابل خرابی، تکرار یا Redundancy اطلاق می‌شود.&lt;br /&gt;
*Shard: در وضعیت توزیع‌شده به مجموعه ای از سرورها که شامل یک سرور اصلی و چندین سرور Replica می باشد، اصطلاحا Shard اطلاق می شود. درخواست های صادره از موتور جستجو بین Shardها توزیع می شود.&lt;br /&gt;
*Leader: در هر Shard، یک گره به عنوان Leader یا گره اصلی و سایر گره‌ها به عنوان Replica در نظر گرفته می-شوند.&lt;br /&gt;
*Replica: گره یا گره هایی که داده ها بصورت تکراری جهت عملیات حفظ و پشتیبانی، بر روی آنها کپی می شوند.&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. &amp;lt;ref name=&amp;quot;r4&amp;quot;&amp;gt;Xing Wu, Yan Liu, Ian Gorton / Exploring Performance Models of Hadoop Applications on Cloud Architecture/2015/[http://dl.acm.org/citation.cfm?id=2737197 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.&amp;lt;ref name=&amp;quot;r5&amp;quot;&amp;gt; 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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می¬باشد. در واقع یک فریم¬ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به¬کار گرفته شد. از مزیت¬های آن بهبود مدیریت حافظه است. &amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در واقع هدف از توسعهSpark رفع محدودیت¬های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم¬های قبلی بود. ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations) می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark از زبان¬های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. &amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlibاست.&lt;br /&gt;
Spark با استفاده از بلاک¬هایی موسوم به RDD که مورد استفاده آنها در بازیابی داده¬های خراب است، از تکرار داده¬ها جلوگیری نموده و کارایی را بالا می¬برد.&lt;br /&gt;
یکی از اهداف پیاده¬سازی Spark، سرویس¬دهی به برنامه¬هایی است که نیاز به تاخیر کم (نزدیک به بلادرنگ) دارند.&lt;br /&gt;
[[پرونده:Spark.png|400px|قاب|وسط]]&lt;br /&gt;
اجزای Spark عبارتند از:&lt;br /&gt;
#Spark Core: قلب Spark بوده و عملیاتی نظیر زمانبندی کارها را برعهده دارد. وظیفه اصلی Spark Core مدیریت مجموعه بلاک¬های RDD است که در ادامه توضیحات کاملی در مورد آنها ارایه خواهد شد.&lt;br /&gt;
#Spark SQL: ماژولی که با ترکیب پرس و جوهای SQL با الگوریتم¬های تحلیلی پیچیده امکان کار با داده¬های ساختیافته را برای کابران آشنا به DBMS ارایه می¬کند.&lt;br /&gt;
#Spark Streaming: این ماژول با پشتیبانی از تحمل¬پذیری خطا و مقیاس¬پذیری، برای پردازش جریانی از داده¬ها به کار می¬رود و قابلیت یکپارچه¬سازی با ابزارهای جریان داده نظیر Flume را دارا می¬باشد.&lt;br /&gt;
#MLib:کتابخانه یادگیری ماشین در وضعیت مقیاس¬پذیر می¬باشد و مجموعه¬ای از الگوریتم¬های آماری و یادگیری ماشین نظیر تست¬های رگرسیون و classification را پیاده¬سازی می¬کند.&lt;br /&gt;
#GraphX: تحلیل و محاسبات داده را بر پایه گراف و الگوریتم¬ها و پردازش¬های گرافی انجام می¬دهد.&lt;br /&gt;
#Spark R: این ماژول مکانیزم تحلیل داده را با ارایه مکانیزم¬های سبک و قابل فهم، تسهیل می¬کند.&lt;br /&gt;
&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.&amp;lt;ref name=&amp;quot;r3&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستند که در واقع مجموعه هایی از اشیاء بخش-بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاسترشده توزیع شده اند و می توانند به صورت موازی کار کنند. به RDD های ایجاد شده توسط کاربر تبدیل یا Transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark  به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
مدل های نگاشت کاهشی یا Map-Reduce در واقع مدل های محاسباتی برای سرورهای توزیع شده در مقیاس افقی و با حجم داده بسیار بالا در حد پتابایت می باشند. اهداف اصلی این مدل ها در واقع نگاشت و کاهش نیست، بلکه فراتر بوده و در واقع کارایی آنها در تحمل پذیری خطا و تکرار داده مشخص می شود. لذا در موقعیتی که تنها بر روی یک گره عمل می کنند، حتی ممکن است کارایی آنها از مدل های سنتی نیز پایین تر بیاید.&lt;br /&gt;
ابزار Hadoop در واقع اولین ابزار مدل نگاشت کاهشی است که گاهی از آن با نام MapReduce نیز یاد می شود. این ابزار در مقایسه با ابزار Spark به دلیل عدم امکان تعامل با حافظه اصلی از کارایی پایین تری برخوردار است. &lt;br /&gt;
از دیگر خصوصیات متمایزکننده Spark استفاده از بلاک های RDD است که کارایی این ابزار را در تحمل پذیری خطا و همچنین صرفه جویی در مصرف دیسک (به دلیل عدم نیاز به تکرار داده) دوچندان می کند.&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=14152</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=14152"/>
		<updated>2016-03-06T00:59:10Z</updated>

		<summary type="html">&lt;p&gt;94131572: /* معرفی ابزار Apache Spark */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
&lt;br /&gt;
==تعاریف و اصطلاحات (فرهنگ داده‌ها)==&lt;br /&gt;
*نگاشت کننده (Mapper): کلاسی که دارای متد map بوده و این متد توسط برنامه نویس پیاده سازی شده و عملیات نگاشت توسط آن انجام می گیرد. &amp;lt;ref name=&amp;quot;r6&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*کاهنده (Reducer): نتایجی که توسط کلاس های نگاشت کننده تولید می شوند، به صورت جفت های کلید-مقدار هستند که برای اعمال عملیات کاهش به کلاس های کاهنده ارسال می شوند. در واقع یک کلاس کاهنده دارای یک متد reduce است که عملیات ادغام مقادیر مربوط به کلید های مشترک را برعهده دارد. &amp;lt;ref name=&amp;quot;r6&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*سیستم فایل توزیع شده Hadoop یا HDFS: یک سیستم فایل توزیع شده مبتنی بر بلاک و با معماری ذخیره-سازی تکراری (redundant) است که در مدل های نگاشت کاهشی ارایه شده توسط Apache نظیر Hadoop و Spark مورد استفاده قرار می گیرد و دارای کاریی بالا و قابل قبول است. &amp;lt;ref name=&amp;quot;r6&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*تحمّل در برابر خرابی (Fault Tolerance): در صورتی که در یک شبکه با ایجاد اختلال در یک گره یا چند گره، کل شبکه از کار نیفتد و همچنان شبکه بتواند به سرویس دهی ادامه دهد، آن شبکه دارای قابلیت تحمل در برابر خرابی یا Fault Tolerance است.&lt;br /&gt;
*تکرار (Redundancy): به عملیاتی نظیر پشتیبان‌گیری و تهیه نسخه دیگری از داده‌ها به منظور حفاظت از داده در مقابل خرابی، تکرار یا Redundancy اطلاق می‌شود.&lt;br /&gt;
*Shard: در وضعیت توزیع‌شده به مجموعه ای از سرورها که شامل یک سرور اصلی و چندین سرور Replica می باشد، اصطلاحا Shard اطلاق می شود. درخواست های صادره از موتور جستجو بین Shardها توزیع می شود.&lt;br /&gt;
*Leader: در هر Shard، یک گره به عنوان Leader یا گره اصلی و سایر گره‌ها به عنوان Replica در نظر گرفته می-شوند.&lt;br /&gt;
*Replica: گره یا گره هایی که داده ها بصورت تکراری جهت عملیات حفظ و پشتیبانی، بر روی آنها کپی می شوند.&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. &amp;lt;ref name=&amp;quot;r4&amp;quot;&amp;gt;Xing Wu, Yan Liu, Ian Gorton / Exploring Performance Models of Hadoop Applications on Cloud Architecture/2015/[http://dl.acm.org/citation.cfm?id=2737197 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.&amp;lt;ref name=&amp;quot;r5&amp;quot;&amp;gt; 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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می¬باشد. در واقع یک فریم¬ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به¬کار گرفته شد. از مزیت¬های آن بهبود مدیریت حافظه است. &amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در واقع هدف از توسعهSpark رفع محدودیت¬های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم¬های قبلی بود. ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations) می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark از زبان¬های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. &amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlibاست.&lt;br /&gt;
Spark با استفاده از بلاک¬هایی موسوم به RDD که مورد استفاده آنها در بازیابی داده¬های خراب است، از تکرار داده¬ها جلوگیری نموده و کارایی را بالا می¬برد.&lt;br /&gt;
یکی از اهداف پیاده¬سازی Spark، سرویس¬دهی به برنامه¬هایی است که نیاز به تاخیر کم (نزدیک به بلادرنگ) دارند.&lt;br /&gt;
[[پرونده:Spark.png|400px|قاب|وسط]]&lt;br /&gt;
&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.&amp;lt;ref name=&amp;quot;r3&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستند که در واقع مجموعه هایی از اشیاء بخش-بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاسترشده توزیع شده اند و می توانند به صورت موازی کار کنند. به RDD های ایجاد شده توسط کاربر تبدیل یا Transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark  به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
مدل های نگاشت کاهشی یا Map-Reduce در واقع مدل های محاسباتی برای سرورهای توزیع شده در مقیاس افقی و با حجم داده بسیار بالا در حد پتابایت می باشند. اهداف اصلی این مدل ها در واقع نگاشت و کاهش نیست، بلکه فراتر بوده و در واقع کارایی آنها در تحمل پذیری خطا و تکرار داده مشخص می شود. لذا در موقعیتی که تنها بر روی یک گره عمل می کنند، حتی ممکن است کارایی آنها از مدل های سنتی نیز پایین تر بیاید.&lt;br /&gt;
ابزار Hadoop در واقع اولین ابزار مدل نگاشت کاهشی است که گاهی از آن با نام MapReduce نیز یاد می شود. این ابزار در مقایسه با ابزار Spark به دلیل عدم امکان تعامل با حافظه اصلی از کارایی پایین تری برخوردار است. &lt;br /&gt;
از دیگر خصوصیات متمایزکننده Spark استفاده از بلاک های RDD است که کارایی این ابزار را در تحمل پذیری خطا و همچنین صرفه جویی در مصرف دیسک (به دلیل عدم نیاز به تکرار داده) دوچندان می کند.&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D9%BE%D8%B1%D9%88%D9%86%D8%AF%D9%87:Spark.png&amp;diff=14151</id>
		<title>پرونده:Spark.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D9%BE%D8%B1%D9%88%D9%86%D8%AF%D9%87:Spark.png&amp;diff=14151"/>
		<updated>2016-03-06T00:58:16Z</updated>

		<summary type="html">&lt;p&gt;94131572: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=14150</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=14150"/>
		<updated>2016-03-06T00:51:48Z</updated>

		<summary type="html">&lt;p&gt;94131572: /* مقایسه ابزارهای Hadoop و Spark */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
&lt;br /&gt;
==تعاریف و اصطلاحات (فرهنگ داده‌ها)==&lt;br /&gt;
*نگاشت کننده (Mapper): کلاسی که دارای متد map بوده و این متد توسط برنامه نویس پیاده سازی شده و عملیات نگاشت توسط آن انجام می گیرد. &amp;lt;ref name=&amp;quot;r6&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*کاهنده (Reducer): نتایجی که توسط کلاس های نگاشت کننده تولید می شوند، به صورت جفت های کلید-مقدار هستند که برای اعمال عملیات کاهش به کلاس های کاهنده ارسال می شوند. در واقع یک کلاس کاهنده دارای یک متد reduce است که عملیات ادغام مقادیر مربوط به کلید های مشترک را برعهده دارد. &amp;lt;ref name=&amp;quot;r6&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*سیستم فایل توزیع شده Hadoop یا HDFS: یک سیستم فایل توزیع شده مبتنی بر بلاک و با معماری ذخیره-سازی تکراری (redundant) است که در مدل های نگاشت کاهشی ارایه شده توسط Apache نظیر Hadoop و Spark مورد استفاده قرار می گیرد و دارای کاریی بالا و قابل قبول است. &amp;lt;ref name=&amp;quot;r6&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*تحمّل در برابر خرابی (Fault Tolerance): در صورتی که در یک شبکه با ایجاد اختلال در یک گره یا چند گره، کل شبکه از کار نیفتد و همچنان شبکه بتواند به سرویس دهی ادامه دهد، آن شبکه دارای قابلیت تحمل در برابر خرابی یا Fault Tolerance است.&lt;br /&gt;
*تکرار (Redundancy): به عملیاتی نظیر پشتیبان‌گیری و تهیه نسخه دیگری از داده‌ها به منظور حفاظت از داده در مقابل خرابی، تکرار یا Redundancy اطلاق می‌شود.&lt;br /&gt;
*Shard: در وضعیت توزیع‌شده به مجموعه ای از سرورها که شامل یک سرور اصلی و چندین سرور Replica می باشد، اصطلاحا Shard اطلاق می شود. درخواست های صادره از موتور جستجو بین Shardها توزیع می شود.&lt;br /&gt;
*Leader: در هر Shard، یک گره به عنوان Leader یا گره اصلی و سایر گره‌ها به عنوان Replica در نظر گرفته می-شوند.&lt;br /&gt;
*Replica: گره یا گره هایی که داده ها بصورت تکراری جهت عملیات حفظ و پشتیبانی، بر روی آنها کپی می شوند.&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. &amp;lt;ref name=&amp;quot;r4&amp;quot;&amp;gt;Xing Wu, Yan Liu, Ian Gorton / Exploring Performance Models of Hadoop Applications on Cloud Architecture/2015/[http://dl.acm.org/citation.cfm?id=2737197 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.&amp;lt;ref name=&amp;quot;r5&amp;quot;&amp;gt; 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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می باشد. در واقع یک فریم ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به کار گرفته شد. از مزیت های آن بهبود مدیریت حافظه است.&amp;lt;ref name=&amp;quot;r1&amp;quot;&amp;gt;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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در واقع هدف از توسعه Spark رفع محدودیت های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم های قبلی بود.&amp;lt;ref name=&amp;quot;r2&amp;quot;&amp;gt;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&amp;amp;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations)  می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark زبان های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. &amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlib است.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.&amp;lt;ref name=&amp;quot;r3&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستند که در واقع مجموعه هایی از اشیاء بخش-بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاسترشده توزیع شده اند و می توانند به صورت موازی کار کنند. به RDD های ایجاد شده توسط کاربر تبدیل یا Transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark  به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
مدل های نگاشت کاهشی یا Map-Reduce در واقع مدل های محاسباتی برای سرورهای توزیع شده در مقیاس افقی و با حجم داده بسیار بالا در حد پتابایت می باشند. اهداف اصلی این مدل ها در واقع نگاشت و کاهش نیست، بلکه فراتر بوده و در واقع کارایی آنها در تحمل پذیری خطا و تکرار داده مشخص می شود. لذا در موقعیتی که تنها بر روی یک گره عمل می کنند، حتی ممکن است کارایی آنها از مدل های سنتی نیز پایین تر بیاید.&lt;br /&gt;
ابزار Hadoop در واقع اولین ابزار مدل نگاشت کاهشی است که گاهی از آن با نام MapReduce نیز یاد می شود. این ابزار در مقایسه با ابزار Spark به دلیل عدم امکان تعامل با حافظه اصلی از کارایی پایین تری برخوردار است. &lt;br /&gt;
از دیگر خصوصیات متمایزکننده Spark استفاده از بلاک های RDD است که کارایی این ابزار را در تحمل پذیری خطا و همچنین صرفه جویی در مصرف دیسک (به دلیل عدم نیاز به تکرار داده) دوچندان می کند.&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=14149</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=14149"/>
		<updated>2016-03-06T00:46:34Z</updated>

		<summary type="html">&lt;p&gt;94131572: /* نتیجه گیری */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
&lt;br /&gt;
==تعاریف و اصطلاحات (فرهنگ داده‌ها)==&lt;br /&gt;
*نگاشت کننده (Mapper): کلاسی که دارای متد map بوده و این متد توسط برنامه نویس پیاده سازی شده و عملیات نگاشت توسط آن انجام می گیرد. &amp;lt;ref name=&amp;quot;r6&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*کاهنده (Reducer): نتایجی که توسط کلاس های نگاشت کننده تولید می شوند، به صورت جفت های کلید-مقدار هستند که برای اعمال عملیات کاهش به کلاس های کاهنده ارسال می شوند. در واقع یک کلاس کاهنده دارای یک متد reduce است که عملیات ادغام مقادیر مربوط به کلید های مشترک را برعهده دارد. &amp;lt;ref name=&amp;quot;r6&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*سیستم فایل توزیع شده Hadoop یا HDFS: یک سیستم فایل توزیع شده مبتنی بر بلاک و با معماری ذخیره-سازی تکراری (redundant) است که در مدل های نگاشت کاهشی ارایه شده توسط Apache نظیر Hadoop و Spark مورد استفاده قرار می گیرد و دارای کاریی بالا و قابل قبول است. &amp;lt;ref name=&amp;quot;r6&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*تحمّل در برابر خرابی (Fault Tolerance): در صورتی که در یک شبکه با ایجاد اختلال در یک گره یا چند گره، کل شبکه از کار نیفتد و همچنان شبکه بتواند به سرویس دهی ادامه دهد، آن شبکه دارای قابلیت تحمل در برابر خرابی یا Fault Tolerance است.&lt;br /&gt;
*تکرار (Redundancy): به عملیاتی نظیر پشتیبان‌گیری و تهیه نسخه دیگری از داده‌ها به منظور حفاظت از داده در مقابل خرابی، تکرار یا Redundancy اطلاق می‌شود.&lt;br /&gt;
*Shard: در وضعیت توزیع‌شده به مجموعه ای از سرورها که شامل یک سرور اصلی و چندین سرور Replica می باشد، اصطلاحا Shard اطلاق می شود. درخواست های صادره از موتور جستجو بین Shardها توزیع می شود.&lt;br /&gt;
*Leader: در هر Shard، یک گره به عنوان Leader یا گره اصلی و سایر گره‌ها به عنوان Replica در نظر گرفته می-شوند.&lt;br /&gt;
*Replica: گره یا گره هایی که داده ها بصورت تکراری جهت عملیات حفظ و پشتیبانی، بر روی آنها کپی می شوند.&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. &amp;lt;ref name=&amp;quot;r4&amp;quot;&amp;gt;Xing Wu, Yan Liu, Ian Gorton / Exploring Performance Models of Hadoop Applications on Cloud Architecture/2015/[http://dl.acm.org/citation.cfm?id=2737197 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.&amp;lt;ref name=&amp;quot;r5&amp;quot;&amp;gt; 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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می باشد. در واقع یک فریم ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به کار گرفته شد. از مزیت های آن بهبود مدیریت حافظه است.&amp;lt;ref name=&amp;quot;r1&amp;quot;&amp;gt;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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در واقع هدف از توسعه Spark رفع محدودیت های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم های قبلی بود.&amp;lt;ref name=&amp;quot;r2&amp;quot;&amp;gt;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&amp;amp;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations)  می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark زبان های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. &amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlib است.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.&amp;lt;ref name=&amp;quot;r3&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستندکه در واقع مجموعه هایی از اشیا بخش بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاستر شده توزیع شده اند و می توانند به صورت موازی کار کنند. به Rdd های ایجاد شده توسط کاربر تبدیل یا transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال قطعه کد زیر یک RDD ایجاد می کند که پیغام های خطا را از طریق جستجوی خطوطی که با عبارت ERROR آغاز می شوند از یک فایل log استخراج کرده و بر روی کنسول نمایش می دهد.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
 val lines = spark.textFile(“hdfs://...”) &lt;br /&gt;
 val errors = lines.filter(line =&amp;gt; line.startsWith(“ERROR”)) &lt;br /&gt;
 println(“Total errors: “ + errors.count())&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
خط اول یک RDD بر روی یک فایل HDFS تعریف می کند. خط دوم یک تبدیل از نوع غربال برای استخراج یک RDD جدید از خطوط تعریف می کند. و نهایتا خط آخر با فراخو.انی count که نوع دیگری از RDD به نام action است یک نتیجه را برای برنامه (که در اینجا تعداد عناصر RDD است)، باز می گرداند.&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال یک کاربر که قصد رفع یک مشکل را دارد، ممکن است با فراخوانی زیر روی یک کلاستر، بخواهد از بین مجموعه های بسیار بزرگی از داده پیغام های خطا را در حافظه بارگذاری کند:&amp;lt;br /&amp;gt;&lt;br /&gt;
errors.persist()&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
پس از این کار می توان پرس و جوهای مختلفی بر روی داده موجود در حافظه اصلی اجرا نمود.&amp;lt;br /&amp;gt;&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال فرض کنید عملیات زیر توسط کاربر بر روی خطوط خطا انجام شده است:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt; &lt;br /&gt;
 // Count the errors mentioning MySQL&lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).count() &lt;br /&gt;
 // Fetch the MySQL errors as an array of strings &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).collect() &lt;br /&gt;
 // Fetch the time fields of errors mentioning PHP as an array &lt;br /&gt;
 // (assuming time is field number 3 in a tab-separated format): &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“PHP”)) &lt;br /&gt;
 .map(line =&amp;gt; line.split(‘\t’)(3)) .collect()&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
مدل های نگاشت کاهشی یا Map-Reduce در واقع مدل های محاسباتی برای سرورهای توزیع شده در مقیاس افقی و با حجم داده بسیار بالا در حد پتابایت می باشند. اهداف اصلی این مدل ها در واقع نگاشت و کاهش نیست، بلکه فراتر بوده و در واقع کارایی آنها در تحمل پذیری خطا و تکرار داده مشخص می شود. لذا در موقعیتی که تنها بر روی یک گره عمل می کنند، حتی ممکن است کارایی آنها از مدل های سنتی نیز پایین تر بیاید.&lt;br /&gt;
ابزار Hadoop در واقع اولین ابزار مدل نگاشت کاهشی است که گاهی از آن با نام MapReduce نیز یاد می شود. این ابزار در مقایسه با ابزار Spark به دلیل عدم امکان تعامل با حافظه اصلی از کارایی پایین تری برخوردار است. &lt;br /&gt;
از دیگر خصوصیات متمایزکننده Spark استفاده از بلاک های RDD است که کارایی این ابزار را در تحمل پذیری خطا و همچنین صرفه جویی در مصرف دیسک (به دلیل عدم نیاز به تکرار داده) دوچندان می کند.&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=14148</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=14148"/>
		<updated>2016-03-06T00:45:09Z</updated>

		<summary type="html">&lt;p&gt;94131572: /* تعاریف و اصطلاحات (فرهنگ داده‌ها) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
&lt;br /&gt;
==تعاریف و اصطلاحات (فرهنگ داده‌ها)==&lt;br /&gt;
*نگاشت کننده (Mapper): کلاسی که دارای متد map بوده و این متد توسط برنامه نویس پیاده سازی شده و عملیات نگاشت توسط آن انجام می گیرد. &amp;lt;ref name=&amp;quot;r6&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*کاهنده (Reducer): نتایجی که توسط کلاس های نگاشت کننده تولید می شوند، به صورت جفت های کلید-مقدار هستند که برای اعمال عملیات کاهش به کلاس های کاهنده ارسال می شوند. در واقع یک کلاس کاهنده دارای یک متد reduce است که عملیات ادغام مقادیر مربوط به کلید های مشترک را برعهده دارد. &amp;lt;ref name=&amp;quot;r6&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*سیستم فایل توزیع شده Hadoop یا HDFS: یک سیستم فایل توزیع شده مبتنی بر بلاک و با معماری ذخیره-سازی تکراری (redundant) است که در مدل های نگاشت کاهشی ارایه شده توسط Apache نظیر Hadoop و Spark مورد استفاده قرار می گیرد و دارای کاریی بالا و قابل قبول است. &amp;lt;ref name=&amp;quot;r6&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*تحمّل در برابر خرابی (Fault Tolerance): در صورتی که در یک شبکه با ایجاد اختلال در یک گره یا چند گره، کل شبکه از کار نیفتد و همچنان شبکه بتواند به سرویس دهی ادامه دهد، آن شبکه دارای قابلیت تحمل در برابر خرابی یا Fault Tolerance است.&lt;br /&gt;
*تکرار (Redundancy): به عملیاتی نظیر پشتیبان‌گیری و تهیه نسخه دیگری از داده‌ها به منظور حفاظت از داده در مقابل خرابی، تکرار یا Redundancy اطلاق می‌شود.&lt;br /&gt;
*Shard: در وضعیت توزیع‌شده به مجموعه ای از سرورها که شامل یک سرور اصلی و چندین سرور Replica می باشد، اصطلاحا Shard اطلاق می شود. درخواست های صادره از موتور جستجو بین Shardها توزیع می شود.&lt;br /&gt;
*Leader: در هر Shard، یک گره به عنوان Leader یا گره اصلی و سایر گره‌ها به عنوان Replica در نظر گرفته می-شوند.&lt;br /&gt;
*Replica: گره یا گره هایی که داده ها بصورت تکراری جهت عملیات حفظ و پشتیبانی، بر روی آنها کپی می شوند.&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. &amp;lt;ref name=&amp;quot;r4&amp;quot;&amp;gt;Xing Wu, Yan Liu, Ian Gorton / Exploring Performance Models of Hadoop Applications on Cloud Architecture/2015/[http://dl.acm.org/citation.cfm?id=2737197 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.&amp;lt;ref name=&amp;quot;r5&amp;quot;&amp;gt; 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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می باشد. در واقع یک فریم ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به کار گرفته شد. از مزیت های آن بهبود مدیریت حافظه است.&amp;lt;ref name=&amp;quot;r1&amp;quot;&amp;gt;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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در واقع هدف از توسعه Spark رفع محدودیت های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم های قبلی بود.&amp;lt;ref name=&amp;quot;r2&amp;quot;&amp;gt;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&amp;amp;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations)  می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark زبان های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. &amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlib است.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.&amp;lt;ref name=&amp;quot;r3&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستندکه در واقع مجموعه هایی از اشیا بخش بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاستر شده توزیع شده اند و می توانند به صورت موازی کار کنند. به Rdd های ایجاد شده توسط کاربر تبدیل یا transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال قطعه کد زیر یک RDD ایجاد می کند که پیغام های خطا را از طریق جستجوی خطوطی که با عبارت ERROR آغاز می شوند از یک فایل log استخراج کرده و بر روی کنسول نمایش می دهد.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
 val lines = spark.textFile(“hdfs://...”) &lt;br /&gt;
 val errors = lines.filter(line =&amp;gt; line.startsWith(“ERROR”)) &lt;br /&gt;
 println(“Total errors: “ + errors.count())&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
خط اول یک RDD بر روی یک فایل HDFS تعریف می کند. خط دوم یک تبدیل از نوع غربال برای استخراج یک RDD جدید از خطوط تعریف می کند. و نهایتا خط آخر با فراخو.انی count که نوع دیگری از RDD به نام action است یک نتیجه را برای برنامه (که در اینجا تعداد عناصر RDD است)، باز می گرداند.&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال یک کاربر که قصد رفع یک مشکل را دارد، ممکن است با فراخوانی زیر روی یک کلاستر، بخواهد از بین مجموعه های بسیار بزرگی از داده پیغام های خطا را در حافظه بارگذاری کند:&amp;lt;br /&amp;gt;&lt;br /&gt;
errors.persist()&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
پس از این کار می توان پرس و جوهای مختلفی بر روی داده موجود در حافظه اصلی اجرا نمود.&amp;lt;br /&amp;gt;&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال فرض کنید عملیات زیر توسط کاربر بر روی خطوط خطا انجام شده است:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt; &lt;br /&gt;
 // Count the errors mentioning MySQL&lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).count() &lt;br /&gt;
 // Fetch the MySQL errors as an array of strings &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).collect() &lt;br /&gt;
 // Fetch the time fields of errors mentioning PHP as an array &lt;br /&gt;
 // (assuming time is field number 3 in a tab-separated format): &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“PHP”)) &lt;br /&gt;
 .map(line =&amp;gt; line.split(‘\t’)(3)) .collect()&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=14147</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=14147"/>
		<updated>2016-03-06T00:42:37Z</updated>

		<summary type="html">&lt;p&gt;94131572: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
&lt;br /&gt;
==تعاریف و اصطلاحات (فرهنگ داده‌ها)==&lt;br /&gt;
*نگاشت¬کننده (Mapper): کلاسی که دارای متد map بوده و این متد توسط برنامه¬نویس پیاده¬سازی شده و عملیات نگاشت توسط آن انجام می¬گیرد. &amp;lt;ref name=&amp;quot;r6&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*کاهنده (Reducer): نتایجی که توسط کلاس¬های نگاشت¬کننده تولید می¬شوند، به صورت جفت¬های کلید-مقدار هستند که برای اعمال عملیات کاهش به کلاس¬های کاهنده ارسال می¬شوند. در واقع یک کلاس کاهنده دارای یک متد reduce است که عملیات ادغام مقادیر مربوط به کلید¬های مشترک را برعهده دارد. &amp;lt;ref name=&amp;quot;r6&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*سیستم فایل توزیع شده Hadoop یا HDFS: یک سیستم فایل توزیع¬شده مبتنی بر بلاک و با معماری ذخیره-سازی تکراری (redundant) است که در مدل¬های نگاشت کاهشی ارایه شده توسط Apache نظیر Hadoop و Spark مورد استفاده قرار می¬گیرد و دارای کاریی بالا و قابل قبول است. &amp;lt;ref name=&amp;quot;r6&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*تحمّل در برابر خرابی (Fault Tolerance): در صورتی که در یک شبکه با ایجاد اختلال در یک گره یا چند گره، کل شبکه از کار نیفتد و همچنان شبکه بتواند به سرویس¬دهی ادامه دهد، آن شبکه دارای قابلیت تحمل در برابر خرابی یا Fault Tolerance است.&lt;br /&gt;
*تکرار (Redundancy): به عملیاتی نظیر پشتیبان‌گیری و تهیه نسخه دیگری از داده‌ها به منظور حفاظت از داده در مقابل خرابی، تکرار یا Redundancy اطلاق می‌شود.&lt;br /&gt;
*Shard: در وضعیت توزیع‌شده به مجموعه¬ای از سرورها که شامل یک سرور اصلی و چندین سرور Replica می¬باشد، اصطلاحا Shard اطلاق می¬شود. درخواست¬های صادره از موتور جستجو بین Shardها توزیع می¬شود.&lt;br /&gt;
*Leader: در هر Shard، یک گره به عنوان Leader یا گره اصلی و سایر گره‌ها به عنوان Replica در نظر گرفته می-شوند.&lt;br /&gt;
*Replica: گره یا گره¬هایی که داده¬ها بصورت تکراری جهت عملیات حفظ و پشتیبانی، بر روی آنها کپی می¬شوند.&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. &amp;lt;ref name=&amp;quot;r4&amp;quot;&amp;gt;Xing Wu, Yan Liu, Ian Gorton / Exploring Performance Models of Hadoop Applications on Cloud Architecture/2015/[http://dl.acm.org/citation.cfm?id=2737197 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.&amp;lt;ref name=&amp;quot;r5&amp;quot;&amp;gt; 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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می باشد. در واقع یک فریم ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به کار گرفته شد. از مزیت های آن بهبود مدیریت حافظه است.&amp;lt;ref name=&amp;quot;r1&amp;quot;&amp;gt;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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در واقع هدف از توسعه Spark رفع محدودیت های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم های قبلی بود.&amp;lt;ref name=&amp;quot;r2&amp;quot;&amp;gt;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&amp;amp;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations)  می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark زبان های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. &amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlib است.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.&amp;lt;ref name=&amp;quot;r3&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستندکه در واقع مجموعه هایی از اشیا بخش بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاستر شده توزیع شده اند و می توانند به صورت موازی کار کنند. به Rdd های ایجاد شده توسط کاربر تبدیل یا transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال قطعه کد زیر یک RDD ایجاد می کند که پیغام های خطا را از طریق جستجوی خطوطی که با عبارت ERROR آغاز می شوند از یک فایل log استخراج کرده و بر روی کنسول نمایش می دهد.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
 val lines = spark.textFile(“hdfs://...”) &lt;br /&gt;
 val errors = lines.filter(line =&amp;gt; line.startsWith(“ERROR”)) &lt;br /&gt;
 println(“Total errors: “ + errors.count())&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
خط اول یک RDD بر روی یک فایل HDFS تعریف می کند. خط دوم یک تبدیل از نوع غربال برای استخراج یک RDD جدید از خطوط تعریف می کند. و نهایتا خط آخر با فراخو.انی count که نوع دیگری از RDD به نام action است یک نتیجه را برای برنامه (که در اینجا تعداد عناصر RDD است)، باز می گرداند.&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال یک کاربر که قصد رفع یک مشکل را دارد، ممکن است با فراخوانی زیر روی یک کلاستر، بخواهد از بین مجموعه های بسیار بزرگی از داده پیغام های خطا را در حافظه بارگذاری کند:&amp;lt;br /&amp;gt;&lt;br /&gt;
errors.persist()&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
پس از این کار می توان پرس و جوهای مختلفی بر روی داده موجود در حافظه اصلی اجرا نمود.&amp;lt;br /&amp;gt;&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال فرض کنید عملیات زیر توسط کاربر بر روی خطوط خطا انجام شده است:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt; &lt;br /&gt;
 // Count the errors mentioning MySQL&lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).count() &lt;br /&gt;
 // Fetch the MySQL errors as an array of strings &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).collect() &lt;br /&gt;
 // Fetch the time fields of errors mentioning PHP as an array &lt;br /&gt;
 // (assuming time is field number 3 in a tab-separated format): &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“PHP”)) &lt;br /&gt;
 .map(line =&amp;gt; line.split(‘\t’)(3)) .collect()&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=14146</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=14146"/>
		<updated>2016-03-06T00:40:03Z</updated>

		<summary type="html">&lt;p&gt;94131572: /* تعاریف و اصطلاحات (فرهنگ داده‌ها) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
&lt;br /&gt;
==تعاریف و اصطلاحات (فرهنگ داده‌ها)==&lt;br /&gt;
*نگاشت¬کننده (Mapper): کلاسی که دارای متد map بوده و این متد توسط برنامه¬نویس پیاده¬سازی شده و عملیات نگاشت توسط آن انجام می¬گیرد. &amp;lt;ref name=&amp;quot;r6&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
*کاهنده (Reducer): نتایجی که توسط کلاس¬های نگاشت¬کننده تولید می¬شوند، به صورت جفت¬های کلید-مقدار هستند که برای اعمال عملیات کاهش به کلاس¬های کاهنده ارسال می¬شوند. در واقع یک کلاس کاهنده دارای یک متد reduce است که عملیات ادغام مقادیر مربوط به کلید¬های مشترک را برعهده دارد. [7، صفحه40]&lt;br /&gt;
*سیستم فایل توزیع شده Hadoop یا HDFS: یک سیستم فایل توزیع¬شده مبتنی بر بلاک و با معماری ذخیره-سازی تکراری (redundant) است که در مدل¬های نگاشت کاهشی ارایه شده توسط Apache نظیر Hadoop و Spark مورد استفاده قرار می¬گیرد و دارای کاریی بالا و قابل قبول است. [7، صفحه40]&lt;br /&gt;
*تحمّل در برابر خرابی (Fault Tolerance): در صورتی که در یک شبکه با ایجاد اختلال در یک گره یا چند گره، کل شبکه از کار نیفتد و همچنان شبکه بتواند به سرویس¬دهی ادامه دهد، آن شبکه دارای قابلیت تحمل در برابر خرابی یا Fault Tolerance است.&lt;br /&gt;
*تکرار (Redundancy): به عملیاتی نظیر پشتیبان‌گیری و تهیه نسخه دیگری از داده‌ها به منظور حفاظت از داده در مقابل خرابی، تکرار یا Redundancy اطلاق می‌شود.&lt;br /&gt;
*Shard: در وضعیت توزیع‌شده به مجموعه¬ای از سرورها که شامل یک سرور اصلی و چندین سرور Replica می¬باشد، اصطلاحا Shard اطلاق می¬شود. درخواست¬های صادره از موتور جستجو بین Shardها توزیع می¬شود.&lt;br /&gt;
*Leader: در هر Shard، یک گره به عنوان Leader یا گره اصلی و سایر گره‌ها به عنوان Replica در نظر گرفته می-شوند.&lt;br /&gt;
*Replica: گره یا گره¬هایی که داده¬ها بصورت تکراری جهت عملیات حفظ و پشتیبانی، بر روی آنها کپی می¬شوند.&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. &amp;lt;ref name=&amp;quot;r4&amp;quot;&amp;gt;Xing Wu, Yan Liu, Ian Gorton / Exploring Performance Models of Hadoop Applications on Cloud Architecture/2015/[http://dl.acm.org/citation.cfm?id=2737197 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.&amp;lt;ref name=&amp;quot;r5&amp;quot;&amp;gt; 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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می باشد. در واقع یک فریم ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به کار گرفته شد. از مزیت های آن بهبود مدیریت حافظه است.&amp;lt;ref name=&amp;quot;r1&amp;quot;&amp;gt;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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در واقع هدف از توسعه Spark رفع محدودیت های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم های قبلی بود.&amp;lt;ref name=&amp;quot;r2&amp;quot;&amp;gt;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&amp;amp;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations)  می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark زبان های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. &amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlib است.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.&amp;lt;ref name=&amp;quot;r3&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستندکه در واقع مجموعه هایی از اشیا بخش بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاستر شده توزیع شده اند و می توانند به صورت موازی کار کنند. به Rdd های ایجاد شده توسط کاربر تبدیل یا transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال قطعه کد زیر یک RDD ایجاد می کند که پیغام های خطا را از طریق جستجوی خطوطی که با عبارت ERROR آغاز می شوند از یک فایل log استخراج کرده و بر روی کنسول نمایش می دهد.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
 val lines = spark.textFile(“hdfs://...”) &lt;br /&gt;
 val errors = lines.filter(line =&amp;gt; line.startsWith(“ERROR”)) &lt;br /&gt;
 println(“Total errors: “ + errors.count())&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
خط اول یک RDD بر روی یک فایل HDFS تعریف می کند. خط دوم یک تبدیل از نوع غربال برای استخراج یک RDD جدید از خطوط تعریف می کند. و نهایتا خط آخر با فراخو.انی count که نوع دیگری از RDD به نام action است یک نتیجه را برای برنامه (که در اینجا تعداد عناصر RDD است)، باز می گرداند.&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال یک کاربر که قصد رفع یک مشکل را دارد، ممکن است با فراخوانی زیر روی یک کلاستر، بخواهد از بین مجموعه های بسیار بزرگی از داده پیغام های خطا را در حافظه بارگذاری کند:&amp;lt;br /&amp;gt;&lt;br /&gt;
errors.persist()&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
پس از این کار می توان پرس و جوهای مختلفی بر روی داده موجود در حافظه اصلی اجرا نمود.&amp;lt;br /&amp;gt;&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال فرض کنید عملیات زیر توسط کاربر بر روی خطوط خطا انجام شده است:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt; &lt;br /&gt;
 // Count the errors mentioning MySQL&lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).count() &lt;br /&gt;
 // Fetch the MySQL errors as an array of strings &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).collect() &lt;br /&gt;
 // Fetch the time fields of errors mentioning PHP as an array &lt;br /&gt;
 // (assuming time is field number 3 in a tab-separated format): &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“PHP”)) &lt;br /&gt;
 .map(line =&amp;gt; line.split(‘\t’)(3)) .collect()&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=14145</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=14145"/>
		<updated>2016-03-06T00:35:33Z</updated>

		<summary type="html">&lt;p&gt;94131572: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
&lt;br /&gt;
==تعاریف و اصطلاحات (فرهنگ داده‌ها)==&lt;br /&gt;
*نگاشت¬کننده (Mapper): کلاسی که دارای متد map بوده و این متد توسط برنامه¬نویس پیاده¬سازی شده و عملیات نگاشت توسط آن انجام می¬گیرد. [7، صفحه40]&lt;br /&gt;
*کاهنده (Reducer): نتایجی که توسط کلاس¬های نگاشت¬کننده تولید می¬شوند، به صورت جفت¬های کلید-مقدار هستند که برای اعمال عملیات کاهش به کلاس¬های کاهنده ارسال می¬شوند. در واقع یک کلاس کاهنده دارای یک متد reduce است که عملیات ادغام مقادیر مربوط به کلید¬های مشترک را برعهده دارد. [7، صفحه40]&lt;br /&gt;
*سیستم فایل توزیع شده Hadoop یا HDFS: یک سیستم فایل توزیع¬شده مبتنی بر بلاک و با معماری ذخیره-سازی تکراری (redundant) است که در مدل¬های نگاشت کاهشی ارایه شده توسط Apache نظیر Hadoop و Spark مورد استفاده قرار می¬گیرد و دارای کاریی بالا و قابل قبول است. [7، صفحه40]&lt;br /&gt;
*تحمّل در برابر خرابی (Fault Tolerance): در صورتی که در یک شبکه با ایجاد اختلال در یک گره یا چند گره، کل شبکه از کار نیفتد و همچنان شبکه بتواند به سرویس¬دهی ادامه دهد، آن شبکه دارای قابلیت تحمل در برابر خرابی یا Fault Tolerance است.&lt;br /&gt;
*تکرار (Redundancy): به عملیاتی نظیر پشتیبان‌گیری و تهیه نسخه دیگری از داده‌ها به منظور حفاظت از داده در مقابل خرابی، تکرار یا Redundancy اطلاق می‌شود.&lt;br /&gt;
*Shard: در وضعیت توزیع‌شده به مجموعه¬ای از سرورها که شامل یک سرور اصلی و چندین سرور Replica می¬باشد، اصطلاحا Shard اطلاق می¬شود. درخواست¬های صادره از موتور جستجو بین Shardها توزیع می¬شود.&lt;br /&gt;
*Leader: در هر Shard، یک گره به عنوان Leader یا گره اصلی و سایر گره‌ها به عنوان Replica در نظر گرفته می-شوند.&lt;br /&gt;
*Replica: گره یا گره¬هایی که داده¬ها بصورت تکراری جهت عملیات حفظ و پشتیبانی، بر روی آنها کپی می¬شوند.&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. &amp;lt;ref name=&amp;quot;r4&amp;quot;&amp;gt;Xing Wu, Yan Liu, Ian Gorton / Exploring Performance Models of Hadoop Applications on Cloud Architecture/2015/[http://dl.acm.org/citation.cfm?id=2737197 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.&amp;lt;ref name=&amp;quot;r5&amp;quot;&amp;gt; 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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می باشد. در واقع یک فریم ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به کار گرفته شد. از مزیت های آن بهبود مدیریت حافظه است.&amp;lt;ref name=&amp;quot;r1&amp;quot;&amp;gt;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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در واقع هدف از توسعه Spark رفع محدودیت های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم های قبلی بود.&amp;lt;ref name=&amp;quot;r2&amp;quot;&amp;gt;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&amp;amp;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations)  می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark زبان های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. &amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlib است.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.&amp;lt;ref name=&amp;quot;r3&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستندکه در واقع مجموعه هایی از اشیا بخش بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاستر شده توزیع شده اند و می توانند به صورت موازی کار کنند. به Rdd های ایجاد شده توسط کاربر تبدیل یا transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال قطعه کد زیر یک RDD ایجاد می کند که پیغام های خطا را از طریق جستجوی خطوطی که با عبارت ERROR آغاز می شوند از یک فایل log استخراج کرده و بر روی کنسول نمایش می دهد.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
 val lines = spark.textFile(“hdfs://...”) &lt;br /&gt;
 val errors = lines.filter(line =&amp;gt; line.startsWith(“ERROR”)) &lt;br /&gt;
 println(“Total errors: “ + errors.count())&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
خط اول یک RDD بر روی یک فایل HDFS تعریف می کند. خط دوم یک تبدیل از نوع غربال برای استخراج یک RDD جدید از خطوط تعریف می کند. و نهایتا خط آخر با فراخو.انی count که نوع دیگری از RDD به نام action است یک نتیجه را برای برنامه (که در اینجا تعداد عناصر RDD است)، باز می گرداند.&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال یک کاربر که قصد رفع یک مشکل را دارد، ممکن است با فراخوانی زیر روی یک کلاستر، بخواهد از بین مجموعه های بسیار بزرگی از داده پیغام های خطا را در حافظه بارگذاری کند:&amp;lt;br /&amp;gt;&lt;br /&gt;
errors.persist()&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
پس از این کار می توان پرس و جوهای مختلفی بر روی داده موجود در حافظه اصلی اجرا نمود.&amp;lt;br /&amp;gt;&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال فرض کنید عملیات زیر توسط کاربر بر روی خطوط خطا انجام شده است:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt; &lt;br /&gt;
 // Count the errors mentioning MySQL&lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).count() &lt;br /&gt;
 // Fetch the MySQL errors as an array of strings &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).collect() &lt;br /&gt;
 // Fetch the time fields of errors mentioning PHP as an array &lt;br /&gt;
 // (assuming time is field number 3 in a tab-separated format): &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“PHP”)) &lt;br /&gt;
 .map(line =&amp;gt; line.split(‘\t’)(3)) .collect()&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D9%81%D8%B1%D9%88%D8%B4%DA%AF%D8%A7%D9%87_%DA%A9%D8%AA%D8%A7%D8%A8_%D8%A7%D9%84%DA%A9%D8%AA%D8%B1%D9%88%D9%86%DB%8C%DA%A9%DB%8C&amp;diff=13803</id>
		<title>فروشگاه کتاب الکترونیکی</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D9%81%D8%B1%D9%88%D8%B4%DA%AF%D8%A7%D9%87_%DA%A9%D8%AA%D8%A7%D8%A8_%D8%A7%D9%84%DA%A9%D8%AA%D8%B1%D9%88%D9%86%DB%8C%DA%A9%DB%8C&amp;diff=13803"/>
		<updated>2016-02-02T02:17:56Z</updated>

		<summary type="html">&lt;p&gt;94131572: /* تحلیل مالی */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* موضوع: '''فروشگاه کتاب الکترونیکی'''&lt;br /&gt;
&lt;br /&gt;
* تهیه کننده: سید ابوالفضل هاشمی&lt;br /&gt;
&lt;br /&gt;
== خلاصه اجرایی ==&lt;br /&gt;
از آن جا که امروزه مشغله کاری و زمان های تلف شده افراد با توجه به افزایش حجم کار و ترافیک رو به افزایش است، لذا زنده کردن وقت مرده ( مثل زمانهایی که در انتظار هستیم، زمانی که در اتوبوس می گذرد و ... ) و انجام کارها به طور همزمان دو راه برای ایجاد وقت است که بزرگترین توانایی ما کمک به افراد در ایجاد وقت برای مطالعه است. شعار ما این است: &amp;quot;با ایجاد وقت برای مطالعه از زندگی خود لذت ببرید.&amp;quot; کتابخانه الکترونیکی ما امکان چینش کتاب های شما را یه نحو مطلوب فراهم نموده و ابزار کتابخوان هوشمند ما از طریق ارایه امکانات منحصر به فرد، به شما لذت کتابخوانی را هدیه می کند. مشتریان ما همه اقشار باسواد جامعه خواهند بود. فروشگاه ما یکی از بزرگترین فروشگاه های محتوای دیجیتالی خواهد بود که در آن می توان انواع کتب الکترونیک، کتاب صوتی، سخنرانی، دوره های آموزش مجازی و آثار مکتوب دیگر را به طور قانونی خریداری و مطالعه نمود.&lt;br /&gt;
&lt;br /&gt;
== معرفی شرکت ==&lt;br /&gt;
فروشگاه کتاب الکترونیکی با نام تجاری Book-Zoom فعالیت خود را از تاریخ 1395/01/01 آغاز خواهد نمود.&lt;br /&gt;
آدرس فیزیکی فروشگاه: تهران- میدان انقلاب- ابتدای خیابان دکتر قریب&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
بنیان گذاران Book-Zoom &lt;br /&gt;
*دکتر علی زواره ای فرزند محسن ساکن تهران&lt;br /&gt;
*مهندس صادق آهنگریان فرزند سعید ساکن تهران&lt;br /&gt;
&amp;lt;br /&amp;gt;اهم فعالیت های شرکت عبارتند از&lt;br /&gt;
*فروش الکترونیکی انواع کتاب در دوقالب فیزیکی و دیجیتال&lt;br /&gt;
*توسعه نرم افزار کتاب خوان با قابلیت های منحصر به فرد&lt;br /&gt;
*ارایه خدمات کتابخانه ای به صورت الکترونیکی برای دسته بندی بهتر کتاب ها توسط مشتریان &lt;br /&gt;
=== چارت سازمانی ===&lt;br /&gt;
[[پرونده:Ebook-shop-chart.png|300px|قاب|وسط]]&lt;br /&gt;
&lt;br /&gt;
=== چشم انداز ===&lt;br /&gt;
* ورود به بازارهای جهانی فروش کتاب پس از 6 سال&lt;br /&gt;
* ایجاد شعب فروشگاه در 25 کشور جهان حداکثر تا 10 سال آینده&lt;br /&gt;
&lt;br /&gt;
=== ماموریت ===&lt;br /&gt;
ماموریت اصلی فروشگاه کتاب الکترونیک فروش انواع کتاب به صورت الکترونیکی و ارایه خدمات کتابخانه الکترونیک و کتابخوانی الکترونیکی می باشد.&lt;br /&gt;
&lt;br /&gt;
=== اهداف ===&lt;br /&gt;
* '''اهداف کسب و کار'''&lt;br /&gt;
رساندن موجودی کتاب الکترونیکی به 1000 نسخه و فیزیکی به 1000 جلد تا پایان سال دوم &amp;lt;br /&amp;gt;&lt;br /&gt;
کار در حوزه کتاب های تاریخی، تکنولوژی، علمی پس از سال اول &amp;lt;br /&amp;gt;&lt;br /&gt;
امکان فروش به صورت بین امللی و ارزی تا پایان سال دوم&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''اهداف مالي'''&lt;br /&gt;
بازگشت سرمایه طی سه سال اول &amp;lt;br /&amp;gt;&lt;br /&gt;
رساندن مبلغ فروش ماهیانه به پانصد میلیون ریال تا پایان شش ماه اول &amp;lt;br /&amp;gt;&lt;br /&gt;
شروع کسب درامد از طریق تبلیغات پس از شش ماه اول&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''اهداف پرسنلی '''&lt;br /&gt;
تشکیل تیم تحقیق و توسعه جهت ساخت ابزار و توسعه سایت تا حداکثر سه ماه آینده &amp;lt;br /&amp;gt;&lt;br /&gt;
تشکیل تیم پشتیبانی نرم افزار در سال اول &amp;lt;br /&amp;gt;&lt;br /&gt;
تامین تیم مشاورین تا یک ماه آینده&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''اهداف تحقيق و توسعه'''&lt;br /&gt;
ایجاد یک سیستم مستقل از بستر که به مشتریان اجازه خرید واستفاده از کتاب های مطلوبشان را در هر زمان و هر مکانی و برروی هر ابزار اعم از گوشی موبایل تبلت و یا کامپیوتر شخصی را می دهد.&amp;lt;br /&amp;gt;&lt;br /&gt;
ایجاد ابزار کتابخوان قابل خصوصی سازی توسط مشتری با امکانات کامل&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== معرفی محصولات و خدمات ==&lt;br /&gt;
محصولات این صنعت شامل موارد زیر است:&lt;br /&gt;
*کتاب های تجاری (شامل کتاب های فرهنگی، دانشگاهی و ...)&lt;br /&gt;
*کتاب های مذهبی&lt;br /&gt;
*کتاب های صوتی&lt;br /&gt;
*کتاب های متنی&lt;br /&gt;
*سایر کتاب ها&lt;br /&gt;
*مجلات و روزنامه&lt;br /&gt;
*سایر اقلام مرتبط با این صنعت &lt;br /&gt;
&lt;br /&gt;
خدمات و فعالیت ها شامل موارد زیر هستند:&lt;br /&gt;
*عرضه و فروش کتاب های جدید (شامل کتاب های الکترونیکی)&lt;br /&gt;
*فروش روزنامه، مجلات و سایر نشریات مقطعی (مثل ماهنامه ها و هفته نامه ها)&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===سایت های مشابه داخلی===&lt;br /&gt;
&amp;lt;big&amp;gt;فیدیبو (http://fidibo.com)&amp;lt;br /&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
به نظر می رسد یکی از کاملترین فروشگاه های کتاب الکترونیک داخلی است که مدعی ارایه امکانات زیر است:&lt;br /&gt;
* قالب کتابها pdf نبوده و قابلیت تطبیق پذیری با ابزار مورد استفاده را دارند که باید نرم افزار مربوطه از سایت دانلود و بر روی دستگاه نصب گردد.&lt;br /&gt;
* امکان فروش ریالی و ارزی&lt;br /&gt;
* واسط کاربری فروشگاه چندان دلچسب کاربر نبوده و می تواند از نقاط ضعف فروشگاه به حساب بیاید.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;فراکتاب (http://www.faraketab.ir)&amp;lt;/big&amp;gt;&lt;br /&gt;
* دارای نرم افزار کتابخوان با امکانات اولیه که تنها از سیستم عامل اندروید پشتیبانی می کند.&lt;br /&gt;
* واسط کاربری نه چندان قدرتمند&lt;br /&gt;
* ارایه کتاب های متنی و صوتی&lt;br /&gt;
* امکان فروش فقط به صورت ریالی&lt;br /&gt;
===سایت های مشابه خارجی===&lt;br /&gt;
&amp;lt;big&amp;gt;http://www.amazon.com&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* امکان جستجوی قوی&lt;br /&gt;
* واسط کاربری حرفه ای&lt;br /&gt;
* معرفی سایت های دیگر عرضه کننده کتاب&lt;br /&gt;
* نمایش خلاصه ای از کتاب&lt;br /&gt;
* ارایه پیشنهاد کتاب های مرتبط&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;https://books.google.com&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* امکان جستجوی قدرتمند از طریق موتور جستجوی google&lt;br /&gt;
* امکان مطالعه برخط کتاب در صورت داشتن مجوز یا خارج بودن از قانون کپی رایت&lt;br /&gt;
* امکان خرید یا امانت گرفتن کتاب&lt;br /&gt;
* ارجاع به سایت های دیگر جهت خرید&lt;br /&gt;
* ارایه پیشنهاد کتاب های مرتبط&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;http://www.barnesandnoble.com&amp;lt;br /&amp;gt;&lt;br /&gt;
* واسط کاربری حرفه ای&lt;br /&gt;
* امکان عضویت و ارایه مزایا به اعضا&lt;br /&gt;
* ارایه کتاب های صوتی و متنی&lt;br /&gt;
* امکان مذاکره برخط و چانه زنی&lt;br /&gt;
* فروش کتابخوان، فیلم و موسیقی&lt;br /&gt;
* ارایه پیشنهاد کتاب های مرتبط&lt;br /&gt;
&lt;br /&gt;
===ویژگی های متمایز کننده محصول===&lt;br /&gt;
&lt;br /&gt;
مهم ترین ویژگی های متمایز کننده محصول ما عبارتند از:&amp;lt;br /&amp;gt;&lt;br /&gt;
# ابزار کتابخوان قدرتمند مستقل از بستر که قابل اجرا بر روی تمامی ابزار ها و همچنین قابل خصوصی سازی توسط کاربر است.&amp;lt;br /&amp;gt;&lt;br /&gt;
# عرضه کتاب های الکترونیکی مبتني بر استانداردهاي جهاني صنعت نشر و با رعايت كامل قانون جهاني كپي رايت، طراحي و اجرا خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
# طراحی حرفه ای سایت با امکانات سریع جستجو در شرایطی که اکثر سایت های فروش کتاب ایرانی از امکانات ضعیف طراحی بهره مند می شوند، می تواند فروشگاه ما را از دیگر فروشگاه های الکترونیکی کتاب متمایز نماید.&amp;lt;br /&amp;gt;&lt;br /&gt;
# قیمت کتاب های الکترونیکی به دلیل عدم نیاز به چاپ و کاغذ حدود 20 درصد ارزانتر از کتاب های کاغذی خواهد بود.&amp;lt;br /&amp;gt;&lt;br /&gt;
# وجود کتابخانه الکترونیکی قابل خصوصی سازی توسط مشتری برای سهولت در دسته بندی و چینش کتاب های مورد نظر.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== تحلیل صنعت مادر ==&lt;br /&gt;
در صنعت فروش کتاب، شرکت ها به فروش دامنه وسیعی از کتاب ها در حوزه های مختلف، مجلات، مقالات و کتاب های مقطعی می پردازند. این اقلام می توانند از ناشرین و عرضه کنندگان داخلی و حتی بین المللی خریداری شوند. عاملین فروش کتاب نهایتا این محصولات را از طریق فروشگاه های خود به صورت عمومی به فروش می رسانند. فروشگاه هایی که همه نوع اقلام تجاری را عرضه می کنند و همچنین مراکز پستی از این صنعت مستثنی هستند.&amp;lt;br /&amp;gt;&lt;br /&gt;
فروشگاه های کتاب از گذشته (که تنها روش سنتی امکانپذیر بود،) تاکنون (که روش های نوین فروش مثل روش الکترونیکی به وجود آمده است)، تفاوت های اساسی کرده اند، ولی تنها ماموریت آنها فروش کتاب بوده است. تعداد زیادی از فروشگاه های کتاب سنتی به دلیل بازار شدید رقابتی و کاهش مشتری از میدان به در رفته اند و برخی دیگر که معمولا فروشگاه های بزرگ زنجیره ای کتاب هستند، با ورود به بازارهای اینترنتی همچنان به فعالیت خود ادامه می دهند.&amp;lt;br /&amp;gt;&lt;br /&gt;
آمار (http://www.census.gov/prod/ec02/ec0244i04t.pdf) نشان می دهد که در آمریکا در سال 1997 تعداد فروشگاه کتاب فیزیکی در سه سطح کوچک خرده فروشی مستقل و زنجیره ای بزرگ از 12363 به 10800 در سال 2002 کاهش یافته است که در واقع 12.2 درصد کاهش داشته است. همچنین فروش کتاب فیزیکی نیز از 2007 تاکنون در امریکا 9.6 درصد کاهش داشته است.&lt;br /&gt;
&lt;br /&gt;
== تحلیل صنعت خود ==&lt;br /&gt;
صنعت فروش کتاب فیزیکی در مرحله کاهشی (رو به افول) از چرخه حیات خود می باشد که این موضوع با توجه به بازار محصول اشباع شده و کاهش نرخ رشد، کاملا مشهود است، ولی در نقطه مقابل آن صنعت فروش کتاب الکترونیکی است که تحقیقات بازار نشان می دهد که روز به روز در دنیا و در پی آن در ایران رو به رشد است.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
با استناد به سایت باشگاه خبرنگاران در پژوهش «نظرسنجی از بازدیدکنندگان نمایشگاه» سال 1392 در میان پاسخگویان 35.7 درصد کتاب‌های الکترونیک مطالعه کرده‌اند.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
0.5 درصد از افراد فاقد مطالعه کتب الکترونیک در یک هفته هستند. 6.4 درصد از پاسخگویان کمتر از یک ساعت، 7.9 درصد، یک تا دو ساعت؛ 20.9 درصد، دو ساعت و بیشتر در یک هفته مطالعه کتب الکترونیک داشته‌اند. در این پژوهش، میانگین مدت زمان مطالعه کتب الکترونیکی در یک هفته 233.61 دقیقه، است.&lt;br /&gt;
آمار فوق به علاوه آمار 70.7 درصدی طولانی بودن ساعات اشتغال و تحصیل و نداشتن وقت  نشان می دهد که بازار فروش کتاب الکترونیک به شرط آن که با کیفیت بالا انچام گیرد و بتواند مشتریان را راضی نگاه دارد می تواند آینده روشنی داشته باشد.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== تحلیل بازار ==&lt;br /&gt;
طبق آماری که شرکت [http://www.sbdcnet.org/small-business-research-reports/bookstore-2012 SBDCNet] که از شرکت های فعال در زمینه تحقیقات بازار می باشد؛ ارایه نموده، بازار اصلی هدف در فروش کتاب در امریکا عبارتند از:&lt;br /&gt;
*رده سنی 45 تا 64 سال&lt;br /&gt;
*افراد با درآمد بالا&lt;br /&gt;
*افراد متاهل بدون فرزند&lt;br /&gt;
*افراد متاهل با فرزندان محصل یا دانشجو&lt;br /&gt;
*افراد دانشگاهی&lt;br /&gt;
*افراد ساکن شهرهای بزرگ&lt;br /&gt;
افراد با مدارج دانشگاهی دو برابر سایر مشتریان برای کتاب هزینه می کنند و حدود 57 درصد بازار فروش کتاب را تشکیل می دهند. مشتریان رده سنی 45 تا 64 سال 28 تا 33 درصد بیشتر از سایر سطوح برای کتاب هزینه می کنند. بسیاری از افراد این رده سنی زمان خالی زیادی دارند که می توانند به مطالعه تخصیص دهند. زوج های بدون فرزند 24 درصد و زوج های دارای فرزند محصل حدود 34 تا 42 درصد بیشتر برای کتاب وقت صرف می کنند. جوان های رده 18 تا 24 سال و سالمندان رده سنی 65 به بالاتر، مبالغ  کمتری برای کتاب صرف می کنند.&lt;br /&gt;
[[پرونده:target-market.png|1000px|بندانگشتی|وسط]]&lt;br /&gt;
&lt;br /&gt;
در ایران طبق نتایج پژوهش «نظرسنجی از بازدیدکنندگان نمایشگاه» بیشترین مطالعه انواع کتاب در یکسال گذشته بدین ترتیب است:&lt;br /&gt;
*رمان و داستان (بزرگسالان) 14.79 درصد&lt;br /&gt;
*روانشناسی و تربیتی 11.17 درصد&lt;br /&gt;
*شعر 10.29 درصد&lt;br /&gt;
*تاریخ 9.22 درصد&lt;br /&gt;
*علوم ریاضی، طبیعی و عملی 7.76 درصد&lt;br /&gt;
*دینی 7.45 درصد&lt;br /&gt;
*زبان‌های خارجه 7.29 درصد&lt;br /&gt;
*قرآن و ادعیه 6.33 درصد&lt;br /&gt;
*اجتماعی 5.72 درصد&lt;br /&gt;
*فرهنگ، هنر و معماری 4.76 درصد&lt;br /&gt;
*فلسفی 4.26 درصد&lt;br /&gt;
*سیاسی 3.53 درصد&lt;br /&gt;
*کودک و نوجوان 3.34 درصد&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
طبق نتایج 8.9 درصد پاسخگویان عنوان کرده‌اند اصلاً کتاب‌های غیردرسی مطالعه نمی‌کنند، بیش از نیمی از پاسخگویان (57.4 درصد) اظهار کرده‌اند به میزان  کم و خیلی کم به مطالعه کتب غیردرسی می‌پردازند و 33.8 درصد هم مطالعه کتب غیردرسی خود را به میزان زیاد و خیلی زیاد مطرح کرده‌اند.&amp;lt;br /&amp;gt;&lt;br /&gt;
مطابق آمار فوق دانشجویان و دانش آموزان در صدر بازار هدف قرار می گیرند. کتب درسی و دانشگاهی و همجنین رمان و داستان نیز جز محصولات پرفروش خواهند بود.&lt;br /&gt;
&lt;br /&gt;
== تحلیل رقابتی ==&lt;br /&gt;
&lt;br /&gt;
[[پرونده:BookShopSwat.png|300px|قاب|وسط]]&lt;br /&gt;
&lt;br /&gt;
== تدوین استراتژی ==&lt;br /&gt;
*'''استراتژی های بازاریابی'''&lt;br /&gt;
**جذب نیروی های بازاریاب با تجربه برای جذب مشتری و آگهی های تبلیغاتی&lt;br /&gt;
**برگزاری دوره های تخصصی بازاریابی متناسب با هر بخش از بازار هدف&lt;br /&gt;
*'''استراتژی های تبلیغاتی'''&lt;br /&gt;
**تبلیغات اینترنتی در دیگر سایت های مرتبط با کتاب &lt;br /&gt;
**انعقاد قرارداد با شرکت های خبره تبلیغاتی جهت ارایه راهکارهای مناسب.&lt;br /&gt;
*'''استراتژی های قیمت گذاری'''&lt;br /&gt;
**امکانات عمومی استفاده از نرم افزار کتابخوان و همچنین کتابخانه هوشمند رایگان بوده ولی استفاده از برخی امکانات تخصصی مشمول هزینه خواهد بود.&lt;br /&gt;
**شیوه اصلی کسب درآمد در این سامانه از طریق فروش کتاب و محصولات خواهد بود.&lt;br /&gt;
*'''استراتژي هاي جذب و نگهداري مشتري'''&lt;br /&gt;
**ارايه خدمات ويژه و افزایش درصد تخفیف به ازای هر بار خرید&lt;br /&gt;
**برگزاري قرعه كشي و اهداي جوايز به مشتريان&lt;br /&gt;
** برگزاری مسابفات کتاب خوانی &lt;br /&gt;
**برگزاري نظرسنجي الكترونيكي به صورت مستمر براي بهبود سامانه مطابق با نظر كاربران&lt;br /&gt;
**مدل سازی کاربران برای ارایه سرویس بهتر&lt;br /&gt;
*'''استراتژي هاي امنيتي'''&lt;br /&gt;
**استفاده از آخرين تكنولوژي هاي روز امنيت اطلاعات شبكه و وب&lt;br /&gt;
**حفظ محرمانگي اطلاعات اختصاصي كاربران&lt;br /&gt;
**ثبت سوابق فعالیت های اعضا&lt;br /&gt;
&lt;br /&gt;
== مراحل توسعه محصولات ==&lt;br /&gt;
*انعقاد قرارداد با ناشرین برتر جهت تعاملات بیشتر در سال دوم&lt;br /&gt;
*عرضه موسیقی و فیلم در سال دوم&lt;br /&gt;
*تکمیل امکانات واسط کاربری حداکثر تا انتهای سال دوم&lt;br /&gt;
*ارایه امکان فروش ارزی در سال سوم&lt;br /&gt;
*افزودن سرورهای استانی در پنج استان بزرگ کشور جهت ارتقا سرعت ارایه خدمات در سال چهارم&lt;br /&gt;
*توسعه کتاب های تخصصی لاتین برای ورود به بازارهای جهانی از ابتدای سال چهارم&lt;br /&gt;
&lt;br /&gt;
== تحلیل مالی ==&lt;br /&gt;
خلاصه طرح مالی فروضگاه کتاب الکترونیکی به شرح زیر خواهد بود:&lt;br /&gt;
*بازگشت سرمایه طی سه سال اول &lt;br /&gt;
*رسیدن به سود در پایان ماه ششم&lt;br /&gt;
*شروع به تهیه گزارشات نرخ سوددهی از ماه پنجم سال اول&lt;br /&gt;
*رشد 1.5 برابر فروش و سوددهی در سال سوم نسبت به سال اول&lt;br /&gt;
*نیاز به سرمایه گذاری برای توسعه وبی، تبلیغات و بازاریابی و هزینه های عملکرد معمول فروشگاه&lt;br /&gt;
براساس طرح های مالی که در ادامه آمده، ما اعتقاد داریم که سرمایه گذاری در این حرفه، مقرون به صرفه خواهد بود.&lt;br /&gt;
===فرضیات اولیه===&lt;br /&gt;
طرح های مالی بر فرض حقایق و فرضیات زیر استوار است:&lt;br /&gt;
* افزایش میزان هزینه کرد افراد برای کتاب الکترونیک&lt;br /&gt;
*قیمت کتاب های الکترونیکی به دلیل عدم نیاز به چاپ و کاغذ حدود 20 درصد ارزانتر از کتاب های کاغذی خواهد بود.&lt;br /&gt;
*با انعقاد قرارداد واسطه گری با ناشرین، ارسال کتب فیزیکی مستقیم توسط آنها صورت خواهد گرفت و هزینه انبارداری جهت نگهداری کتاب های فیزیکی نخواهیم داشت.&lt;br /&gt;
*هزینه ارسال کتاب ها و اجناس فیزیکی حداکثر 100000 ریال به ازای حداکثر هر بسته کتاب یا کالا خواهد بود.&lt;br /&gt;
*سود حاصل از فروش هر کتاب یا کالا (چه به صورت فیزیکی و چه الکترونیکی) به طور میانگین 15 درصد و بسته به نوع کتاب یا کالا ممکن است متفاوت باشد.&lt;br /&gt;
[[پرونده:mafroozat-avalieh.png|1000px|بندانگشتی|وسط]]&lt;br /&gt;
===سرمایه اولیه===&lt;br /&gt;
برای پیاده سازی استراتژی های اجرایی و تبلیغاتی  فاز 1 فروشگاه کتاب الکترونیکی به سرمایه اولیه ای معادل 1 میلیارد ریال نیاز داریم. مازاد بر آن برای هزینه های عملیاتی کردن، تداوم تبلیغات، افزایش امکانات وب سایت فروش و پشتیبانی به سرمایه ای معادل 3 میلیارد ریال نیاز است. &lt;br /&gt;
[[پرونده:sarmayeh-avalieh.png|1000px|بندانگشتی|وسط]]&lt;br /&gt;
&lt;br /&gt;
===نمودار درآمد و هزینه (نقطه سر به سر)===&lt;br /&gt;
[[پرونده:sar-be-sar.png|1000px|بندانگشتی|وسط]]&lt;br /&gt;
&lt;br /&gt;
===محل استفاده اعتبارات مالی===&lt;br /&gt;
از اعتبارات مالی در بازاریابی، توسعه و پشتیبانی وب سایت فروش و توسعه نرم افزارهای مورد نیاز (کتابخوان و ...) استفاده خواهد شد. هزینه های عملیاتی شامل خریداری یا اجاره تجهیزات لازم برای اجرای طرح می باشند. از باقیمانده اعتبار نیز تا زمانی که فروشگاه کتاب الکترونیکی به سود برسد، به عنوان سرمایه در گردش استفاده خواهد شد.&lt;br /&gt;
&lt;br /&gt;
== تحلیل ریسک ==&lt;br /&gt;
ریسک های محتمل در ایجاد فروشگاه کتاب الکترونیکی عبارتند از:&lt;br /&gt;
*ریسک كاهش قيمت از طرف رقيبان&lt;br /&gt;
*افزايش غيرمنتظرة هزينه‌هاي طراحي و توليد &lt;br /&gt;
*ریسک از دست دادن سرمايه&lt;br /&gt;
*خطرپذيري لو رفتن فنّاوري های استفاده شده در طراحی نرم افزارها و سایت&lt;br /&gt;
*ریسک وجود رقباي داخلي و خارجي&lt;br /&gt;
*ریسک از دست دادن پرسنل كليدي&lt;br /&gt;
*ريسک تغييرات تکنولوژي&lt;br /&gt;
&lt;br /&gt;
== طرح فنی ==&lt;br /&gt;
سامانه فروشگاه کتاب الکترونیکی یک سامانه تحت وب مستقل از بستر بوده که کاربران می توانند با هر ابزار اعم از موبایل، تبلت و کامپیوتر دسک تاپ تنها از طریق یک مرورگر اقدام به استفاده از سامانه نمایند. عملیات پیاده سازی این سامانه در بخش تحقیق و توسعه شرکت انجام خواهد شد.&lt;br /&gt;
&lt;br /&gt;
ویژگیهای فنی سامانه به شرح زیر است:&lt;br /&gt;
&lt;br /&gt;
[[پرونده:Technical-tools.png|300px|قاب|وسط]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
کاربران سامانه شامل دسته های زیر می باشند:&lt;br /&gt;
* خریداران&lt;br /&gt;
* اعضا&lt;br /&gt;
* ناشرین&lt;br /&gt;
مدل 7 لایه ای معماری سیستم تجارت الکترونیک نیز به صورت زیر خواهد بود:&lt;br /&gt;
[[پرونده:Seven-layers-model.png|300px|قاب|وسط]]&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D9%BE%D8%B1%D9%88%D9%86%D8%AF%D9%87:Mafroozat-avalieh.png&amp;diff=13802</id>
		<title>پرونده:Mafroozat-avalieh.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D9%BE%D8%B1%D9%88%D9%86%D8%AF%D9%87:Mafroozat-avalieh.png&amp;diff=13802"/>
		<updated>2016-02-02T02:16:48Z</updated>

		<summary type="html">&lt;p&gt;94131572: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D9%BE%D8%B1%D9%88%D9%86%D8%AF%D9%87:Sarmayeh-avalieh.png&amp;diff=13801</id>
		<title>پرونده:Sarmayeh-avalieh.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D9%BE%D8%B1%D9%88%D9%86%D8%AF%D9%87:Sarmayeh-avalieh.png&amp;diff=13801"/>
		<updated>2016-02-02T02:16:22Z</updated>

		<summary type="html">&lt;p&gt;94131572: 94131572 نسخه جدیدی از  «پرونده:Sarmayeh-avalieh.png» را بارگذاری کرد&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D9%BE%D8%B1%D9%88%D9%86%D8%AF%D9%87:Sarmayeh-avalieh.png&amp;diff=13800</id>
		<title>پرونده:Sarmayeh-avalieh.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D9%BE%D8%B1%D9%88%D9%86%D8%AF%D9%87:Sarmayeh-avalieh.png&amp;diff=13800"/>
		<updated>2016-02-02T02:14:22Z</updated>

		<summary type="html">&lt;p&gt;94131572: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D9%BE%D8%B1%D9%88%D9%86%D8%AF%D9%87:Sar-be-sar.png&amp;diff=13799</id>
		<title>پرونده:Sar-be-sar.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D9%BE%D8%B1%D9%88%D9%86%D8%AF%D9%87:Sar-be-sar.png&amp;diff=13799"/>
		<updated>2016-02-02T02:13:46Z</updated>

		<summary type="html">&lt;p&gt;94131572: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13571</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13571"/>
		<updated>2015-12-27T06:11:00Z</updated>

		<summary type="html">&lt;p&gt;94131572: /* مراجع */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. &amp;lt;ref name=&amp;quot;r4&amp;quot;&amp;gt;Xing Wu, Yan Liu, Ian Gorton / Exploring Performance Models of Hadoop Applications on Cloud Architecture/2015/[http://dl.acm.org/citation.cfm?id=2737197 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.&amp;lt;ref name=&amp;quot;r5&amp;quot;&amp;gt; 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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می باشد. در واقع یک فریم ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به کار گرفته شد. از مزیت های آن بهبود مدیریت حافظه است.&amp;lt;ref name=&amp;quot;r1&amp;quot;&amp;gt;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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در واقع هدف از توسعه Spark رفع محدودیت های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم های قبلی بود.&amp;lt;ref name=&amp;quot;r2&amp;quot;&amp;gt;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&amp;amp;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations)  می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark زبان های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. &amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlib است.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.&amp;lt;ref name=&amp;quot;r3&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستندکه در واقع مجموعه هایی از اشیا بخش بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاستر شده توزیع شده اند و می توانند به صورت موازی کار کنند. به Rdd های ایجاد شده توسط کاربر تبدیل یا transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال قطعه کد زیر یک RDD ایجاد می کند که پیغام های خطا را از طریق جستجوی خطوطی که با عبارت ERROR آغاز می شوند از یک فایل log استخراج کرده و بر روی کنسول نمایش می دهد.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
 val lines = spark.textFile(“hdfs://...”) &lt;br /&gt;
 val errors = lines.filter(line =&amp;gt; line.startsWith(“ERROR”)) &lt;br /&gt;
 println(“Total errors: “ + errors.count())&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
خط اول یک RDD بر روی یک فایل HDFS تعریف می کند. خط دوم یک تبدیل از نوع غربال برای استخراج یک RDD جدید از خطوط تعریف می کند. و نهایتا خط آخر با فراخو.انی count که نوع دیگری از RDD به نام action است یک نتیجه را برای برنامه (که در اینجا تعداد عناصر RDD است)، باز می گرداند.&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال یک کاربر که قصد رفع یک مشکل را دارد، ممکن است با فراخوانی زیر روی یک کلاستر، بخواهد از بین مجموعه های بسیار بزرگی از داده پیغام های خطا را در حافظه بارگذاری کند:&amp;lt;br /&amp;gt;&lt;br /&gt;
errors.persist()&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
پس از این کار می توان پرس و جوهای مختلفی بر روی داده موجود در حافظه اصلی اجرا نمود.&amp;lt;br /&amp;gt;&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال فرض کنید عملیات زیر توسط کاربر بر روی خطوط خطا انجام شده است:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt; &lt;br /&gt;
 // Count the errors mentioning MySQL&lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).count() &lt;br /&gt;
 // Fetch the MySQL errors as an array of strings &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).collect() &lt;br /&gt;
 // Fetch the time fields of errors mentioning PHP as an array &lt;br /&gt;
 // (assuming time is field number 3 in a tab-separated format): &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“PHP”)) &lt;br /&gt;
 .map(line =&amp;gt; line.split(‘\t’)(3)) .collect()&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13570</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13570"/>
		<updated>2015-12-27T02:57:48Z</updated>

		<summary type="html">&lt;p&gt;94131572: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. &amp;lt;ref name=&amp;quot;r4&amp;quot;&amp;gt;Xing Wu, Yan Liu, Ian Gorton / Exploring Performance Models of Hadoop Applications on Cloud Architecture/2015/[http://dl.acm.org/citation.cfm?id=2737197 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.&amp;lt;ref name=&amp;quot;r5&amp;quot;&amp;gt; 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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می باشد. در واقع یک فریم ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به کار گرفته شد. از مزیت های آن بهبود مدیریت حافظه است.&amp;lt;ref name=&amp;quot;r1&amp;quot;&amp;gt;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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در واقع هدف از توسعه Spark رفع محدودیت های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم های قبلی بود.&amp;lt;ref name=&amp;quot;r2&amp;quot;&amp;gt;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&amp;amp;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations)  می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark زبان های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. &amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlib است.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.&amp;lt;ref name=&amp;quot;r3&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستندکه در واقع مجموعه هایی از اشیا بخش بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاستر شده توزیع شده اند و می توانند به صورت موازی کار کنند. به Rdd های ایجاد شده توسط کاربر تبدیل یا transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال قطعه کد زیر یک RDD ایجاد می کند که پیغام های خطا را از طریق جستجوی خطوطی که با عبارت ERROR آغاز می شوند از یک فایل log استخراج کرده و بر روی کنسول نمایش می دهد.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
 val lines = spark.textFile(“hdfs://...”) &lt;br /&gt;
 val errors = lines.filter(line =&amp;gt; line.startsWith(“ERROR”)) &lt;br /&gt;
 println(“Total errors: “ + errors.count())&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
خط اول یک RDD بر روی یک فایل HDFS تعریف می کند. خط دوم یک تبدیل از نوع غربال برای استخراج یک RDD جدید از خطوط تعریف می کند. و نهایتا خط آخر با فراخو.انی count که نوع دیگری از RDD به نام action است یک نتیجه را برای برنامه (که در اینجا تعداد عناصر RDD است)، باز می گرداند.&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال یک کاربر که قصد رفع یک مشکل را دارد، ممکن است با فراخوانی زیر روی یک کلاستر، بخواهد از بین مجموعه های بسیار بزرگی از داده پیغام های خطا را در حافظه بارگذاری کند:&amp;lt;br /&amp;gt;&lt;br /&gt;
errors.persist()&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
پس از این کار می توان پرس و جوهای مختلفی بر روی داده موجود در حافظه اصلی اجرا نمود.&amp;lt;br /&amp;gt;&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال فرض کنید عملیات زیر توسط کاربر بر روی خطوط خطا انجام شده است:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt; &lt;br /&gt;
 // Count the errors mentioning MySQL&lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).count() &lt;br /&gt;
 // Fetch the MySQL errors as an array of strings &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).collect() &lt;br /&gt;
 // Fetch the time fields of errors mentioning PHP as an array &lt;br /&gt;
 // (assuming time is field number 3 in a tab-separated format): &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“PHP”)) &lt;br /&gt;
 .map(line =&amp;gt; line.split(‘\t’)(3)) .collect()&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
2. Anand Loganathan, Ankur Sinha, Muthuramakrishnan V.,&lt;br /&gt;
and Srikanth Natarajan/A Systematic Approach to Big Data&lt;br /&gt;
Exploration of the Hadoop Framework/2014/[http://www.irphouse.com/volume%20special/ijictv4n9spl.htm لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
4.Xiaoyi Lu ; Dept. of Comput. Sci. &amp;amp; Eng., Ohio State Univ., Columbus, OH, USA ; Rahman, M.W.U. ; Islam, N. ; Shankar, D / &lt;br /&gt;
Accelerating Spark with RDMA for Big Data Processing: Early Experiences&lt;br /&gt;
/2014/[http://ieeexplore.ieee.org/xpl/articleDetails.jsp?tp=&amp;amp;arnumber=6925713&amp;amp;url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D6925713 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
/2012/[https://www.usenix.org/system/files/login/articles/zaharia.pdf لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
6.Dilpreet Singh and Chandan K Reddy / A survey on platforms for big data analytics&lt;br /&gt;
/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&amp;amp;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 لینک به مقاله]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13569</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13569"/>
		<updated>2015-12-27T02:53:09Z</updated>

		<summary type="html">&lt;p&gt;94131572: /* تاریخچه و معرفی مدل نگاشت کاهشی */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می باشد. در واقع یک فریم ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به کار گرفته شد. از مزیت های آن بهبود مدیریت حافظه است.&amp;lt;ref name=&amp;quot;r1&amp;quot;&amp;gt;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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در واقع هدف از توسعه Spark رفع محدودیت های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم های قبلی بود.&amp;lt;ref name=&amp;quot;r2&amp;quot;&amp;gt;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&amp;amp;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations)  می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark زبان های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. &amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlib است.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. &amp;lt;ref name=&amp;quot;r4&amp;quot;&amp;gt;Xing Wu, Yan Liu, Ian Gorton / Exploring Performance Models of Hadoop Applications on Cloud Architecture/2015/[http://dl.acm.org/citation.cfm?id=2737197 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.&amp;lt;ref name=&amp;quot;r5&amp;quot;&amp;gt; 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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.&amp;lt;ref name=&amp;quot;r3&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستندکه در واقع مجموعه هایی از اشیا بخش بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاستر شده توزیع شده اند و می توانند به صورت موازی کار کنند. به Rdd های ایجاد شده توسط کاربر تبدیل یا transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال قطعه کد زیر یک RDD ایجاد می کند که پیغام های خطا را از طریق جستجوی خطوطی که با عبارت ERROR آغاز می شوند از یک فایل log استخراج کرده و بر روی کنسول نمایش می دهد.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
 val lines = spark.textFile(“hdfs://...”) &lt;br /&gt;
 val errors = lines.filter(line =&amp;gt; line.startsWith(“ERROR”)) &lt;br /&gt;
 println(“Total errors: “ + errors.count())&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
خط اول یک RDD بر روی یک فایل HDFS تعریف می کند. خط دوم یک تبدیل از نوع غربال برای استخراج یک RDD جدید از خطوط تعریف می کند. و نهایتا خط آخر با فراخو.انی count که نوع دیگری از RDD به نام action است یک نتیجه را برای برنامه (که در اینجا تعداد عناصر RDD است)، باز می گرداند.&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال یک کاربر که قصد رفع یک مشکل را دارد، ممکن است با فراخوانی زیر روی یک کلاستر، بخواهد از بین مجموعه های بسیار بزرگی از داده پیغام های خطا را در حافظه بارگذاری کند:&amp;lt;br /&amp;gt;&lt;br /&gt;
errors.persist()&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
پس از این کار می توان پرس و جوهای مختلفی بر روی داده موجود در حافظه اصلی اجرا نمود.&amp;lt;br /&amp;gt;&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال فرض کنید عملیات زیر توسط کاربر بر روی خطوط خطا انجام شده است:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt; &lt;br /&gt;
 // Count the errors mentioning MySQL&lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).count() &lt;br /&gt;
 // Fetch the MySQL errors as an array of strings &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).collect() &lt;br /&gt;
 // Fetch the time fields of errors mentioning PHP as an array &lt;br /&gt;
 // (assuming time is field number 3 in a tab-separated format): &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“PHP”)) &lt;br /&gt;
 .map(line =&amp;gt; line.split(‘\t’)(3)) .collect()&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
2. Anand Loganathan, Ankur Sinha, Muthuramakrishnan V.,&lt;br /&gt;
and Srikanth Natarajan/A Systematic Approach to Big Data&lt;br /&gt;
Exploration of the Hadoop Framework/2014/[http://www.irphouse.com/volume%20special/ijictv4n9spl.htm لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
4.Xiaoyi Lu ; Dept. of Comput. Sci. &amp;amp; Eng., Ohio State Univ., Columbus, OH, USA ; Rahman, M.W.U. ; Islam, N. ; Shankar, D / &lt;br /&gt;
Accelerating Spark with RDMA for Big Data Processing: Early Experiences&lt;br /&gt;
/2014/[http://ieeexplore.ieee.org/xpl/articleDetails.jsp?tp=&amp;amp;arnumber=6925713&amp;amp;url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D6925713 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
/2012/[https://www.usenix.org/system/files/login/articles/zaharia.pdf لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
6.Dilpreet Singh and Chandan K Reddy / A survey on platforms for big data analytics&lt;br /&gt;
/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&amp;amp;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 لینک به مقاله]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13568</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13568"/>
		<updated>2015-12-27T02:42:38Z</updated>

		<summary type="html">&lt;p&gt;94131572: /* معرفی ابزار Apache Hadoop */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می باشد. در واقع یک فریم ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به کار گرفته شد. از مزیت های آن بهبود مدیریت حافظه است.&amp;lt;ref name=&amp;quot;r1&amp;quot;&amp;gt;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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در واقع هدف از توسعه Spark رفع محدودیت های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم های قبلی بود.&amp;lt;ref name=&amp;quot;r2&amp;quot;&amp;gt;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&amp;amp;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations)  می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark زبان های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. &amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlib است.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. &amp;lt;ref name=&amp;quot;r4&amp;quot;&amp;gt;Xing Wu, Yan Liu, Ian Gorton / Exploring Performance Models of Hadoop Applications on Cloud Architecture/2015/[http://dl.acm.org/citation.cfm?id=2737197 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.&amp;lt;ref name=&amp;quot;r5&amp;quot;&amp;gt; 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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.&amp;lt;ref name=&amp;quot;r3&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستندکه در واقع مجموعه هایی از اشیا بخش بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاستر شده توزیع شده اند و می توانند به صورت موازی کار کنند. به Rdd های ایجاد شده توسط کاربر تبدیل یا transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال قطعه کد زیر یک RDD ایجاد می کند که پیغام های خطا را از طریق جستجوی خطوطی که با عبارت ERROR آغاز می شوند از یک فایل log استخراج کرده و بر روی کنسول نمایش می دهد.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
 val lines = spark.textFile(“hdfs://...”) &lt;br /&gt;
 val errors = lines.filter(line =&amp;gt; line.startsWith(“ERROR”)) &lt;br /&gt;
 println(“Total errors: “ + errors.count())&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
خط اول یک RDD بر روی یک فایل HDFS تعریف می کند. خط دوم یک تبدیل از نوع غربال برای استخراج یک RDD جدید از خطوط تعریف می کند. و نهایتا خط آخر با فراخو.انی count که نوع دیگری از RDD به نام action است یک نتیجه را برای برنامه (که در اینجا تعداد عناصر RDD است)، باز می گرداند.&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال یک کاربر که قصد رفع یک مشکل را دارد، ممکن است با فراخوانی زیر روی یک کلاستر، بخواهد از بین مجموعه های بسیار بزرگی از داده پیغام های خطا را در حافظه بارگذاری کند:&amp;lt;br /&amp;gt;&lt;br /&gt;
errors.persist()&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
پس از این کار می توان پرس و جوهای مختلفی بر روی داده موجود در حافظه اصلی اجرا نمود.&amp;lt;br /&amp;gt;&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال فرض کنید عملیات زیر توسط کاربر بر روی خطوط خطا انجام شده است:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt; &lt;br /&gt;
 // Count the errors mentioning MySQL&lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).count() &lt;br /&gt;
 // Fetch the MySQL errors as an array of strings &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).collect() &lt;br /&gt;
 // Fetch the time fields of errors mentioning PHP as an array &lt;br /&gt;
 // (assuming time is field number 3 in a tab-separated format): &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“PHP”)) &lt;br /&gt;
 .map(line =&amp;gt; line.split(‘\t’)(3)) .collect()&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
2. Anand Loganathan, Ankur Sinha, Muthuramakrishnan V.,&lt;br /&gt;
and Srikanth Natarajan/A Systematic Approach to Big Data&lt;br /&gt;
Exploration of the Hadoop Framework/2014/[http://www.irphouse.com/volume%20special/ijictv4n9spl.htm لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
4.Xiaoyi Lu ; Dept. of Comput. Sci. &amp;amp; Eng., Ohio State Univ., Columbus, OH, USA ; Rahman, M.W.U. ; Islam, N. ; Shankar, D / &lt;br /&gt;
Accelerating Spark with RDMA for Big Data Processing: Early Experiences&lt;br /&gt;
/2014/[http://ieeexplore.ieee.org/xpl/articleDetails.jsp?tp=&amp;amp;arnumber=6925713&amp;amp;url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D6925713 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
/2012/[https://www.usenix.org/system/files/login/articles/zaharia.pdf لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
6.Dilpreet Singh and Chandan K Reddy / A survey on platforms for big data analytics&lt;br /&gt;
/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&amp;amp;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 لینک به مقاله]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13567</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13567"/>
		<updated>2015-12-27T02:35:18Z</updated>

		<summary type="html">&lt;p&gt;94131572: /* معرفی ابزار Apache Hadoop */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می باشد. در واقع یک فریم ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به کار گرفته شد. از مزیت های آن بهبود مدیریت حافظه است.&amp;lt;ref name=&amp;quot;r1&amp;quot;&amp;gt;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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در واقع هدف از توسعه Spark رفع محدودیت های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم های قبلی بود.&amp;lt;ref name=&amp;quot;r2&amp;quot;&amp;gt;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&amp;amp;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations)  می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark زبان های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. &amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlib است.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. &amp;lt;ref name=&amp;quot;r4&amp;quot;&amp;gt;Xing Wu, Yan Liu, Ian Gorton / Exploring Performance Models of Hadoop Applications on Cloud Architecture/2015/[http://dl.acm.org/citation.cfm?id=2737197 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.[2]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.&amp;lt;ref name=&amp;quot;r3&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستندکه در واقع مجموعه هایی از اشیا بخش بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاستر شده توزیع شده اند و می توانند به صورت موازی کار کنند. به Rdd های ایجاد شده توسط کاربر تبدیل یا transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال قطعه کد زیر یک RDD ایجاد می کند که پیغام های خطا را از طریق جستجوی خطوطی که با عبارت ERROR آغاز می شوند از یک فایل log استخراج کرده و بر روی کنسول نمایش می دهد.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
 val lines = spark.textFile(“hdfs://...”) &lt;br /&gt;
 val errors = lines.filter(line =&amp;gt; line.startsWith(“ERROR”)) &lt;br /&gt;
 println(“Total errors: “ + errors.count())&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
خط اول یک RDD بر روی یک فایل HDFS تعریف می کند. خط دوم یک تبدیل از نوع غربال برای استخراج یک RDD جدید از خطوط تعریف می کند. و نهایتا خط آخر با فراخو.انی count که نوع دیگری از RDD به نام action است یک نتیجه را برای برنامه (که در اینجا تعداد عناصر RDD است)، باز می گرداند.&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال یک کاربر که قصد رفع یک مشکل را دارد، ممکن است با فراخوانی زیر روی یک کلاستر، بخواهد از بین مجموعه های بسیار بزرگی از داده پیغام های خطا را در حافظه بارگذاری کند:&amp;lt;br /&amp;gt;&lt;br /&gt;
errors.persist()&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
پس از این کار می توان پرس و جوهای مختلفی بر روی داده موجود در حافظه اصلی اجرا نمود.&amp;lt;br /&amp;gt;&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال فرض کنید عملیات زیر توسط کاربر بر روی خطوط خطا انجام شده است:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt; &lt;br /&gt;
 // Count the errors mentioning MySQL&lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).count() &lt;br /&gt;
 // Fetch the MySQL errors as an array of strings &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).collect() &lt;br /&gt;
 // Fetch the time fields of errors mentioning PHP as an array &lt;br /&gt;
 // (assuming time is field number 3 in a tab-separated format): &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“PHP”)) &lt;br /&gt;
 .map(line =&amp;gt; line.split(‘\t’)(3)) .collect()&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
2. Anand Loganathan, Ankur Sinha, Muthuramakrishnan V.,&lt;br /&gt;
and Srikanth Natarajan/A Systematic Approach to Big Data&lt;br /&gt;
Exploration of the Hadoop Framework/2014/[http://www.irphouse.com/volume%20special/ijictv4n9spl.htm لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
4.Xiaoyi Lu ; Dept. of Comput. Sci. &amp;amp; Eng., Ohio State Univ., Columbus, OH, USA ; Rahman, M.W.U. ; Islam, N. ; Shankar, D / &lt;br /&gt;
Accelerating Spark with RDMA for Big Data Processing: Early Experiences&lt;br /&gt;
/2014/[http://ieeexplore.ieee.org/xpl/articleDetails.jsp?tp=&amp;amp;arnumber=6925713&amp;amp;url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D6925713 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
/2012/[https://www.usenix.org/system/files/login/articles/zaharia.pdf لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
6.Dilpreet Singh and Chandan K Reddy / A survey on platforms for big data analytics&lt;br /&gt;
/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&amp;amp;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 لینک به مقاله]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13566</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13566"/>
		<updated>2015-12-27T02:31:26Z</updated>

		<summary type="html">&lt;p&gt;94131572: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می باشد. در واقع یک فریم ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به کار گرفته شد. از مزیت های آن بهبود مدیریت حافظه است.&amp;lt;ref name=&amp;quot;r1&amp;quot;&amp;gt;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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در واقع هدف از توسعه Spark رفع محدودیت های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم های قبلی بود.&amp;lt;ref name=&amp;quot;r2&amp;quot;&amp;gt;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&amp;amp;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations)  می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark زبان های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. &amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlib است.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. [3]&amp;lt;br /&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.[2]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.&amp;lt;ref name=&amp;quot;r3&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستندکه در واقع مجموعه هایی از اشیا بخش بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاستر شده توزیع شده اند و می توانند به صورت موازی کار کنند. به Rdd های ایجاد شده توسط کاربر تبدیل یا transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال قطعه کد زیر یک RDD ایجاد می کند که پیغام های خطا را از طریق جستجوی خطوطی که با عبارت ERROR آغاز می شوند از یک فایل log استخراج کرده و بر روی کنسول نمایش می دهد.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
 val lines = spark.textFile(“hdfs://...”) &lt;br /&gt;
 val errors = lines.filter(line =&amp;gt; line.startsWith(“ERROR”)) &lt;br /&gt;
 println(“Total errors: “ + errors.count())&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
خط اول یک RDD بر روی یک فایل HDFS تعریف می کند. خط دوم یک تبدیل از نوع غربال برای استخراج یک RDD جدید از خطوط تعریف می کند. و نهایتا خط آخر با فراخو.انی count که نوع دیگری از RDD به نام action است یک نتیجه را برای برنامه (که در اینجا تعداد عناصر RDD است)، باز می گرداند.&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال یک کاربر که قصد رفع یک مشکل را دارد، ممکن است با فراخوانی زیر روی یک کلاستر، بخواهد از بین مجموعه های بسیار بزرگی از داده پیغام های خطا را در حافظه بارگذاری کند:&amp;lt;br /&amp;gt;&lt;br /&gt;
errors.persist()&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
پس از این کار می توان پرس و جوهای مختلفی بر روی داده موجود در حافظه اصلی اجرا نمود.&amp;lt;br /&amp;gt;&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال فرض کنید عملیات زیر توسط کاربر بر روی خطوط خطا انجام شده است:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt; &lt;br /&gt;
 // Count the errors mentioning MySQL&lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).count() &lt;br /&gt;
 // Fetch the MySQL errors as an array of strings &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).collect() &lt;br /&gt;
 // Fetch the time fields of errors mentioning PHP as an array &lt;br /&gt;
 // (assuming time is field number 3 in a tab-separated format): &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“PHP”)) &lt;br /&gt;
 .map(line =&amp;gt; line.split(‘\t’)(3)) .collect()&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. &amp;lt;ref name=&amp;quot;r3&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
2. Anand Loganathan, Ankur Sinha, Muthuramakrishnan V.,&lt;br /&gt;
and Srikanth Natarajan/A Systematic Approach to Big Data&lt;br /&gt;
Exploration of the Hadoop Framework/2014/[http://www.irphouse.com/volume%20special/ijictv4n9spl.htm لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
4.Xiaoyi Lu ; Dept. of Comput. Sci. &amp;amp; Eng., Ohio State Univ., Columbus, OH, USA ; Rahman, M.W.U. ; Islam, N. ; Shankar, D / &lt;br /&gt;
Accelerating Spark with RDMA for Big Data Processing: Early Experiences&lt;br /&gt;
/2014/[http://ieeexplore.ieee.org/xpl/articleDetails.jsp?tp=&amp;amp;arnumber=6925713&amp;amp;url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D6925713 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
/2012/[https://www.usenix.org/system/files/login/articles/zaharia.pdf لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
6.Dilpreet Singh and Chandan K Reddy / A survey on platforms for big data analytics&lt;br /&gt;
/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&amp;amp;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 لینک به مقاله]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13565</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13565"/>
		<updated>2015-12-27T02:29:27Z</updated>

		<summary type="html">&lt;p&gt;94131572: /* مقایسه ابزارهای Hadoop و Spark */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می باشد. در واقع یک فریم ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به کار گرفته شد. از مزیت های آن بهبود مدیریت حافظه است.&amp;lt;ref name=&amp;quot;r1&amp;quot;&amp;gt;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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در واقع هدف از توسعه Spark رفع محدودیت های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم های قبلی بود.&amp;lt;ref name=&amp;quot;r2&amp;quot;&amp;gt;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&amp;amp;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations)  می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark زبان های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. &amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlib است.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. [3]&amp;lt;br /&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.[2]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.&amp;lt;ref name=&amp;quot;r3&amp;quot;&amp;gt;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستندکه در واقع مجموعه هایی از اشیا بخش بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاستر شده توزیع شده اند و می توانند به صورت موازی کار کنند. به Rdd های ایجاد شده توسط کاربر تبدیل یا transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال قطعه کد زیر یک RDD ایجاد می کند که پیغام های خطا را از طریق جستجوی خطوطی که با عبارت ERROR آغاز می شوند از یک فایل log استخراج کرده و بر روی کنسول نمایش می دهد.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
 val lines = spark.textFile(“hdfs://...”) &lt;br /&gt;
 val errors = lines.filter(line =&amp;gt; line.startsWith(“ERROR”)) &lt;br /&gt;
 println(“Total errors: “ + errors.count())&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
خط اول یک RDD بر روی یک فایل HDFS تعریف می کند. خط دوم یک تبدیل از نوع غربال برای استخراج یک RDD جدید از خطوط تعریف می کند. و نهایتا خط آخر با فراخو.انی count که نوع دیگری از RDD به نام action است یک نتیجه را برای برنامه (که در اینجا تعداد عناصر RDD است)، باز می گرداند.&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. [5]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال یک کاربر که قصد رفع یک مشکل را دارد، ممکن است با فراخوانی زیر روی یک کلاستر، بخواهد از بین مجموعه های بسیار بزرگی از داده پیغام های خطا را در حافظه بارگذاری کند:&amp;lt;br /&amp;gt;&lt;br /&gt;
errors.persist()&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
پس از این کار می توان پرس و جوهای مختلفی بر روی داده موجود در حافظه اصلی اجرا نمود.&amp;lt;br /&amp;gt;&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال فرض کنید عملیات زیر توسط کاربر بر روی خطوط خطا انجام شده است:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt; &lt;br /&gt;
 // Count the errors mentioning MySQL&lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).count() &lt;br /&gt;
 // Fetch the MySQL errors as an array of strings &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).collect() &lt;br /&gt;
 // Fetch the time fields of errors mentioning PHP as an array &lt;br /&gt;
 // (assuming time is field number 3 in a tab-separated format): &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“PHP”)) &lt;br /&gt;
 .map(line =&amp;gt; line.split(‘\t’)(3)) .collect()&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
2. Anand Loganathan, Ankur Sinha, Muthuramakrishnan V.,&lt;br /&gt;
and Srikanth Natarajan/A Systematic Approach to Big Data&lt;br /&gt;
Exploration of the Hadoop Framework/2014/[http://www.irphouse.com/volume%20special/ijictv4n9spl.htm لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
4.Xiaoyi Lu ; Dept. of Comput. Sci. &amp;amp; Eng., Ohio State Univ., Columbus, OH, USA ; Rahman, M.W.U. ; Islam, N. ; Shankar, D / &lt;br /&gt;
Accelerating Spark with RDMA for Big Data Processing: Early Experiences&lt;br /&gt;
/2014/[http://ieeexplore.ieee.org/xpl/articleDetails.jsp?tp=&amp;amp;arnumber=6925713&amp;amp;url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D6925713 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
/2012/[https://www.usenix.org/system/files/login/articles/zaharia.pdf لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
6.Dilpreet Singh and Chandan K Reddy / A survey on platforms for big data analytics&lt;br /&gt;
/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&amp;amp;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 لینک به مقاله]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13564</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13564"/>
		<updated>2015-12-27T02:27:21Z</updated>

		<summary type="html">&lt;p&gt;94131572: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می باشد. در واقع یک فریم ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به کار گرفته شد. از مزیت های آن بهبود مدیریت حافظه است.&amp;lt;ref name=&amp;quot;r1&amp;quot;&amp;gt;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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در واقع هدف از توسعه Spark رفع محدودیت های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم های قبلی بود.&amp;lt;ref name=&amp;quot;r2&amp;quot;&amp;gt;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&amp;amp;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations)  می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark زبان های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. &amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlib است.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. [3]&amp;lt;br /&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.[2]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.[5]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.&amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستندکه در واقع مجموعه هایی از اشیا بخش بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاستر شده توزیع شده اند و می توانند به صورت موازی کار کنند. به Rdd های ایجاد شده توسط کاربر تبدیل یا transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال قطعه کد زیر یک RDD ایجاد می کند که پیغام های خطا را از طریق جستجوی خطوطی که با عبارت ERROR آغاز می شوند از یک فایل log استخراج کرده و بر روی کنسول نمایش می دهد.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
 val lines = spark.textFile(“hdfs://...”) &lt;br /&gt;
 val errors = lines.filter(line =&amp;gt; line.startsWith(“ERROR”)) &lt;br /&gt;
 println(“Total errors: “ + errors.count())&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
خط اول یک RDD بر روی یک فایل HDFS تعریف می کند. خط دوم یک تبدیل از نوع غربال برای استخراج یک RDD جدید از خطوط تعریف می کند. و نهایتا خط آخر با فراخو.انی count که نوع دیگری از RDD به نام action است یک نتیجه را برای برنامه (که در اینجا تعداد عناصر RDD است)، باز می گرداند.&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. [5]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال یک کاربر که قصد رفع یک مشکل را دارد، ممکن است با فراخوانی زیر روی یک کلاستر، بخواهد از بین مجموعه های بسیار بزرگی از داده پیغام های خطا را در حافظه بارگذاری کند:&amp;lt;br /&amp;gt;&lt;br /&gt;
errors.persist()&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
پس از این کار می توان پرس و جوهای مختلفی بر روی داده موجود در حافظه اصلی اجرا نمود.&amp;lt;br /&amp;gt;&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال فرض کنید عملیات زیر توسط کاربر بر روی خطوط خطا انجام شده است:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt; &lt;br /&gt;
 // Count the errors mentioning MySQL&lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).count() &lt;br /&gt;
 // Fetch the MySQL errors as an array of strings &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).collect() &lt;br /&gt;
 // Fetch the time fields of errors mentioning PHP as an array &lt;br /&gt;
 // (assuming time is field number 3 in a tab-separated format): &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“PHP”)) &lt;br /&gt;
 .map(line =&amp;gt; line.split(‘\t’)(3)) .collect()&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
2. Anand Loganathan, Ankur Sinha, Muthuramakrishnan V.,&lt;br /&gt;
and Srikanth Natarajan/A Systematic Approach to Big Data&lt;br /&gt;
Exploration of the Hadoop Framework/2014/[http://www.irphouse.com/volume%20special/ijictv4n9spl.htm لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
4.Xiaoyi Lu ; Dept. of Comput. Sci. &amp;amp; Eng., Ohio State Univ., Columbus, OH, USA ; Rahman, M.W.U. ; Islam, N. ; Shankar, D / &lt;br /&gt;
Accelerating Spark with RDMA for Big Data Processing: Early Experiences&lt;br /&gt;
/2014/[http://ieeexplore.ieee.org/xpl/articleDetails.jsp?tp=&amp;amp;arnumber=6925713&amp;amp;url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D6925713 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
/2012/[https://www.usenix.org/system/files/login/articles/zaharia.pdf لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
6.Dilpreet Singh and Chandan K Reddy / A survey on platforms for big data analytics&lt;br /&gt;
/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&amp;amp;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 لینک به مقاله]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13563</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13563"/>
		<updated>2015-12-27T02:24:06Z</updated>

		<summary type="html">&lt;p&gt;94131572: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می باشد. در واقع یک فریم ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به کار گرفته شد. از مزیت های آن بهبود مدیریت حافظه است.&amp;lt;ref name=&amp;quot;r1&amp;quot;&amp;gt;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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در واقع هدف از توسعه Spark رفع محدودیت های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم های قبلی بود.&amp;lt;ref name=&amp;quot;r2&amp;quot;&amp;gt;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&amp;amp;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations)  می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark زبان های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. &amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlib است.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.&amp;lt;ref name=&amp;quot;r1&amp;quot;/&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. [3]&amp;lt;br /&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.[2]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.[5]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستندکه در واقع مجموعه هایی از اشیا بخش بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاستر شده توزیع شده اند و می توانند به صورت موازی کار کنند. به Rdd های ایجاد شده توسط کاربر تبدیل یا transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال قطعه کد زیر یک RDD ایجاد می کند که پیغام های خطا را از طریق جستجوی خطوطی که با عبارت ERROR آغاز می شوند از یک فایل log استخراج کرده و بر روی کنسول نمایش می دهد.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
 val lines = spark.textFile(“hdfs://...”) &lt;br /&gt;
 val errors = lines.filter(line =&amp;gt; line.startsWith(“ERROR”)) &lt;br /&gt;
 println(“Total errors: “ + errors.count())&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
خط اول یک RDD بر روی یک فایل HDFS تعریف می کند. خط دوم یک تبدیل از نوع غربال برای استخراج یک RDD جدید از خطوط تعریف می کند. و نهایتا خط آخر با فراخو.انی count که نوع دیگری از RDD به نام action است یک نتیجه را برای برنامه (که در اینجا تعداد عناصر RDD است)، باز می گرداند.&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. [5]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال یک کاربر که قصد رفع یک مشکل را دارد، ممکن است با فراخوانی زیر روی یک کلاستر، بخواهد از بین مجموعه های بسیار بزرگی از داده پیغام های خطا را در حافظه بارگذاری کند:&amp;lt;br /&amp;gt;&lt;br /&gt;
errors.persist()&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
پس از این کار می توان پرس و جوهای مختلفی بر روی داده موجود در حافظه اصلی اجرا نمود.&amp;lt;br /&amp;gt;&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال فرض کنید عملیات زیر توسط کاربر بر روی خطوط خطا انجام شده است:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt; &lt;br /&gt;
 // Count the errors mentioning MySQL&lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).count() &lt;br /&gt;
 // Fetch the MySQL errors as an array of strings &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).collect() &lt;br /&gt;
 // Fetch the time fields of errors mentioning PHP as an array &lt;br /&gt;
 // (assuming time is field number 3 in a tab-separated format): &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“PHP”)) &lt;br /&gt;
 .map(line =&amp;gt; line.split(‘\t’)(3)) .collect()&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
2. Anand Loganathan, Ankur Sinha, Muthuramakrishnan V.,&lt;br /&gt;
and Srikanth Natarajan/A Systematic Approach to Big Data&lt;br /&gt;
Exploration of the Hadoop Framework/2014/[http://www.irphouse.com/volume%20special/ijictv4n9spl.htm لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
4.Xiaoyi Lu ; Dept. of Comput. Sci. &amp;amp; Eng., Ohio State Univ., Columbus, OH, USA ; Rahman, M.W.U. ; Islam, N. ; Shankar, D / &lt;br /&gt;
Accelerating Spark with RDMA for Big Data Processing: Early Experiences&lt;br /&gt;
/2014/[http://ieeexplore.ieee.org/xpl/articleDetails.jsp?tp=&amp;amp;arnumber=6925713&amp;amp;url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D6925713 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
/2012/[https://www.usenix.org/system/files/login/articles/zaharia.pdf لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
6.Dilpreet Singh and Chandan K Reddy / A survey on platforms for big data analytics&lt;br /&gt;
/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&amp;amp;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 لینک به مقاله]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13562</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13562"/>
		<updated>2015-12-27T02:21:43Z</updated>

		<summary type="html">&lt;p&gt;94131572: /* معرفی ابزار Apache Spark */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می باشد. در واقع یک فریم ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به کار گرفته شد. از مزیت های آن بهبود مدیریت حافظه است.&amp;lt;ref name=&amp;quot;r1&amp;quot;&amp;gt;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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در واقع هدف از توسعه Spark رفع محدودیت های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم های قبلی بود.&amp;lt;ref name=&amp;quot;r2&amp;quot;&amp;gt;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&amp;amp;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations)  می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark زبان های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. &amp;lt;ref name=&amp;quot;r2&amp;quot;/&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlib است.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.[1]&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.[1]&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.[1]&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.[1]&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. [3]&amp;lt;br /&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.[2]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.[5]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستندکه در واقع مجموعه هایی از اشیا بخش بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاستر شده توزیع شده اند و می توانند به صورت موازی کار کنند. به Rdd های ایجاد شده توسط کاربر تبدیل یا transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال قطعه کد زیر یک RDD ایجاد می کند که پیغام های خطا را از طریق جستجوی خطوطی که با عبارت ERROR آغاز می شوند از یک فایل log استخراج کرده و بر روی کنسول نمایش می دهد.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
 val lines = spark.textFile(“hdfs://...”) &lt;br /&gt;
 val errors = lines.filter(line =&amp;gt; line.startsWith(“ERROR”)) &lt;br /&gt;
 println(“Total errors: “ + errors.count())&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
خط اول یک RDD بر روی یک فایل HDFS تعریف می کند. خط دوم یک تبدیل از نوع غربال برای استخراج یک RDD جدید از خطوط تعریف می کند. و نهایتا خط آخر با فراخو.انی count که نوع دیگری از RDD به نام action است یک نتیجه را برای برنامه (که در اینجا تعداد عناصر RDD است)، باز می گرداند.&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. [5]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال یک کاربر که قصد رفع یک مشکل را دارد، ممکن است با فراخوانی زیر روی یک کلاستر، بخواهد از بین مجموعه های بسیار بزرگی از داده پیغام های خطا را در حافظه بارگذاری کند:&amp;lt;br /&amp;gt;&lt;br /&gt;
errors.persist()&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
پس از این کار می توان پرس و جوهای مختلفی بر روی داده موجود در حافظه اصلی اجرا نمود.&amp;lt;br /&amp;gt;&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال فرض کنید عملیات زیر توسط کاربر بر روی خطوط خطا انجام شده است:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt; &lt;br /&gt;
 // Count the errors mentioning MySQL&lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).count() &lt;br /&gt;
 // Fetch the MySQL errors as an array of strings &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).collect() &lt;br /&gt;
 // Fetch the time fields of errors mentioning PHP as an array &lt;br /&gt;
 // (assuming time is field number 3 in a tab-separated format): &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“PHP”)) &lt;br /&gt;
 .map(line =&amp;gt; line.split(‘\t’)(3)) .collect()&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
2. Anand Loganathan, Ankur Sinha, Muthuramakrishnan V.,&lt;br /&gt;
and Srikanth Natarajan/A Systematic Approach to Big Data&lt;br /&gt;
Exploration of the Hadoop Framework/2014/[http://www.irphouse.com/volume%20special/ijictv4n9spl.htm لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
4.Xiaoyi Lu ; Dept. of Comput. Sci. &amp;amp; Eng., Ohio State Univ., Columbus, OH, USA ; Rahman, M.W.U. ; Islam, N. ; Shankar, D / &lt;br /&gt;
Accelerating Spark with RDMA for Big Data Processing: Early Experiences&lt;br /&gt;
/2014/[http://ieeexplore.ieee.org/xpl/articleDetails.jsp?tp=&amp;amp;arnumber=6925713&amp;amp;url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D6925713 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
/2012/[https://www.usenix.org/system/files/login/articles/zaharia.pdf لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
6.Dilpreet Singh and Chandan K Reddy / A survey on platforms for big data analytics&lt;br /&gt;
/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&amp;amp;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 لینک به مقاله]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13561</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13561"/>
		<updated>2015-12-27T02:20:59Z</updated>

		<summary type="html">&lt;p&gt;94131572: /* معرفی ابزار Apache Spark */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می باشد. در واقع یک فریم ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به کار گرفته شد. از مزیت های آن بهبود مدیریت حافظه است.&amp;lt;ref name=&amp;quot;r1&amp;quot;&amp;gt;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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در واقع هدف از توسعه Spark رفع محدودیت های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم های قبلی بود.&amp;lt;ref name=&amp;quot;r2&amp;quot;&amp;gt;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&amp;amp;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations)  می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark زبان های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. [6] &amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlib است.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.[1]&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.[1]&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.[1]&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.[1]&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. [3]&amp;lt;br /&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.[2]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.[5]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستندکه در واقع مجموعه هایی از اشیا بخش بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاستر شده توزیع شده اند و می توانند به صورت موازی کار کنند. به Rdd های ایجاد شده توسط کاربر تبدیل یا transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال قطعه کد زیر یک RDD ایجاد می کند که پیغام های خطا را از طریق جستجوی خطوطی که با عبارت ERROR آغاز می شوند از یک فایل log استخراج کرده و بر روی کنسول نمایش می دهد.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
 val lines = spark.textFile(“hdfs://...”) &lt;br /&gt;
 val errors = lines.filter(line =&amp;gt; line.startsWith(“ERROR”)) &lt;br /&gt;
 println(“Total errors: “ + errors.count())&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
خط اول یک RDD بر روی یک فایل HDFS تعریف می کند. خط دوم یک تبدیل از نوع غربال برای استخراج یک RDD جدید از خطوط تعریف می کند. و نهایتا خط آخر با فراخو.انی count که نوع دیگری از RDD به نام action است یک نتیجه را برای برنامه (که در اینجا تعداد عناصر RDD است)، باز می گرداند.&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. [5]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال یک کاربر که قصد رفع یک مشکل را دارد، ممکن است با فراخوانی زیر روی یک کلاستر، بخواهد از بین مجموعه های بسیار بزرگی از داده پیغام های خطا را در حافظه بارگذاری کند:&amp;lt;br /&amp;gt;&lt;br /&gt;
errors.persist()&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
پس از این کار می توان پرس و جوهای مختلفی بر روی داده موجود در حافظه اصلی اجرا نمود.&amp;lt;br /&amp;gt;&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال فرض کنید عملیات زیر توسط کاربر بر روی خطوط خطا انجام شده است:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt; &lt;br /&gt;
 // Count the errors mentioning MySQL&lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).count() &lt;br /&gt;
 // Fetch the MySQL errors as an array of strings &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).collect() &lt;br /&gt;
 // Fetch the time fields of errors mentioning PHP as an array &lt;br /&gt;
 // (assuming time is field number 3 in a tab-separated format): &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“PHP”)) &lt;br /&gt;
 .map(line =&amp;gt; line.split(‘\t’)(3)) .collect()&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
2. Anand Loganathan, Ankur Sinha, Muthuramakrishnan V.,&lt;br /&gt;
and Srikanth Natarajan/A Systematic Approach to Big Data&lt;br /&gt;
Exploration of the Hadoop Framework/2014/[http://www.irphouse.com/volume%20special/ijictv4n9spl.htm لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
4.Xiaoyi Lu ; Dept. of Comput. Sci. &amp;amp; Eng., Ohio State Univ., Columbus, OH, USA ; Rahman, M.W.U. ; Islam, N. ; Shankar, D / &lt;br /&gt;
Accelerating Spark with RDMA for Big Data Processing: Early Experiences&lt;br /&gt;
/2014/[http://ieeexplore.ieee.org/xpl/articleDetails.jsp?tp=&amp;amp;arnumber=6925713&amp;amp;url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D6925713 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
/2012/[https://www.usenix.org/system/files/login/articles/zaharia.pdf لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
6.Dilpreet Singh and Chandan K Reddy / A survey on platforms for big data analytics&lt;br /&gt;
/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&amp;amp;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 لینک به مقاله]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13560</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13560"/>
		<updated>2015-12-27T02:19:08Z</updated>

		<summary type="html">&lt;p&gt;94131572: /* مراجع */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می باشد. در واقع یک فریم ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به کار گرفته شد. از مزیت های آن بهبود مدیریت حافظه است.&amp;lt;ref name=&amp;quot;r1&amp;quot;&amp;gt;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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در واقع هدف از توسعه Spark رفع محدودیت های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم های قبلی بود.&amp;lt;ref&amp;gt;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&amp;amp;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations)  می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark زبان های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. [6] &amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlib است.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.[1]&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.[1]&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.[1]&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.[1]&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. [3]&amp;lt;br /&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.[2]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.[5]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستندکه در واقع مجموعه هایی از اشیا بخش بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاستر شده توزیع شده اند و می توانند به صورت موازی کار کنند. به Rdd های ایجاد شده توسط کاربر تبدیل یا transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال قطعه کد زیر یک RDD ایجاد می کند که پیغام های خطا را از طریق جستجوی خطوطی که با عبارت ERROR آغاز می شوند از یک فایل log استخراج کرده و بر روی کنسول نمایش می دهد.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
 val lines = spark.textFile(“hdfs://...”) &lt;br /&gt;
 val errors = lines.filter(line =&amp;gt; line.startsWith(“ERROR”)) &lt;br /&gt;
 println(“Total errors: “ + errors.count())&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
خط اول یک RDD بر روی یک فایل HDFS تعریف می کند. خط دوم یک تبدیل از نوع غربال برای استخراج یک RDD جدید از خطوط تعریف می کند. و نهایتا خط آخر با فراخو.انی count که نوع دیگری از RDD به نام action است یک نتیجه را برای برنامه (که در اینجا تعداد عناصر RDD است)، باز می گرداند.&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. [5]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال یک کاربر که قصد رفع یک مشکل را دارد، ممکن است با فراخوانی زیر روی یک کلاستر، بخواهد از بین مجموعه های بسیار بزرگی از داده پیغام های خطا را در حافظه بارگذاری کند:&amp;lt;br /&amp;gt;&lt;br /&gt;
errors.persist()&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
پس از این کار می توان پرس و جوهای مختلفی بر روی داده موجود در حافظه اصلی اجرا نمود.&amp;lt;br /&amp;gt;&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال فرض کنید عملیات زیر توسط کاربر بر روی خطوط خطا انجام شده است:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt; &lt;br /&gt;
 // Count the errors mentioning MySQL&lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).count() &lt;br /&gt;
 // Fetch the MySQL errors as an array of strings &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).collect() &lt;br /&gt;
 // Fetch the time fields of errors mentioning PHP as an array &lt;br /&gt;
 // (assuming time is field number 3 in a tab-separated format): &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“PHP”)) &lt;br /&gt;
 .map(line =&amp;gt; line.split(‘\t’)(3)) .collect()&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
2. Anand Loganathan, Ankur Sinha, Muthuramakrishnan V.,&lt;br /&gt;
and Srikanth Natarajan/A Systematic Approach to Big Data&lt;br /&gt;
Exploration of the Hadoop Framework/2014/[http://www.irphouse.com/volume%20special/ijictv4n9spl.htm لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
4.Xiaoyi Lu ; Dept. of Comput. Sci. &amp;amp; Eng., Ohio State Univ., Columbus, OH, USA ; Rahman, M.W.U. ; Islam, N. ; Shankar, D / &lt;br /&gt;
Accelerating Spark with RDMA for Big Data Processing: Early Experiences&lt;br /&gt;
/2014/[http://ieeexplore.ieee.org/xpl/articleDetails.jsp?tp=&amp;amp;arnumber=6925713&amp;amp;url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D6925713 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
/2012/[https://www.usenix.org/system/files/login/articles/zaharia.pdf لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
6.Dilpreet Singh and Chandan K Reddy / A survey on platforms for big data analytics&lt;br /&gt;
/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&amp;amp;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 لینک به مقاله]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13559</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13559"/>
		<updated>2015-12-27T02:18:17Z</updated>

		<summary type="html">&lt;p&gt;94131572: /* معرفی ابزار Apache Spark */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می باشد. در واقع یک فریم ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به کار گرفته شد. از مزیت های آن بهبود مدیریت حافظه است.&amp;lt;ref name=&amp;quot;r1&amp;quot;&amp;gt;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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در واقع هدف از توسعه Spark رفع محدودیت های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم های قبلی بود.&amp;lt;ref&amp;gt;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&amp;amp;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 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations)  می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark زبان های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. [6] &amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlib است.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.[1]&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.[1]&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.[1]&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.[1]&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. [3]&amp;lt;br /&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.[2]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.[5]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستندکه در واقع مجموعه هایی از اشیا بخش بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاستر شده توزیع شده اند و می توانند به صورت موازی کار کنند. به Rdd های ایجاد شده توسط کاربر تبدیل یا transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال قطعه کد زیر یک RDD ایجاد می کند که پیغام های خطا را از طریق جستجوی خطوطی که با عبارت ERROR آغاز می شوند از یک فایل log استخراج کرده و بر روی کنسول نمایش می دهد.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
 val lines = spark.textFile(“hdfs://...”) &lt;br /&gt;
 val errors = lines.filter(line =&amp;gt; line.startsWith(“ERROR”)) &lt;br /&gt;
 println(“Total errors: “ + errors.count())&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
خط اول یک RDD بر روی یک فایل HDFS تعریف می کند. خط دوم یک تبدیل از نوع غربال برای استخراج یک RDD جدید از خطوط تعریف می کند. و نهایتا خط آخر با فراخو.انی count که نوع دیگری از RDD به نام action است یک نتیجه را برای برنامه (که در اینجا تعداد عناصر RDD است)، باز می گرداند.&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. [5]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال یک کاربر که قصد رفع یک مشکل را دارد، ممکن است با فراخوانی زیر روی یک کلاستر، بخواهد از بین مجموعه های بسیار بزرگی از داده پیغام های خطا را در حافظه بارگذاری کند:&amp;lt;br /&amp;gt;&lt;br /&gt;
errors.persist()&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
پس از این کار می توان پرس و جوهای مختلفی بر روی داده موجود در حافظه اصلی اجرا نمود.&amp;lt;br /&amp;gt;&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال فرض کنید عملیات زیر توسط کاربر بر روی خطوط خطا انجام شده است:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt; &lt;br /&gt;
 // Count the errors mentioning MySQL&lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).count() &lt;br /&gt;
 // Fetch the MySQL errors as an array of strings &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).collect() &lt;br /&gt;
 // Fetch the time fields of errors mentioning PHP as an array &lt;br /&gt;
 // (assuming time is field number 3 in a tab-separated format): &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“PHP”)) &lt;br /&gt;
 .map(line =&amp;gt; line.split(‘\t’)(3)) .collect()&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
2. Anand Loganathan, Ankur Sinha, Muthuramakrishnan V.,&lt;br /&gt;
and Srikanth Natarajan/A Systematic Approach to Big Data&lt;br /&gt;
Exploration of the Hadoop Framework/2014/[http://www.irphouse.com/volume%20special/ijictv4n9spl.htm لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
4.Xiaoyi Lu ; Dept. of Comput. Sci. &amp;amp; Eng., Ohio State Univ., Columbus, OH, USA ; Rahman, M.W.U. ; Islam, N. ; Shankar, D / &lt;br /&gt;
Accelerating Spark with RDMA for Big Data Processing: Early Experiences&lt;br /&gt;
/2014/[http://ieeexplore.ieee.org/xpl/articleDetails.jsp?tp=&amp;amp;arnumber=6925713&amp;amp;url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D6925713 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
/2012/[https://www.usenix.org/system/files/login/articles/zaharia.pdf لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
6.Dilpreet Singh and Chandan K Reddy / A survey on platforms for big data analytics&lt;br /&gt;
/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&amp;amp;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 لینک به مقاله]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13558</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13558"/>
		<updated>2015-12-27T02:13:16Z</updated>

		<summary type="html">&lt;p&gt;94131572: /* معرفی ابزار Apache Spark */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می باشد. در واقع یک فریم ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به کار گرفته شد. از مزیت های آن بهبود مدیریت حافظه است.&amp;lt;ref name=&amp;quot;r1&amp;quot;&amp;gt;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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در واقع هدف از توسعه Spark رفع محدودیت های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم های قبلی بود.[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations)  می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark زبان های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. [6] &amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlib است.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.[1]&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.[1]&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.[1]&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.[1]&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. [3]&amp;lt;br /&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.[2]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.[5]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستندکه در واقع مجموعه هایی از اشیا بخش بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاستر شده توزیع شده اند و می توانند به صورت موازی کار کنند. به Rdd های ایجاد شده توسط کاربر تبدیل یا transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال قطعه کد زیر یک RDD ایجاد می کند که پیغام های خطا را از طریق جستجوی خطوطی که با عبارت ERROR آغاز می شوند از یک فایل log استخراج کرده و بر روی کنسول نمایش می دهد.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
 val lines = spark.textFile(“hdfs://...”) &lt;br /&gt;
 val errors = lines.filter(line =&amp;gt; line.startsWith(“ERROR”)) &lt;br /&gt;
 println(“Total errors: “ + errors.count())&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
خط اول یک RDD بر روی یک فایل HDFS تعریف می کند. خط دوم یک تبدیل از نوع غربال برای استخراج یک RDD جدید از خطوط تعریف می کند. و نهایتا خط آخر با فراخو.انی count که نوع دیگری از RDD به نام action است یک نتیجه را برای برنامه (که در اینجا تعداد عناصر RDD است)، باز می گرداند.&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. [5]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال یک کاربر که قصد رفع یک مشکل را دارد، ممکن است با فراخوانی زیر روی یک کلاستر، بخواهد از بین مجموعه های بسیار بزرگی از داده پیغام های خطا را در حافظه بارگذاری کند:&amp;lt;br /&amp;gt;&lt;br /&gt;
errors.persist()&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
پس از این کار می توان پرس و جوهای مختلفی بر روی داده موجود در حافظه اصلی اجرا نمود.&amp;lt;br /&amp;gt;&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال فرض کنید عملیات زیر توسط کاربر بر روی خطوط خطا انجام شده است:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt; &lt;br /&gt;
 // Count the errors mentioning MySQL&lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).count() &lt;br /&gt;
 // Fetch the MySQL errors as an array of strings &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).collect() &lt;br /&gt;
 // Fetch the time fields of errors mentioning PHP as an array &lt;br /&gt;
 // (assuming time is field number 3 in a tab-separated format): &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“PHP”)) &lt;br /&gt;
 .map(line =&amp;gt; line.split(‘\t’)(3)) .collect()&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
2. Anand Loganathan, Ankur Sinha, Muthuramakrishnan V.,&lt;br /&gt;
and Srikanth Natarajan/A Systematic Approach to Big Data&lt;br /&gt;
Exploration of the Hadoop Framework/2014/[http://www.irphouse.com/volume%20special/ijictv4n9spl.htm لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
4.Xiaoyi Lu ; Dept. of Comput. Sci. &amp;amp; Eng., Ohio State Univ., Columbus, OH, USA ; Rahman, M.W.U. ; Islam, N. ; Shankar, D / &lt;br /&gt;
Accelerating Spark with RDMA for Big Data Processing: Early Experiences&lt;br /&gt;
/2014/[http://ieeexplore.ieee.org/xpl/articleDetails.jsp?tp=&amp;amp;arnumber=6925713&amp;amp;url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D6925713 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
/2012/[https://www.usenix.org/system/files/login/articles/zaharia.pdf لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
6.Dilpreet Singh and Chandan K Reddy / A survey on platforms for big data analytics&lt;br /&gt;
/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&amp;amp;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 لینک به مقاله]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13557</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13557"/>
		<updated>2015-12-27T02:12:45Z</updated>

		<summary type="html">&lt;p&gt;94131572: /* معرفی ابزار Apache Spark */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می باشد. در واقع یک فریم ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به کار گرفته شد. از مزیت های آن بهبود مدیریت حافظه است.&amp;lt;ref name=&amp;quot;1&amp;quot;&amp;gt;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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در واقع هدف از توسعه Spark رفع محدودیت های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم های قبلی بود.[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations)  می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark زبان های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. [6] &amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlib است.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.[1]&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.[1]&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.[1]&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.[1]&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. [3]&amp;lt;br /&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.[2]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.[5]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستندکه در واقع مجموعه هایی از اشیا بخش بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاستر شده توزیع شده اند و می توانند به صورت موازی کار کنند. به Rdd های ایجاد شده توسط کاربر تبدیل یا transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال قطعه کد زیر یک RDD ایجاد می کند که پیغام های خطا را از طریق جستجوی خطوطی که با عبارت ERROR آغاز می شوند از یک فایل log استخراج کرده و بر روی کنسول نمایش می دهد.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
 val lines = spark.textFile(“hdfs://...”) &lt;br /&gt;
 val errors = lines.filter(line =&amp;gt; line.startsWith(“ERROR”)) &lt;br /&gt;
 println(“Total errors: “ + errors.count())&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
خط اول یک RDD بر روی یک فایل HDFS تعریف می کند. خط دوم یک تبدیل از نوع غربال برای استخراج یک RDD جدید از خطوط تعریف می کند. و نهایتا خط آخر با فراخو.انی count که نوع دیگری از RDD به نام action است یک نتیجه را برای برنامه (که در اینجا تعداد عناصر RDD است)، باز می گرداند.&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. [5]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال یک کاربر که قصد رفع یک مشکل را دارد، ممکن است با فراخوانی زیر روی یک کلاستر، بخواهد از بین مجموعه های بسیار بزرگی از داده پیغام های خطا را در حافظه بارگذاری کند:&amp;lt;br /&amp;gt;&lt;br /&gt;
errors.persist()&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
پس از این کار می توان پرس و جوهای مختلفی بر روی داده موجود در حافظه اصلی اجرا نمود.&amp;lt;br /&amp;gt;&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال فرض کنید عملیات زیر توسط کاربر بر روی خطوط خطا انجام شده است:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt; &lt;br /&gt;
 // Count the errors mentioning MySQL&lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).count() &lt;br /&gt;
 // Fetch the MySQL errors as an array of strings &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).collect() &lt;br /&gt;
 // Fetch the time fields of errors mentioning PHP as an array &lt;br /&gt;
 // (assuming time is field number 3 in a tab-separated format): &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“PHP”)) &lt;br /&gt;
 .map(line =&amp;gt; line.split(‘\t’)(3)) .collect()&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
2. Anand Loganathan, Ankur Sinha, Muthuramakrishnan V.,&lt;br /&gt;
and Srikanth Natarajan/A Systematic Approach to Big Data&lt;br /&gt;
Exploration of the Hadoop Framework/2014/[http://www.irphouse.com/volume%20special/ijictv4n9spl.htm لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
4.Xiaoyi Lu ; Dept. of Comput. Sci. &amp;amp; Eng., Ohio State Univ., Columbus, OH, USA ; Rahman, M.W.U. ; Islam, N. ; Shankar, D / &lt;br /&gt;
Accelerating Spark with RDMA for Big Data Processing: Early Experiences&lt;br /&gt;
/2014/[http://ieeexplore.ieee.org/xpl/articleDetails.jsp?tp=&amp;amp;arnumber=6925713&amp;amp;url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D6925713 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
/2012/[https://www.usenix.org/system/files/login/articles/zaharia.pdf لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
6.Dilpreet Singh and Chandan K Reddy / A survey on platforms for big data analytics&lt;br /&gt;
/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&amp;amp;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 لینک به مقاله]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13556</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13556"/>
		<updated>2015-12-27T02:08:27Z</updated>

		<summary type="html">&lt;p&gt;94131572: /* معرفی ابزار Apache Spark */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می باشد. در واقع یک فریم ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به کار گرفته شد. از مزیت های آن بهبود مدیریت حافظه است.&amp;lt;ref&amp;gt;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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در واقع هدف از توسعه Spark رفع محدودیت های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم های قبلی بود.[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations)  می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark زبان های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. [6] &amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlib است.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.[1]&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.[1]&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.[1]&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.[1]&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. [3]&amp;lt;br /&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.[2]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.[5]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستندکه در واقع مجموعه هایی از اشیا بخش بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاستر شده توزیع شده اند و می توانند به صورت موازی کار کنند. به Rdd های ایجاد شده توسط کاربر تبدیل یا transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال قطعه کد زیر یک RDD ایجاد می کند که پیغام های خطا را از طریق جستجوی خطوطی که با عبارت ERROR آغاز می شوند از یک فایل log استخراج کرده و بر روی کنسول نمایش می دهد.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
 val lines = spark.textFile(“hdfs://...”) &lt;br /&gt;
 val errors = lines.filter(line =&amp;gt; line.startsWith(“ERROR”)) &lt;br /&gt;
 println(“Total errors: “ + errors.count())&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
خط اول یک RDD بر روی یک فایل HDFS تعریف می کند. خط دوم یک تبدیل از نوع غربال برای استخراج یک RDD جدید از خطوط تعریف می کند. و نهایتا خط آخر با فراخو.انی count که نوع دیگری از RDD به نام action است یک نتیجه را برای برنامه (که در اینجا تعداد عناصر RDD است)، باز می گرداند.&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. [5]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال یک کاربر که قصد رفع یک مشکل را دارد، ممکن است با فراخوانی زیر روی یک کلاستر، بخواهد از بین مجموعه های بسیار بزرگی از داده پیغام های خطا را در حافظه بارگذاری کند:&amp;lt;br /&amp;gt;&lt;br /&gt;
errors.persist()&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
پس از این کار می توان پرس و جوهای مختلفی بر روی داده موجود در حافظه اصلی اجرا نمود.&amp;lt;br /&amp;gt;&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال فرض کنید عملیات زیر توسط کاربر بر روی خطوط خطا انجام شده است:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt; &lt;br /&gt;
 // Count the errors mentioning MySQL&lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).count() &lt;br /&gt;
 // Fetch the MySQL errors as an array of strings &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).collect() &lt;br /&gt;
 // Fetch the time fields of errors mentioning PHP as an array &lt;br /&gt;
 // (assuming time is field number 3 in a tab-separated format): &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“PHP”)) &lt;br /&gt;
 .map(line =&amp;gt; line.split(‘\t’)(3)) .collect()&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
2. Anand Loganathan, Ankur Sinha, Muthuramakrishnan V.,&lt;br /&gt;
and Srikanth Natarajan/A Systematic Approach to Big Data&lt;br /&gt;
Exploration of the Hadoop Framework/2014/[http://www.irphouse.com/volume%20special/ijictv4n9spl.htm لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
4.Xiaoyi Lu ; Dept. of Comput. Sci. &amp;amp; Eng., Ohio State Univ., Columbus, OH, USA ; Rahman, M.W.U. ; Islam, N. ; Shankar, D / &lt;br /&gt;
Accelerating Spark with RDMA for Big Data Processing: Early Experiences&lt;br /&gt;
/2014/[http://ieeexplore.ieee.org/xpl/articleDetails.jsp?tp=&amp;amp;arnumber=6925713&amp;amp;url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D6925713 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
/2012/[https://www.usenix.org/system/files/login/articles/zaharia.pdf لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
6.Dilpreet Singh and Chandan K Reddy / A survey on platforms for big data analytics&lt;br /&gt;
/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&amp;amp;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 لینک به مقاله]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13555</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13555"/>
		<updated>2015-12-27T02:06:03Z</updated>

		<summary type="html">&lt;p&gt;94131572: /* مراجع */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می باشد. در واقع یک فریم ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به کار گرفته شد. از مزیت های آن بهبود مدیریت حافظه است.&amp;lt;ref&amp;gt;[1]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در واقع هدف از توسعه Spark رفع محدودیت های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم های قبلی بود.[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations)  می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark زبان های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. [6] &amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlib است.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.[1]&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.[1]&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.[1]&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.[1]&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. [3]&amp;lt;br /&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.[2]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.[5]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستندکه در واقع مجموعه هایی از اشیا بخش بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاستر شده توزیع شده اند و می توانند به صورت موازی کار کنند. به Rdd های ایجاد شده توسط کاربر تبدیل یا transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال قطعه کد زیر یک RDD ایجاد می کند که پیغام های خطا را از طریق جستجوی خطوطی که با عبارت ERROR آغاز می شوند از یک فایل log استخراج کرده و بر روی کنسول نمایش می دهد.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
 val lines = spark.textFile(“hdfs://...”) &lt;br /&gt;
 val errors = lines.filter(line =&amp;gt; line.startsWith(“ERROR”)) &lt;br /&gt;
 println(“Total errors: “ + errors.count())&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
خط اول یک RDD بر روی یک فایل HDFS تعریف می کند. خط دوم یک تبدیل از نوع غربال برای استخراج یک RDD جدید از خطوط تعریف می کند. و نهایتا خط آخر با فراخو.انی count که نوع دیگری از RDD به نام action است یک نتیجه را برای برنامه (که در اینجا تعداد عناصر RDD است)، باز می گرداند.&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. [5]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال یک کاربر که قصد رفع یک مشکل را دارد، ممکن است با فراخوانی زیر روی یک کلاستر، بخواهد از بین مجموعه های بسیار بزرگی از داده پیغام های خطا را در حافظه بارگذاری کند:&amp;lt;br /&amp;gt;&lt;br /&gt;
errors.persist()&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
پس از این کار می توان پرس و جوهای مختلفی بر روی داده موجود در حافظه اصلی اجرا نمود.&amp;lt;br /&amp;gt;&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال فرض کنید عملیات زیر توسط کاربر بر روی خطوط خطا انجام شده است:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt; &lt;br /&gt;
 // Count the errors mentioning MySQL&lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).count() &lt;br /&gt;
 // Fetch the MySQL errors as an array of strings &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).collect() &lt;br /&gt;
 // Fetch the time fields of errors mentioning PHP as an array &lt;br /&gt;
 // (assuming time is field number 3 in a tab-separated format): &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“PHP”)) &lt;br /&gt;
 .map(line =&amp;gt; line.split(‘\t’)(3)) .collect()&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
2. Anand Loganathan, Ankur Sinha, Muthuramakrishnan V.,&lt;br /&gt;
and Srikanth Natarajan/A Systematic Approach to Big Data&lt;br /&gt;
Exploration of the Hadoop Framework/2014/[http://www.irphouse.com/volume%20special/ijictv4n9spl.htm لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
4.Xiaoyi Lu ; Dept. of Comput. Sci. &amp;amp; Eng., Ohio State Univ., Columbus, OH, USA ; Rahman, M.W.U. ; Islam, N. ; Shankar, D / &lt;br /&gt;
Accelerating Spark with RDMA for Big Data Processing: Early Experiences&lt;br /&gt;
/2014/[http://ieeexplore.ieee.org/xpl/articleDetails.jsp?tp=&amp;amp;arnumber=6925713&amp;amp;url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D6925713 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
/2012/[https://www.usenix.org/system/files/login/articles/zaharia.pdf لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
6.Dilpreet Singh and Chandan K Reddy / A survey on platforms for big data analytics&lt;br /&gt;
/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&amp;amp;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 لینک به مقاله]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13554</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13554"/>
		<updated>2015-12-27T02:04:54Z</updated>

		<summary type="html">&lt;p&gt;94131572: /* معرفی ابزار Apache Spark */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می باشد. در واقع یک فریم ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به کار گرفته شد. از مزیت های آن بهبود مدیریت حافظه است.&amp;lt;ref&amp;gt;[1]&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در واقع هدف از توسعه Spark رفع محدودیت های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم های قبلی بود.[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations)  می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark زبان های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. [6] &amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlib است.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.[1]&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.[1]&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.[1]&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.[1]&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. [3]&amp;lt;br /&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.[2]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.[5]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستندکه در واقع مجموعه هایی از اشیا بخش بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاستر شده توزیع شده اند و می توانند به صورت موازی کار کنند. به Rdd های ایجاد شده توسط کاربر تبدیل یا transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال قطعه کد زیر یک RDD ایجاد می کند که پیغام های خطا را از طریق جستجوی خطوطی که با عبارت ERROR آغاز می شوند از یک فایل log استخراج کرده و بر روی کنسول نمایش می دهد.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
 val lines = spark.textFile(“hdfs://...”) &lt;br /&gt;
 val errors = lines.filter(line =&amp;gt; line.startsWith(“ERROR”)) &lt;br /&gt;
 println(“Total errors: “ + errors.count())&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
خط اول یک RDD بر روی یک فایل HDFS تعریف می کند. خط دوم یک تبدیل از نوع غربال برای استخراج یک RDD جدید از خطوط تعریف می کند. و نهایتا خط آخر با فراخو.انی count که نوع دیگری از RDD به نام action است یک نتیجه را برای برنامه (که در اینجا تعداد عناصر RDD است)، باز می گرداند.&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. [5]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال یک کاربر که قصد رفع یک مشکل را دارد، ممکن است با فراخوانی زیر روی یک کلاستر، بخواهد از بین مجموعه های بسیار بزرگی از داده پیغام های خطا را در حافظه بارگذاری کند:&amp;lt;br /&amp;gt;&lt;br /&gt;
errors.persist()&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
پس از این کار می توان پرس و جوهای مختلفی بر روی داده موجود در حافظه اصلی اجرا نمود.&amp;lt;br /&amp;gt;&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال فرض کنید عملیات زیر توسط کاربر بر روی خطوط خطا انجام شده است:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt; &lt;br /&gt;
 // Count the errors mentioning MySQL&lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).count() &lt;br /&gt;
 // Fetch the MySQL errors as an array of strings &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).collect() &lt;br /&gt;
 // Fetch the time fields of errors mentioning PHP as an array &lt;br /&gt;
 // (assuming time is field number 3 in a tab-separated format): &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“PHP”)) &lt;br /&gt;
 .map(line =&amp;gt; line.split(‘\t’)(3)) .collect()&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
2. Anand Loganathan, Ankur Sinha, Muthuramakrishnan V.,&lt;br /&gt;
and Srikanth Natarajan/A Systematic Approach to Big Data&lt;br /&gt;
Exploration of the Hadoop Framework/2014/[http://www.irphouse.com/volume%20special/ijictv4n9spl.htm لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
4.Xiaoyi Lu ; Dept. of Comput. Sci. &amp;amp; Eng., Ohio State Univ., Columbus, OH, USA ; Rahman, M.W.U. ; Islam, N. ; Shankar, D / &lt;br /&gt;
Accelerating Spark with RDMA for Big Data Processing: Early Experiences&lt;br /&gt;
/2014/[http://ieeexplore.ieee.org/xpl/articleDetails.jsp?tp=&amp;amp;arnumber=6925713&amp;amp;url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D6925713 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
/2012/[https://www.usenix.org/system/files/login/articles/zaharia.pdf لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
6.Dilpreet Singh and Chandan K Reddy / A survey on platforms for big data analytics&lt;br /&gt;
/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&amp;amp;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 لینک به مقاله]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13550</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13550"/>
		<updated>2015-12-25T18:52:09Z</updated>

		<summary type="html">&lt;p&gt;94131572: /* مقایسه ابزارهای Hadoop و Spark */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می باشد. در واقع یک فریم ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به کار گرفته شد. از مزیت های آن بهبود مدیریت حافظه است.[1]&amp;lt;br /&amp;gt;&lt;br /&gt;
در واقع هدف از توسعه Spark رفع محدودیت های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم های قبلی بود.[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations)  می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark زبان های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. [6] &amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlib است.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.[1]&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.[1]&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.[1]&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.[1]&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. [3]&amp;lt;br /&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.[2]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.[5]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستندکه در واقع مجموعه هایی از اشیا بخش بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاستر شده توزیع شده اند و می توانند به صورت موازی کار کنند. به Rdd های ایجاد شده توسط کاربر تبدیل یا transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال قطعه کد زیر یک RDD ایجاد می کند که پیغام های خطا را از طریق جستجوی خطوطی که با عبارت ERROR آغاز می شوند از یک فایل log استخراج کرده و بر روی کنسول نمایش می دهد.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
 val lines = spark.textFile(“hdfs://...”) &lt;br /&gt;
 val errors = lines.filter(line =&amp;gt; line.startsWith(“ERROR”)) &lt;br /&gt;
 println(“Total errors: “ + errors.count())&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
خط اول یک RDD بر روی یک فایل HDFS تعریف می کند. خط دوم یک تبدیل از نوع غربال برای استخراج یک RDD جدید از خطوط تعریف می کند. و نهایتا خط آخر با فراخو.انی count که نوع دیگری از RDD به نام action است یک نتیجه را برای برنامه (که در اینجا تعداد عناصر RDD است)، باز می گرداند.&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. [5]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال یک کاربر که قصد رفع یک مشکل را دارد، ممکن است با فراخوانی زیر روی یک کلاستر، بخواهد از بین مجموعه های بسیار بزرگی از داده پیغام های خطا را در حافظه بارگذاری کند:&amp;lt;br /&amp;gt;&lt;br /&gt;
errors.persist()&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
پس از این کار می توان پرس و جوهای مختلفی بر روی داده موجود در حافظه اصلی اجرا نمود.&amp;lt;br /&amp;gt;&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال فرض کنید عملیات زیر توسط کاربر بر روی خطوط خطا انجام شده است:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt; &lt;br /&gt;
 // Count the errors mentioning MySQL&lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).count() &lt;br /&gt;
 // Fetch the MySQL errors as an array of strings &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).collect() &lt;br /&gt;
 // Fetch the time fields of errors mentioning PHP as an array &lt;br /&gt;
 // (assuming time is field number 3 in a tab-separated format): &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“PHP”)) &lt;br /&gt;
 .map(line =&amp;gt; line.split(‘\t’)(3)) .collect()&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
2. Anand Loganathan, Ankur Sinha, Muthuramakrishnan V.,&lt;br /&gt;
and Srikanth Natarajan/A Systematic Approach to Big Data&lt;br /&gt;
Exploration of the Hadoop Framework/2014/[http://www.irphouse.com/volume%20special/ijictv4n9spl.htm لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
4.Xiaoyi Lu ; Dept. of Comput. Sci. &amp;amp; Eng., Ohio State Univ., Columbus, OH, USA ; Rahman, M.W.U. ; Islam, N. ; Shankar, D / &lt;br /&gt;
Accelerating Spark with RDMA for Big Data Processing: Early Experiences&lt;br /&gt;
/2014/[http://ieeexplore.ieee.org/xpl/articleDetails.jsp?tp=&amp;amp;arnumber=6925713&amp;amp;url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D6925713 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
/2012/[https://www.usenix.org/system/files/login/articles/zaharia.pdf لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
6.Dilpreet Singh and Chandan K Reddy / A survey on platforms for big data analytics&lt;br /&gt;
/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&amp;amp;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 لینک به مقاله]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13549</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13549"/>
		<updated>2015-12-25T18:50:44Z</updated>

		<summary type="html">&lt;p&gt;94131572: /* مراجع */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می باشد. در واقع یک فریم ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به کار گرفته شد. از مزیت های آن بهبود مدیریت حافظه است.[1]&amp;lt;br /&amp;gt;&lt;br /&gt;
در واقع هدف از توسعه Spark رفع محدودیت های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم های قبلی بود.[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations)  می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark زبان های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. [6] &amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlib است.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.[1]&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.[1]&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.[1]&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.[1]&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. [3]&amp;lt;br /&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.[2]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.[5]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستندکه در واقع مجموعه هایی از اشیا بخش بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاستر شده توزیع شده اند و می توانند به صورت موازی کار کنند. به Rdd های ایجاد شده توسط کاربر تبدیل یا transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال قطعه کد زیر یک RDD ایجاد می کند که پیغام های خطا را از طریق جستجوی خطوطی که با عبارت ERROR آغاز می شوند از یک فایل log استخراج کرده و بر روی کنسول نمایش می دهد.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
 val lines = spark.textFile(“hdfs://...”) &lt;br /&gt;
 val errors = lines.filter(line =&amp;gt; line.startsWith(“ERROR”)) &lt;br /&gt;
 println(“Total errors: “ + errors.count())&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
خط اول یک RDD بر روی یک فایل HDFS تعریف می کند. خط دوم یک تبدیل از نوع غربال برای استخراج یک RDD جدید از خطوط تعریف می کند. و نهایتا خط آخر با فراخو.انی count که نوع دیگری از RDD به نام action است یک نتیجه را برای برنامه (که در اینجا تعداد عناصر RDD است)، باز می گرداند.&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. [5]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال یک کاربر که قصد رفع یک مشکل را دارد، ممکن است با فراخوانی زیر روی یک کلاستر، بخواهد از بین مجموعه های بسیار بزرگی از داده پیغام های خطا را در حافظه بارگذاری کند:&amp;lt;br /&amp;gt;&lt;br /&gt;
errors.persist()&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
پس از این کار می توان پرس و جوهای مختلفی بر روی داده موجود در حافظه اصلی اجرا نمود.&amp;lt;br /&amp;gt;&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال فرض کنید عملیات زیر توسط کاربر بر روی خطوط خطا انجام شده است:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt; &lt;br /&gt;
// Count the errors mentioning MySQL&lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).count() &lt;br /&gt;
 // Fetch the MySQL errors as an array of strings &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).collect() &lt;br /&gt;
 // Fetch the time fields of errors mentioning PHP as an array &lt;br /&gt;
 // (assuming time is field number 3 in a tab-separated format): &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“PHP”)) &lt;br /&gt;
 .map(line =&amp;gt; line.split(‘\t’)(3)) .collect()&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
2. Anand Loganathan, Ankur Sinha, Muthuramakrishnan V.,&lt;br /&gt;
and Srikanth Natarajan/A Systematic Approach to Big Data&lt;br /&gt;
Exploration of the Hadoop Framework/2014/[http://www.irphouse.com/volume%20special/ijictv4n9spl.htm لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
4.Xiaoyi Lu ; Dept. of Comput. Sci. &amp;amp; Eng., Ohio State Univ., Columbus, OH, USA ; Rahman, M.W.U. ; Islam, N. ; Shankar, D / &lt;br /&gt;
Accelerating Spark with RDMA for Big Data Processing: Early Experiences&lt;br /&gt;
/2014/[http://ieeexplore.ieee.org/xpl/articleDetails.jsp?tp=&amp;amp;arnumber=6925713&amp;amp;url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D6925713 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
/2012/[https://www.usenix.org/system/files/login/articles/zaharia.pdf لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
6.Dilpreet Singh and Chandan K Reddy / A survey on platforms for big data analytics&lt;br /&gt;
/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&amp;amp;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 لینک به مقاله]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13548</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13548"/>
		<updated>2015-12-25T18:50:02Z</updated>

		<summary type="html">&lt;p&gt;94131572: /* مقایسه ابزارهای Hadoop و Spark */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می باشد. در واقع یک فریم ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به کار گرفته شد. از مزیت های آن بهبود مدیریت حافظه است.[1]&amp;lt;br /&amp;gt;&lt;br /&gt;
در واقع هدف از توسعه Spark رفع محدودیت های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم های قبلی بود.[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations)  می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark زبان های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. [6] &amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlib است.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.[1]&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.[1]&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.[1]&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.[1]&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. [3]&amp;lt;br /&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.[2]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.[5]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستندکه در واقع مجموعه هایی از اشیا بخش بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاستر شده توزیع شده اند و می توانند به صورت موازی کار کنند. به Rdd های ایجاد شده توسط کاربر تبدیل یا transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال قطعه کد زیر یک RDD ایجاد می کند که پیغام های خطا را از طریق جستجوی خطوطی که با عبارت ERROR آغاز می شوند از یک فایل log استخراج کرده و بر روی کنسول نمایش می دهد.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt;&lt;br /&gt;
 val lines = spark.textFile(“hdfs://...”) &lt;br /&gt;
 val errors = lines.filter(line =&amp;gt; line.startsWith(“ERROR”)) &lt;br /&gt;
 println(“Total errors: “ + errors.count())&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
خط اول یک RDD بر روی یک فایل HDFS تعریف می کند. خط دوم یک تبدیل از نوع غربال برای استخراج یک RDD جدید از خطوط تعریف می کند. و نهایتا خط آخر با فراخو.انی count که نوع دیگری از RDD به نام action است یک نتیجه را برای برنامه (که در اینجا تعداد عناصر RDD است)، باز می گرداند.&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. [5]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال یک کاربر که قصد رفع یک مشکل را دارد، ممکن است با فراخوانی زیر روی یک کلاستر، بخواهد از بین مجموعه های بسیار بزرگی از داده پیغام های خطا را در حافظه بارگذاری کند:&amp;lt;br /&amp;gt;&lt;br /&gt;
errors.persist()&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
پس از این کار می توان پرس و جوهای مختلفی بر روی داده موجود در حافظه اصلی اجرا نمود.&amp;lt;br /&amp;gt;&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال فرض کنید عملیات زیر توسط کاربر بر روی خطوط خطا انجام شده است:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;div dir=&amp;quot;ltr&amp;quot;&amp;gt; &lt;br /&gt;
// Count the errors mentioning MySQL&lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).count() &lt;br /&gt;
 // Fetch the MySQL errors as an array of strings &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).collect() &lt;br /&gt;
 // Fetch the time fields of errors mentioning PHP as an array &lt;br /&gt;
 // (assuming time is field number 3 in a tab-separated format): &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“PHP”)) &lt;br /&gt;
 .map(line =&amp;gt; line.split(‘\t’)(3)) .collect()&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
2. Anand Loganathan, Ankur Sinha, Muthuramakrishnan V.,&lt;br /&gt;
and Srikanth Natarajan/A Systematic Approach to Big Data&lt;br /&gt;
Exploration of the Hadoop Framework/2014/[http://www.irphouse.com/volume%20special/ijictv4n9spl.htm لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
4.Xiaoyi Lu ; Dept. of Comput. Sci. &amp;amp; Eng., Ohio State Univ., Columbus, OH, USA ; Rahman, M.W.U. ; Islam, N. ; Shankar, D / &lt;br /&gt;
Accelerating Spark with RDMA for Big Data Processing: Early Experiences&lt;br /&gt;
/2014/[http://ieeexplore.ieee.org/xpl/articleDetails.jsp?tp=&amp;amp;arnumber=6925713&amp;amp;url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D6925713 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
/2012/[https://www.usenix.org/system/files/login/articles/zaharia.pdf لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
6.Dilpreet Singh and Chandan K Reddy / A survey on platforms for big data analytics&lt;br /&gt;
/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&amp;amp;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 لینک به مقاله]&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13547</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13547"/>
		<updated>2015-12-25T18:40:21Z</updated>

		<summary type="html">&lt;p&gt;94131572: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می باشد. در واقع یک فریم ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به کار گرفته شد. از مزیت های آن بهبود مدیریت حافظه است.[1]&amp;lt;br /&amp;gt;&lt;br /&gt;
در واقع هدف از توسعه Spark رفع محدودیت های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم های قبلی بود.[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations)  می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark زبان های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. [6] &amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlib است.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.[1]&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.[1]&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.[1]&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.[1]&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. [3]&amp;lt;br /&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.[2]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.[5]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستندکه در واقع مجموعه هایی از اشیا بخش بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاستر شده توزیع شده اند و می توانند به صورت موازی کار کنند. به Rdd های ایجاد شده توسط کاربر تبدیل یا transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال قطعه کد زیر یک RDD ایجاد می کند که پیغام های خطا را از طریق جستجوی خطوطی که با عبارت ERROR آغاز می شوند از یک فایل log استخراج کرده و بر روی کنسول نمایش می دهد.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 val lines = spark.textFile(“hdfs://...”) &lt;br /&gt;
 val errors = lines.filter(line =&amp;gt; line.startsWith(“ERROR”)) &lt;br /&gt;
 println(“Total errors: “ + errors.count())&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
خط اول یک RDD بر روی یک فایل HDFS تعریف می کند. خط دوم یک تبدیل از نوع غربال برای استخراج یک RDD جدید از خطوط تعریف می کند. و نهایتا خط آخر با فراخو.انی count که نوع دیگری از RDD به نام action است یک نتیجه را برای برنامه (که در اینجا تعداد عناصر RDD است)، باز می گرداند.&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. [5]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال یک کاربر که قصد رفع یک مشکل را دارد، ممکن است با فراخوانی زیر روی یک کلاستر، بخواهد از بین مجموعه های بسیار بزرگی از داده پیغام های خطا را در حافظه بارگذاری کند:&amp;lt;br /&amp;gt;&lt;br /&gt;
errors.persist()&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
پس از این کار می توان پرس و جوهای مختلفی بر روی داده موجود در حافظه اصلی اجرا نمود.&amp;lt;br /&amp;gt;&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال فرض کنید عملیات زیر توسط کاربر بر روی خطوط خطا انجام شده است:&amp;lt;br /&amp;gt;&lt;br /&gt;
 // Count the errors mentioning MySQL&lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).count() &lt;br /&gt;
 // Fetch the MySQL errors as an array of strings &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).collect() &lt;br /&gt;
 // Fetch the time fields of errors mentioning PHP as an array &lt;br /&gt;
 // (assuming time is field number 3 in a tab-separated format): &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“PHP”)) &lt;br /&gt;
 .map(line =&amp;gt; line.split(‘\t’)(3)) .collect()&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
2. Anand Loganathan, Ankur Sinha, Muthuramakrishnan V.,&lt;br /&gt;
and Srikanth Natarajan/A Systematic Approach to Big Data&lt;br /&gt;
Exploration of the Hadoop Framework/2014/[http://www.irphouse.com/volume%20special/ijictv4n9spl.htm لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
4.Xiaoyi Lu ; Dept. of Comput. Sci. &amp;amp; Eng., Ohio State Univ., Columbus, OH, USA ; Rahman, M.W.U. ; Islam, N. ; Shankar, D / &lt;br /&gt;
Accelerating Spark with RDMA for Big Data Processing: Early Experiences&lt;br /&gt;
/2014/[http://ieeexplore.ieee.org/xpl/articleDetails.jsp?tp=&amp;amp;arnumber=6925713&amp;amp;url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D6925713 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
/2012/[https://www.usenix.org/system/files/login/articles/zaharia.pdf لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
6.Dilpreet Singh and Chandan K Reddy / A survey on platforms for big data analytics&lt;br /&gt;
/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&amp;amp;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 لینک به مقاله]&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13546</id>
		<title>بررسی ابزارهای MapReduce در BigData</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_MapReduce_%D8%AF%D8%B1_BigData&amp;diff=13546"/>
		<updated>2015-12-25T18:39:07Z</updated>

		<summary type="html">&lt;p&gt;94131572: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== چکیده ==&lt;br /&gt;
با رشد روزافزون حجم و انواع داده ها ضروریست که سازمان ها به دنبال روش هایی برای افزایش سرعت در پردازش داده های حجیم باشند. MapReduce مدلی برای پردازش حجم بسیار بزرگ داده است که اولین بار توسط گوگل ارایه گردید. این مدل شامل دو وظیفه است: اولی وظیفه نگاشت (Map) که داده را از یک مجموعه وسیهع دریافت می کند و عناصر آن به جفت های کلید-مقدار (key-value pairs) شکسته می شوند. و دومین وظیفه که Reduce نام دارد خروجی Map را گرفته و بخش های مختلف داده را با هم ترکیب نموده یک مجموعه کوچکتر از جفت های کلید-مقدار به عنوان خروجی بر می گرداند.&lt;br /&gt;
[[پرونده:Mapreduce.png|400px|قاب|وسط]]&lt;br /&gt;
در این مقاله می خواهیم دو ابزار معروف MapReduce به نام های Hadoop و Spark محصول کمپانی Apache را مورد بررسی قرار دهیم.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==تاریخچه و معرفی مدل نگاشت کاهشی==&lt;br /&gt;
یکی از فراگیرترین مدل های برنامه نویسی تجمعی برای گران داده مدل نگاشت کاهشی است. که توسط گوگل در سال 2004 پیشنهاد شد و برای پردازش حجم وسیع داده روی ماشین های کلاستر شده به کار گرفته شد.[1]&lt;br /&gt;
مدل نگاشت کاهشی بر پایه یک ساختار جفت &amp;lt;کلید ، مقدار&amp;gt; طراحی شده است که در فاز نگاشت، هر برنامه تابع نگاشت، یک تک جفت &amp;lt;کلید ، مقدار&amp;gt; به عنوان ورودی گرفته یک لیست میانی از &amp;lt;کلید ، مقدار&amp;gt; به عنوان خروجی تولید می کند. توضیحات فوق را می توان در قالب فرم زیر نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
map (key1, value1) → {(key2, value2) , . . .}  )                 (1)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
سپس کتابخانه نگاشت کاهشی تمام جفت های &amp;lt;کلید ، مقدار&amp;gt; میانی را بر اساس کلید گروه بندی می کند. نهایتا تابع کاهش جفت های گروه بندی شده را گرفته و به ازای هر گروه یک جفت &amp;lt;کلید ، مقدار&amp;gt; جدید به عنوان خروجی تولید می کند که می توان به فرم زیر این موضوع را نمایش داد:&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reduce (key2, {value2, . . .}) → (key2, value3)                 (2)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
دو پیاده سازی از برنامه نویسی نگاشت کاهشی در سال های اخیر Hadoop و Spark می باشند.[1]&lt;br /&gt;
== معرفی ابزار Apache Hadoop ==&lt;br /&gt;
Apache Hadoop یک فریم ورک متن باز است که در زبان جاوا نوشته شده و امکان پردازش و مدیریت مجموعه های بزرگ داده را در محیط توسعه یافته فراهم می کند.[1]&amp;lt;br /&amp;gt;&lt;br /&gt;
Hadoop بر روی یک فایل سیستم توزیع شده Hadoop یا HDFS کار می کند که قادر است فایل های داده را در تعداد زیادی گره به صورت موازی توزیع کند و این کار امکان ارسال سریع داده را بین گره ها امکان پذیر نموده و هنگامی که یک یا چند گره مختل شوند، سیستم همچنان بدون وقفه قادر به ادامه سرویس دهی خواهد بود.[1]&amp;lt;br /&amp;gt;&lt;br /&gt;
در حالت کلی توابع نگاشت کاهشی به همراه مولفه های دسترسی و جابجایی داده، تعیین کننده اصلی تاخیر در برنامه های end-to-end هستند. مطالعات متعدد کارایی نشان می دهند که Hadoop دارای نقاط حساس زیادی است که می توانند بر روی کارایی آن تاثیرگذار باشند. در حقیقت Hadoop دارای حدود 200 پارامتر تنظیم کننده است که هرکدام از آنها برروی کارایی آن اثرگذارند و یک برنامه نویس باید تمامی آنها را برای دریافت یک کارایی خوب تنظیم کرده باشد. شواهد تجربی نشان می دهد که تنظیم دقیق تعداد کمی از این پارامترها می تواند کارایی را 100 تا 200 درصد افزایش دهد. بهینه سازی تنظیمات یک برنامه Hadoop بر روی یک بستر اجرایی یک طراحی بسیار پیچیده است. [3]&amp;lt;br /&amp;gt;&lt;br /&gt;
مولفه های مهم Hadoop عبارتند از:[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;Distributed File System (HDFS)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک سیستم فایل توزیع شده برای ذخیره داده بر روی کلاستری از چندین سرور است که  امکاناتی نظیر مقاومت در برابر خرابی (Fault Tolerance) را ارایه می کند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hadoop YARN&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک لایه مدیریت منابع و زمانبندی کارها در کلاستر می باشد.&lt;br /&gt;
* &amp;lt;big&amp;gt;Apache Pig&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک Wrapper برای مدل نگاشت کاهشی است که محیط آن شبیه SQL است که توسط Yahoo توسعه یافته و سازمان های زیادی نظیر Yahoo، Twitter، AOL و  LinkedIn و ... از آن استفاده می کنند.&lt;br /&gt;
* &amp;lt;big&amp;gt;Hive&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Wrapper دیگری برای مدل نگاشت کاهشی است که توسط Facebook توسعه یافته است. در واقع این ابزار و ابزار Pig به برنامه نویسان کمک می کنند که درگیر پیچیدگی های کدنویسی مدل نگاشت کاهشی نشوند.&lt;br /&gt;
* &amp;lt;big&amp;gt;HBase&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
یک مدل پایگاه داده غیررابطه ای است که پرس و جوهای سطح پایین را پشتیبانی می کند و در واقع در مقابل Hive قرار می گیرد که کاملا از SQL پشتبیانی می کند. همجنین برخلاف Hive برای پردازش برنامه های real-time مورد استفاده قرار می گیرد.[2]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-Structure.png|600px|بندانگشتی|وسط]]&lt;br /&gt;
==مقدمه==&lt;br /&gt;
در حال حاضر حجم داده در فضای اینترنت رشد بسیار زیادی در حد ترابایت و پتابایت دارد. همزمان با رشد داده، انواع داده تولیدشده توسط برنامه ها نیز از گذشته بیشتر می شود. در نتیجه روش ذخیره سازی پایگاه های داده رابطه ای دیگر پاسخگو نبوده و بسیاری از شرکت های فعال در زمینه فناوری اطلاعات به پایگاه های داده NoSQL نظیر Cassandra و HBase برای مدیریت گران داده (BigData) روی آورده اند و ممکن است از سیستم های محاسباتی توسعه یافته نظیر Hadoop نیز در کنار آنها استفاده کنند. پایگاه های داده NoSQL معمولا از روش ذخیره سازی کلید-مقدار (key-value)، غیررابطه ای توسعه یافته، با مقیاس افقی و بدون ساختار استفاده می کنند.&lt;br /&gt;
با این وجود آیا ما امروزه به مدل سازی داده نیاز داریم؟ مدل سازی در روش رابطه ای بر روی پیچیدگی روابط چندین schema تمرکز داشت ولی این موارد برای پایگاه های داده غیررابطه ای و بدون schema دیگر مطرح نیست. لذا روش های مدل سازی داده قدیمی دیگر کارامد نبوده و ما به یک متدولوژی جدید برای مدیریت گران داده نیاز داریم.&lt;br /&gt;
دیاگرام زیر معماری کلی گران داده را نمایش می دهد:&lt;br /&gt;
[[پرونده:Mapreduce-Model.png|400px|قاب|وسط]]&lt;br /&gt;
همان طور که از دیاگرام فوق مشخص است مدل های گران داده در سه لایه نشان داده شده اند:&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه داده فیزیکی:&amp;lt;/big&amp;gt; داده ای است که ما در یک سیستم گران داده داریم که می تواند در انواع مختلف نظیر video، audio،logs ،business tables و غیره باشد.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی داده:&amp;lt;/big&amp;gt; لایه ای است که برای مدیریت داده فیزیکی به کار می رود.&lt;br /&gt;
#	&amp;lt;big&amp;gt;لایه مدل سازی محاسباتی:&amp;lt;/big&amp;gt; لایه کاربردی که برای بازیابی اطلاعات برای ارزش گذاری تجاری به کار می رود.&lt;br /&gt;
تمرکز ما در این مقاله بر روی لایه سوم یا مدل سازی محاسباتی می باشد که به بررسی ابزارهای نگاشت کاهشی خواهیم پرداخت.&lt;br /&gt;
==معرفی ابزار Apache Spark==&lt;br /&gt;
Spark ابزار دیگری است که در ارتباط تنگاتنگ با Hadoop می باشد. در واقع یک فریم ورک محاسباتی کلاستر بوده که در ابتدا توسط آزمایشگاه برکلی دانشگاه کالیفرنیا (UC Berkeley AMP) برای پردازش داده در مقیاس بزرگ، ارایه و به کار گرفته شد. از مزیت های آن بهبود مدیریت حافظه است.[1]&amp;lt;br /&amp;gt;&lt;br /&gt;
در واقع هدف از توسعه Spark رفع محدودیت های دسترسی به دیسک در Hadoop و ارتقا کارایی سیستم های قبلی بود.[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
ویژگی متمایزکننده Spark توانایی آن در انجام محاسبات در حافظه اصلی (in-memory computations)  می باشد و به داده اجازه می دهد تا در حافظه اصلی Cache شود. Spark زبان های حاوا، اسکالا و پایتون پشتیبانی نموده و برای انجام کارها سرعت آن زمانی که داده کاملا در حافظه اصلی جای می گیرد، تا 100 برابر و زمانی که داده روی دیسک قرار دارد تا 10 برابر بیشتر از Hadoop ارزیابی شده است. [6] &amp;lt;br /&amp;gt;&lt;br /&gt;
Spark از HDFS استفاده می کند و دارای کتابخانه های سطح بالا برای پردازش جریان های داده ، یادگیری ماشین و پردازش گراف نظیر MLlib است.&amp;lt;br /&amp;gt;&lt;br /&gt;
==مقایسه ابزارهای Hadoop و Spark==&lt;br /&gt;
Spark قادر است از طریق نگه داری داده در حافظه تا 40 برابر سریعتر از Hadoop عمل کند. ممکن است در ابتدا این دو ابزار کاملا متفاوت به نظر بیایند. مشکل اصلی در اینجاست که برنامه های چند گذری(multi-pass) و تعاملی نیاز به اشتراک گذاری داده در چندین مرحله نگاشت کاهشی دارند (به عنوان مثال کاربر بتواند چندین پرس و جو ارسال کند یا محاسبات افزایشی در چندین مرحله انجام شود)، متاسفانه تنها راه به اشتراک گذاری داده بین عملیات موازی در نگاشت کاهشی نوشتن آنها در یک فایل سیستم توزیع شده است که بار زیادی به دلیل تکرار (نوشتن همزمان روی چند ماشین) و عملیات ورودی / خروجی دارد. که در حقیقت این سربار در زمان اجرا از طریق الگوریتم های یادگیری ماشین پیاده سازی شده توسط Hadoop  تا بیش از 90%  قابل کاهش است.[5]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Spark این مشکل را با ایجاد یک حافظه جدید اولیه به نام مجموعه های داده توزیع شده واکنشی  یا به اختصار (RDDs) برطرف نموده است. RDDs به کاربران اجازه می دهد داده را با اجرای پرس و جو در حافظه ذخیره نماید و همچنین بالا بردن آستانه تحمل خرابی (Fault Tolerance) بدون نیاز به Replication و از طریق ردیابی اینکه چطور می توان داده خراب را به صورت مجدد از اطلاعات خام روی دیسک بازیابی نمود، را امکان پذیر می نماید. این ویژگی به RDDs را قادر می سازد تا سرعت خواندن و نوشتن از فایل سیستم های توزیع شده را تا بیش از 40 برابر بالا ببرد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
علاوه بر بالا بردن سرعت برنامه های کلاستر شده، Spark همچنین درحال تلاش برای ساده تر نوشتن برنامه ها از طریق زبان Scala است که یک زبان تابعی فراگیر برای JVM است. به علاوه Spark سازگاری خوبی با Hadoop  دارد به طوری که می تواند از هر سیستم ذخیره سازی که توسط Hadoop پشتیبانی شده است (نظیر HDFS، HBase، یا S3)، از طریق واسط های Hadoop بخواند یا روی آن بنویسد. بنابراین Spark می تواند مکمل قدرتمندی برای Hadoop باشد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;محدودیت مدل نگاشت کاهشی&amp;lt;/big&amp;gt;&lt;br /&gt;
یکی از مهم ترین مشکلات و محدودیت های مدل نگاشت کاهشی کارایی ضعیف آن هنگام اجرای الگوریتم های تکرارپذیر (Iterative) است. در واقع مدل نگاشت کاهشی برای پردازش های تکرارپذیر طراحی نشده است. نگاشت کننده ها داده مشابه را بارها و بارها از روی دیسک می خوانند. بعد از هر بار تکرار نتایج باید برای ارسال به تکرار بعدی روی دیسک نوشته شود و در واقع عمل خواندن از دیسک و نوشتن روی آن به شدت کارایی را کاهش می دهد. به ازای هر تکرار یک نگاشت کننده و یک کاهنده باید ساخته شده و مقداردهی اولیه شوند. برخی پیشنهادها نظیر زمانبندی رو به جلو (Forward Scheduling) برای حل این مشکل ارایه شده اند ولی این راه حل ها خود باعث افزایش پیچیدگی می شوند. راه حل دیگری به نام HaLoop ارایه شده است که کارایی مدل نگاشت کاهشی را با از طریق مکانیزم Caching بهبود می بخشد.[6]&amp;lt;br /&amp;gt;&lt;br /&gt;
* &amp;lt;big&amp;gt;واسط برنامه نویسی&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستندکه در واقع مجموعه هایی از اشیا بخش بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاستر شده توزیع شده اند و می توانند به صورت موازی کار کنند. به Rdd های ایجاد شده توسط کاربر تبدیل یا transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال قطعه کد زیر یک RDD ایجاد می کند که پیغام های خطا را از طریق جستجوی خطوطی که با عبارت ERROR آغاز می شوند از یک فایل log استخراج کرده و بر روی کنسول نمایش می دهد.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 val lines = spark.textFile(“hdfs://...”) &lt;br /&gt;
 val errors = lines.filter(line =&amp;gt; line.startsWith(“ERROR”)) &lt;br /&gt;
 println(“Total errors: “ + errors.count())&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
خط اول یک RDD بر روی یک فایل HDFS تعریف می کند. خط دوم یک تبدیل از نوع غربال برای استخراج یک RDD جدید از خطوط تعریف می کند. و نهایتا خط آخر با فراخو.انی count که نوع دیگری از RDD به نام action است یک نتیجه را برای برنامه (که در اینجا تعداد عناصر RDD است)، باز می گرداند.&lt;br /&gt;
Spark به کابران اجازه می دهد که بتوانند این API را چه از طریق برنامه های مستقل (standalone) و چه از طریق برنامه های تعاملی با زبان Scala فراخوانی کنند تا با سرعت بیشتری عملیات جستجوی داده انجام شود. از آنجا که زبان Scala بر روی JVM اجرا می شود، امکان فراخوانی تمامی کتابخانه های جاوایی نیز در این زبان وجود دارد. [5]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
آنچه که مدل Spark را متمایز می کند، امکان بارگذاری داده در حافظه است. به صورت پیش فرض، RDD ها در Spark فرار هستند به طوری که در هر بار عملیات باید مجددا محاسبه شوند. البته کاربر می تواند برای بالا بردن سرعت پردازش مجدد، RDD های مورد نظرش را  پایدار کند. در صورتی که حافظه اصلی گنجایش داده را نداشته باشد،Spark به صورت خودکار مشابه Hadoop آن را به دیسک منتقل می کند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال یک کاربر که قصد رفع یک مشکل را دارد، ممکن است با فراخوانی زیر روی یک کلاستر، بخواهد از بین مجموعه های بسیار بزرگی از داده پیغام های خطا را در حافظه بارگذاری کند:&amp;lt;br /&amp;gt;&lt;br /&gt;
errors.persist()&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
پس از این کار می توان پرس و جوهای مختلفی بر روی داده موجود در حافظه اصلی اجرا نمود.&amp;lt;br /&amp;gt;&lt;br /&gt;
در نمونه ای عملیاتی مقدار 50GB از داده های Wikipedia بر روی یک کلاستر Amazon شامل 20 گره توزیع شده است. زمان انجام یک جستجوی full-test  از روی دیسک به کمک Hadoop برابر 20 ثانیه و همان جستجو از طریق RDD موجود درحافظه اصلی برابر 0.8 محاسبه شده است. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Iteration.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*&amp;lt;big&amp;gt;مقاومت در برابر خرابی (Fault Tolerance)&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
در Spark هر RDD قادر است گراف تبدیلاتی که برای ساخت آن به کار رفته است (و گراف اجداد یا Lineage Graph نام دارد)، را ردیابی نموده و همان عملیات را مجددا بر روی داده اولیه اعمال نماید تا بخش های از دست رفته مجددا بازیابی شوند.&amp;lt;br /&amp;gt;&lt;br /&gt;
به عنوان مثال فرض کنید عملیات زیر توسط کاربر بر روی خطوط خطا انجام شده است:&amp;lt;br /&amp;gt;&lt;br /&gt;
 // Count the errors mentioning MySQL&lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).count() &lt;br /&gt;
 // Fetch the MySQL errors as an array of strings &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“MySQL”)).collect() &lt;br /&gt;
 // Fetch the time fields of errors mentioning PHP as an array &lt;br /&gt;
 // (assuming time is field number 3 in a tab-separated format): &lt;br /&gt;
 errors.filter(line =&amp;gt; line.contains(“PHP”)) &lt;br /&gt;
 .map(line =&amp;gt; line.split(‘\t’)(3)) .collect()&lt;br /&gt;
همه این عملیات مجددا بر روی داده خام اولیه انجام خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[پرونده:Spark-Fault-Tolerance.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
عملیات بازیابی خرابی مبتنی بر گراف اجداد به این دلیل است که از تکرار یا replicate  نمودن داده جلوگیری می کند. این مورد هم به کاهش زمان ایجاد RDDها و هم به کاهش حجم حافظه مورد نیاز برای ذخیره سازی داده کمک می کند. حتی اگر همه گره های تحت یک برنامه Spark نیز خراب شوند، همه RDDها بازیابی شده و محددا در مدار قرار خواهند گرفت. [5]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==نتیجه گیری==&lt;br /&gt;
در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:&lt;br /&gt;
[[پرونده:Hadoop-vs-Spark-Table.png|700px|بندانگشتی|وسط]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== مراجع ==&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
A MapReduce Approach/2015/ [http://www.hindawi.com/journals/mpe/2015/246139 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
2. Anand Loganathan, Ankur Sinha, Muthuramakrishnan V.,&lt;br /&gt;
and Srikanth Natarajan/A Systematic Approach to Big Data&lt;br /&gt;
Exploration of the Hadoop Framework/2014/[http://www.irphouse.com/volume%20special/ijictv4n9spl.htm لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
4.Xiaoyi Lu ; Dept. of Comput. Sci. &amp;amp; Eng., Ohio State Univ., Columbus, OH, USA ; Rahman, M.W.U. ; Islam, N. ; Shankar, D / &lt;br /&gt;
Accelerating Spark with RDMA for Big Data Processing: Early Experiences&lt;br /&gt;
/2014/[http://ieeexplore.ieee.org/xpl/articleDetails.jsp?tp=&amp;amp;arnumber=6925713&amp;amp;url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D6925713 لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
/2012/[https://www.usenix.org/system/files/login/articles/zaharia.pdf لینک به مقاله]&lt;br /&gt;
&lt;br /&gt;
6.Dilpreet Singh and Chandan K Reddy / A survey on platforms for big data analytics&lt;br /&gt;
/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&amp;amp;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 لینک به مقاله]&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D9%81%D8%B1%D9%88%D8%B4%DA%AF%D8%A7%D9%87_%DA%A9%D8%AA%D8%A7%D8%A8_%D8%A7%D9%84%DA%A9%D8%AA%D8%B1%D9%88%D9%86%DB%8C%DA%A9%DB%8C&amp;diff=13527</id>
		<title>فروشگاه کتاب الکترونیکی</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D9%81%D8%B1%D9%88%D8%B4%DA%AF%D8%A7%D9%87_%DA%A9%D8%AA%D8%A7%D8%A8_%D8%A7%D9%84%DA%A9%D8%AA%D8%B1%D9%88%D9%86%DB%8C%DA%A9%DB%8C&amp;diff=13527"/>
		<updated>2015-12-25T09:37:01Z</updated>

		<summary type="html">&lt;p&gt;94131572: /* تحلیل صنعت خود */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* موضوع: '''فروشگاه کتاب الکترونیکی'''&lt;br /&gt;
&lt;br /&gt;
* تهیه کننده: سید ابوالفضل هاشمی&lt;br /&gt;
&lt;br /&gt;
== خلاصه اجرایی ==&lt;br /&gt;
از آن جا که امروزه مشغله کاری و زمان های تلف شده افراد با توجه به افزایش حجم کار و ترافیک رو به افزایش است، لذا زنده کردن وقت مرده ( مثل زمانهایی که در انتظار هستیم، زمانی که در اتوبوس می گذرد و ... ) و انجام کارها به طور همزمان دو راه برای ایجاد وقت است که بزرگترین توانایی ما کمک به افراد در ایجاد وقت برای مطالعه است. شعار ما این است: &amp;quot;با ایجاد وقت برای مطالعه از زندگی خود لذت ببرید.&amp;quot; کتابخانه الکترونیکی ما امکان چینش کتاب های شما را یه نحو مطلوب فراهم نموده و ابزار کتابخوان هوشمند ما از طریق ارایه امکانات منحصر به فرد، به شما لذت کتابخوانی را هدیه می کند. مشتریان ما همه اقشار باسواد جامعه خواهند بود. فروشگاه ما یکی از بزرگترین فروشگاه های محتوای دیجیتالی خواهد بود که در آن می توان انواع کتب الکترونیک، کتاب صوتی، سخنرانی، دوره های آموزش مجازی و آثار مکتوب دیگر را به طور قانونی خریداری و مطالعه نمود.&lt;br /&gt;
&lt;br /&gt;
== معرفی شرکت ==&lt;br /&gt;
فروشگاه کتاب الکترونیکی با نام تجاری Book-Zoom فعالیت خود را از تاریخ 1395/01/01 آغاز خواهد نمود.&lt;br /&gt;
آدرس فیزیکی فروشگاه: تهران- میدان انقلاب- ابتدای خیابان دکتر قریب&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
بنیان گذاران Book-Zoom &lt;br /&gt;
*دکتر علی زواره ای فرزند محسن ساکن تهران&lt;br /&gt;
*مهندس صادق آهنگریان فرزند سعید ساکن تهران&lt;br /&gt;
&amp;lt;br /&amp;gt;اهم فعالیت های شرکت عبارتند از&lt;br /&gt;
*فروش الکترونیکی انواع کتاب در دوقالب فیزیکی و دیجیتال&lt;br /&gt;
*توسعه نرم افزار کتاب خوان با قابلیت های منحصر به فرد&lt;br /&gt;
*ارایه خدمات کتابخانه ای به صورت الکترونیکی برای دسته بندی بهتر کتاب ها توسط مشتریان &lt;br /&gt;
=== چارت سازمانی ===&lt;br /&gt;
[[پرونده:Ebook-shop-chart.png|300px|قاب|وسط]]&lt;br /&gt;
&lt;br /&gt;
=== چشم انداز ===&lt;br /&gt;
* ورود به بازارهای جهانی فروش کتاب پس از 6 سال&lt;br /&gt;
* ایجاد شعب فروشگاه در 25 کشور جهان حداکثر تا 10 سال آینده&lt;br /&gt;
&lt;br /&gt;
=== ماموریت ===&lt;br /&gt;
ماموریت اصلی فروشگاه کتاب الکترونیک فروش انواع کتاب به صورت الکترونیکی و ارایه خدمات کتابخانه الکترونیک و کتابخوانی الکترونیکی می باشد.&lt;br /&gt;
&lt;br /&gt;
=== اهداف ===&lt;br /&gt;
* '''اهداف کسب و کار'''&lt;br /&gt;
رساندن موجودی کتاب الکترونیکی به 1000 نسخه و فیزیکی به 1000 جلد تا پایان سال دوم &amp;lt;br /&amp;gt;&lt;br /&gt;
کار در حوزه کتاب های تاریخی، تکنولوژی، علمی پس از سال اول &amp;lt;br /&amp;gt;&lt;br /&gt;
امکان فروش به صورت بین امللی و ارزی تا پایان سال دوم&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''اهداف مالي'''&lt;br /&gt;
بازگشت سرمایه طی سه سال اول &amp;lt;br /&amp;gt;&lt;br /&gt;
رساندن مبلغ فروش ماهیانه به پانصد میلیون ریال تا پایان شش ماه اول &amp;lt;br /&amp;gt;&lt;br /&gt;
شروع کسب درامد از طریق تبلیغات پس از شش ماه اول&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''اهداف پرسنلی '''&lt;br /&gt;
تشکیل تیم تحقیق و توسعه جهت ساخت ابزار و توسعه سایت تا حداکثر سه ماه آینده &amp;lt;br /&amp;gt;&lt;br /&gt;
تشکیل تیم پشتیبانی نرم افزار در سال اول &amp;lt;br /&amp;gt;&lt;br /&gt;
تامین تیم مشاورین تا یک ماه آینده&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''اهداف تحقيق و توسعه'''&lt;br /&gt;
ایجاد یک سیستم مستقل از بستر که به مشتریان اجازه خرید واستفاده از کتاب های مطلوبشان را در هر زمان و هر مکانی و برروی هر ابزار اعم از گوشی موبایل تبلت و یا کامپیوتر شخصی را می دهد.&amp;lt;br /&amp;gt;&lt;br /&gt;
ایجاد ابزار کتابخوان قابل خصوصی سازی توسط مشتری با امکانات کامل&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== معرفی محصولات و خدمات ==&lt;br /&gt;
محصولات این صنعت شامل موارد زیر است:&lt;br /&gt;
*کتاب های تجاری (شامل کتاب های فرهنگی، دانشگاهی و ...)&lt;br /&gt;
*کتاب های مذهبی&lt;br /&gt;
*کتاب های صوتی&lt;br /&gt;
*کتاب های متنی&lt;br /&gt;
*سایر کتاب ها&lt;br /&gt;
*مجلات و روزنامه&lt;br /&gt;
*سایر اقلام مرتبط با این صنعت &lt;br /&gt;
&lt;br /&gt;
خدمات و فعالیت ها شامل موارد زیر هستند:&lt;br /&gt;
*عرضه و فروش کتاب های جدید (شامل کتاب های الکترونیکی)&lt;br /&gt;
*فروش روزنامه، مجلات و سایر نشریات مقطعی (مثل ماهنامه ها و هفته نامه ها)&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===سایت های مشابه داخلی===&lt;br /&gt;
&amp;lt;big&amp;gt;فیدیبو (http://fidibo.com)&amp;lt;br /&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
به نظر می رسد یکی از کاملترین فروشگاه های کتاب الکترونیک داخلی است که مدعی ارایه امکانات زیر است:&lt;br /&gt;
* قالب کتابها pdf نبوده و قابلیت تطبیق پذیری با ابزار مورد استفاده را دارند که باید نرم افزار مربوطه از سایت دانلود و بر روی دستگاه نصب گردد.&lt;br /&gt;
* امکان فروش ریالی و ارزی&lt;br /&gt;
* واسط کاربری فروشگاه چندان دلچسب کاربر نبوده و می تواند از نقاط ضعف فروشگاه به حساب بیاید.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;فراکتاب (http://www.faraketab.ir)&amp;lt;/big&amp;gt;&lt;br /&gt;
* دارای نرم افزار کتابخوان با امکانات اولیه که تنها از سیستم عامل اندروید پشتیبانی می کند.&lt;br /&gt;
* واسط کاربری نه چندان قدرتمند&lt;br /&gt;
* ارایه کتاب های متنی و صوتی&lt;br /&gt;
* امکان فروش فقط به صورت ریالی&lt;br /&gt;
===سایت های مشابه خارجی===&lt;br /&gt;
&amp;lt;big&amp;gt;http://www.amazon.com&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* امکان جستجوی قوی&lt;br /&gt;
* واسط کاربری حرفه ای&lt;br /&gt;
* معرفی سایت های دیگر عرضه کننده کتاب&lt;br /&gt;
* نمایش خلاصه ای از کتاب&lt;br /&gt;
* ارایه پیشنهاد کتاب های مرتبط&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;https://books.google.com&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* امکان جستجوی قدرتمند از طریق موتور جستجوی google&lt;br /&gt;
* امکان مطالعه برخط کتاب در صورت داشتن مجوز یا خارج بودن از قانون کپی رایت&lt;br /&gt;
* امکان خرید یا امانت گرفتن کتاب&lt;br /&gt;
* ارجاع به سایت های دیگر جهت خرید&lt;br /&gt;
* ارایه پیشنهاد کتاب های مرتبط&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;http://www.barnesandnoble.com&amp;lt;br /&amp;gt;&lt;br /&gt;
* واسط کاربری حرفه ای&lt;br /&gt;
* امکان عضویت و ارایه مزایا به اعضا&lt;br /&gt;
* ارایه کتاب های صوتی و متنی&lt;br /&gt;
* امکان مذاکره برخط و چانه زنی&lt;br /&gt;
* فروش کتابخوان، فیلم و موسیقی&lt;br /&gt;
* ارایه پیشنهاد کتاب های مرتبط&lt;br /&gt;
&lt;br /&gt;
===ویژگی های متمایز کننده محصول===&lt;br /&gt;
&lt;br /&gt;
مهم ترین ویژگی های متمایز کننده محصول ما عبارتند از:&amp;lt;br /&amp;gt;&lt;br /&gt;
# ابزار کتابخوان قدرتمند مستقل از بستر که قابل اجرا بر روی تمامی ابزار ها و همچنین قابل خصوصی سازی توسط کاربر است.&amp;lt;br /&amp;gt;&lt;br /&gt;
# عرضه کتاب های الکترونیکی مبتني بر استانداردهاي جهاني صنعت نشر و با رعايت كامل قانون جهاني كپي رايت، طراحي و اجرا خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
# طراحی حرفه ای سایت با امکانات سریع جستجو در شرایطی که اکثر سایت های فروش کتاب ایرانی از امکانات ضعیف طراحی بهره مند می شوند، می تواند فروشگاه ما را از دیگر فروشگاه های الکترونیکی کتاب متمایز نماید.&amp;lt;br /&amp;gt;&lt;br /&gt;
# قیمت کتاب های الکترونیکی به دلیل عدم نیاز به چاپ و کاغذ حدود 20 درصد ارزانتر از کتاب های کاغذی خواهد بود.&amp;lt;br /&amp;gt;&lt;br /&gt;
# وجود کتابخانه الکترونیکی قابل خصوصی سازی توسط مشتری برای سهولت در دسته بندی و چینش کتاب های مورد نظر.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== تحلیل صنعت مادر ==&lt;br /&gt;
در صنعت فروش کتاب، شرکت ها به فروش دامنه وسیعی از کتاب ها در حوزه های مختلف، مجلات، مقالات و کتاب های مقطعی می پردازند. این اقلام می توانند از ناشرین و عرضه کنندگان داخلی و حتی بین المللی خریداری شوند. عاملین فروش کتاب نهایتا این محصولات را از طریق فروشگاه های خود به صورت عمومی به فروش می رسانند. فروشگاه هایی که همه نوع اقلام تجاری را عرضه می کنند و همچنین مراکز پستی از این صنعت مستثنی هستند.&amp;lt;br /&amp;gt;&lt;br /&gt;
فروشگاه های کتاب از گذشته (که تنها روش سنتی امکانپذیر بود،) تاکنون (که روش های نوین فروش مثل روش الکترونیکی به وجود آمده است)، تفاوت های اساسی کرده اند، ولی تنها ماموریت آنها فروش کتاب بوده است. تعداد زیادی از فروشگاه های کتاب سنتی به دلیل بازار شدید رقابتی و کاهش مشتری از میدان به در رفته اند و برخی دیگر که معمولا فروشگاه های بزرگ زنجیره ای کتاب هستند، با ورود به بازارهای اینترنتی همچنان به فعالیت خود ادامه می دهند.&amp;lt;br /&amp;gt;&lt;br /&gt;
آمار (http://www.census.gov/prod/ec02/ec0244i04t.pdf) نشان می دهد که در آمریکا در سال 1997 تعداد فروشگاه کتاب فیزیکی در سه سطح کوچک خرده فروشی مستقل و زنجیره ای بزرگ از 12363 به 10800 در سال 2002 کاهش یافته است که در واقع 12.2 درصد کاهش داشته است. همچنین فروش کتاب فیزیکی نیز از 2007 تاکنون در امریکا 9.6 درصد کاهش داشته است.&lt;br /&gt;
&lt;br /&gt;
== تحلیل صنعت خود ==&lt;br /&gt;
صنعت فروش کتاب فیزیکی در مرحله کاهشی (رو به افول) از چرخه حیات خود می باشد که این موضوع با توجه به بازار محصول اشباع شده و کاهش نرخ رشد، کاملا مشهود است، ولی در نقطه مقابل آن صنعت فروش کتاب الکترونیکی است که تحقیقات بازار نشان می دهد که روز به روز در دنیا و در پی آن در ایران رو به رشد است.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
با استناد به سایت باشگاه خبرنگاران در پژوهش «نظرسنجی از بازدیدکنندگان نمایشگاه» سال 1392 در میان پاسخگویان 35.7 درصد کتاب‌های الکترونیک مطالعه کرده‌اند.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
0.5 درصد از افراد فاقد مطالعه کتب الکترونیک در یک هفته هستند. 6.4 درصد از پاسخگویان کمتر از یک ساعت، 7.9 درصد، یک تا دو ساعت؛ 20.9 درصد، دو ساعت و بیشتر در یک هفته مطالعه کتب الکترونیک داشته‌اند. در این پژوهش، میانگین مدت زمان مطالعه کتب الکترونیکی در یک هفته 233.61 دقیقه، است.&lt;br /&gt;
آمار فوق به علاوه آمار 70.7 درصدی طولانی بودن ساعات اشتغال و تحصیل و نداشتن وقت  نشان می دهد که بازار فروش کتاب الکترونیک به شرط آن که با کیفیت بالا انچام گیرد و بتواند مشتریان را راضی نگاه دارد می تواند آینده روشنی داشته باشد.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== تحلیل بازار ==&lt;br /&gt;
طبق آماری که شرکت [http://www.sbdcnet.org/small-business-research-reports/bookstore-2012 SBDCNet] که از شرکت های فعال در زمینه تحقیقات بازار می باشد؛ ارایه نموده، بازار اصلی هدف در فروش کتاب در امریکا عبارتند از:&lt;br /&gt;
*رده سنی 45 تا 64 سال&lt;br /&gt;
*افراد با درآمد بالا&lt;br /&gt;
*افراد متاهل بدون فرزند&lt;br /&gt;
*افراد متاهل با فرزندان محصل یا دانشجو&lt;br /&gt;
*افراد دانشگاهی&lt;br /&gt;
*افراد ساکن شهرهای بزرگ&lt;br /&gt;
افراد با مدارج دانشگاهی دو برابر سایر مشتریان برای کتاب هزینه می کنند و حدود 57 درصد بازار فروش کتاب را تشکیل می دهند. مشتریان رده سنی 45 تا 64 سال 28 تا 33 درصد بیشتر از سایر سطوح برای کتاب هزینه می کنند. بسیاری از افراد این رده سنی زمان خالی زیادی دارند که می توانند به مطالعه تخصیص دهند. زوج های بدون فرزند 24 درصد و زوج های دارای فرزند محصل حدود 34 تا 42 درصد بیشتر برای کتاب وقت صرف می کنند. جوان های رده 18 تا 24 سال و سالمندان رده سنی 65 به بالاتر، مبالغ  کمتری برای کتاب صرف می کنند.&lt;br /&gt;
[[پرونده:target-market.png|1000px|بندانگشتی|وسط]]&lt;br /&gt;
&lt;br /&gt;
در ایران طبق نتایج پژوهش «نظرسنجی از بازدیدکنندگان نمایشگاه» بیشترین مطالعه انواع کتاب در یکسال گذشته بدین ترتیب است:&lt;br /&gt;
*رمان و داستان (بزرگسالان) 14.79 درصد&lt;br /&gt;
*روانشناسی و تربیتی 11.17 درصد&lt;br /&gt;
*شعر 10.29 درصد&lt;br /&gt;
*تاریخ 9.22 درصد&lt;br /&gt;
*علوم ریاضی، طبیعی و عملی 7.76 درصد&lt;br /&gt;
*دینی 7.45 درصد&lt;br /&gt;
*زبان‌های خارجه 7.29 درصد&lt;br /&gt;
*قرآن و ادعیه 6.33 درصد&lt;br /&gt;
*اجتماعی 5.72 درصد&lt;br /&gt;
*فرهنگ، هنر و معماری 4.76 درصد&lt;br /&gt;
*فلسفی 4.26 درصد&lt;br /&gt;
*سیاسی 3.53 درصد&lt;br /&gt;
*کودک و نوجوان 3.34 درصد&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
طبق نتایج 8.9 درصد پاسخگویان عنوان کرده‌اند اصلاً کتاب‌های غیردرسی مطالعه نمی‌کنند، بیش از نیمی از پاسخگویان (57.4 درصد) اظهار کرده‌اند به میزان  کم و خیلی کم به مطالعه کتب غیردرسی می‌پردازند و 33.8 درصد هم مطالعه کتب غیردرسی خود را به میزان زیاد و خیلی زیاد مطرح کرده‌اند.&amp;lt;br /&amp;gt;&lt;br /&gt;
مطابق آمار فوق دانشجویان و دانش آموزان در صدر بازار هدف قرار می گیرند. کتب درسی و دانشگاهی و همجنین رمان و داستان نیز جز محصولات پرفروش خواهند بود.&lt;br /&gt;
&lt;br /&gt;
== تحلیل رقابتی ==&lt;br /&gt;
&lt;br /&gt;
[[پرونده:BookShopSwat.png|300px|قاب|وسط]]&lt;br /&gt;
&lt;br /&gt;
== تدوین استراتژی ==&lt;br /&gt;
*'''استراتژی های بازاریابی'''&lt;br /&gt;
**جذب نیروی های بازاریاب با تجربه برای جذب مشتری و آگهی های تبلیغاتی&lt;br /&gt;
**برگزاری دوره های تخصصی بازاریابی متناسب با هر بخش از بازار هدف&lt;br /&gt;
*'''استراتژی های تبلیغاتی'''&lt;br /&gt;
**تبلیغات اینترنتی در دیگر سایت های مرتبط با کتاب &lt;br /&gt;
**انعقاد قرارداد با شرکت های خبره تبلیغاتی جهت ارایه راهکارهای مناسب.&lt;br /&gt;
*'''استراتژی های قیمت گذاری'''&lt;br /&gt;
**امکانات عمومی استفاده از نرم افزار کتابخوان و همچنین کتابخانه هوشمند رایگان بوده ولی استفاده از برخی امکانات تخصصی مشمول هزینه خواهد بود.&lt;br /&gt;
**شیوه اصلی کسب درآمد در این سامانه از طریق فروش کتاب و محصولات خواهد بود.&lt;br /&gt;
*'''استراتژي هاي جذب و نگهداري مشتري'''&lt;br /&gt;
**ارايه خدمات ويژه و افزایش درصد تخفیف به ازای هر بار خرید&lt;br /&gt;
**برگزاري قرعه كشي و اهداي جوايز به مشتريان&lt;br /&gt;
** برگزاری مسابفات کتاب خوانی &lt;br /&gt;
**برگزاري نظرسنجي الكترونيكي به صورت مستمر براي بهبود سامانه مطابق با نظر كاربران&lt;br /&gt;
**مدل سازی کاربران برای ارایه سرویس بهتر&lt;br /&gt;
*'''استراتژي هاي امنيتي'''&lt;br /&gt;
**استفاده از آخرين تكنولوژي هاي روز امنيت اطلاعات شبكه و وب&lt;br /&gt;
**حفظ محرمانگي اطلاعات اختصاصي كاربران&lt;br /&gt;
**ثبت سوابق فعالیت های اعضا&lt;br /&gt;
&lt;br /&gt;
== مراحل توسعه محصولات ==&lt;br /&gt;
*انعقاد قرارداد با ناشرین برتر جهت تعاملات بیشتر در سال دوم&lt;br /&gt;
*عرضه موسیقی و فیلم در سال دوم&lt;br /&gt;
*تکمیل امکانات واسط کاربری حداکثر تا انتهای سال دوم&lt;br /&gt;
*ارایه امکان فروش ارزی در سال سوم&lt;br /&gt;
*افزودن سرورهای استانی در پنج استان بزرگ کشور جهت ارتقا سرعت ارایه خدمات در سال چهارم&lt;br /&gt;
*توسعه کتاب های تخصصی لاتین برای ورود به بازارهای جهانی از ابتدای سال چهارم&lt;br /&gt;
&lt;br /&gt;
== تحلیل مالی ==&lt;br /&gt;
&lt;br /&gt;
== تحلیل ریسک ==&lt;br /&gt;
&lt;br /&gt;
== طرح فنی ==&lt;br /&gt;
سامانه فروشگاه کتاب الکترونیکی یک سامانه تحت وب مستقل از بستر بوده که کاربران می توانند با هر ابزار اعم از موبایل، تبلت و کامپیوتر دسک تاپ تنها از طریق یک مرورگر اقدام به استفاده از سامانه نمایند. عملیات پیاده سازی این سامانه در بخش تحقیق و توسعه شرکت انجام خواهد شد.&lt;br /&gt;
&lt;br /&gt;
ویژگیهای فنی سامانه به شرح زیر است:&lt;br /&gt;
&lt;br /&gt;
[[پرونده:Technical-tools.png|300px|قاب|وسط]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
کاربران سامانه شامل دسته های زیر می باشند:&lt;br /&gt;
* خریداران&lt;br /&gt;
* اعضا&lt;br /&gt;
* ناشرین&lt;br /&gt;
مدل 7 لایه ای معماری سیستم تجارت الکترونیک نیز به صورت زیر خواهد بود:&lt;br /&gt;
[[پرونده:Seven-layers-model.png|300px|قاب|وسط]]&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
	<entry>
		<id>http://wiki.occc.ir/index.php?title=%D9%81%D8%B1%D9%88%D8%B4%DA%AF%D8%A7%D9%87_%DA%A9%D8%AA%D8%A7%D8%A8_%D8%A7%D9%84%DA%A9%D8%AA%D8%B1%D9%88%D9%86%DB%8C%DA%A9%DB%8C&amp;diff=13526</id>
		<title>فروشگاه کتاب الکترونیکی</title>
		<link rel="alternate" type="text/html" href="http://wiki.occc.ir/index.php?title=%D9%81%D8%B1%D9%88%D8%B4%DA%AF%D8%A7%D9%87_%DA%A9%D8%AA%D8%A7%D8%A8_%D8%A7%D9%84%DA%A9%D8%AA%D8%B1%D9%88%D9%86%DB%8C%DA%A9%DB%8C&amp;diff=13526"/>
		<updated>2015-12-25T09:36:39Z</updated>

		<summary type="html">&lt;p&gt;94131572: /* تحلیل صنعت خود */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* موضوع: '''فروشگاه کتاب الکترونیکی'''&lt;br /&gt;
&lt;br /&gt;
* تهیه کننده: سید ابوالفضل هاشمی&lt;br /&gt;
&lt;br /&gt;
== خلاصه اجرایی ==&lt;br /&gt;
از آن جا که امروزه مشغله کاری و زمان های تلف شده افراد با توجه به افزایش حجم کار و ترافیک رو به افزایش است، لذا زنده کردن وقت مرده ( مثل زمانهایی که در انتظار هستیم، زمانی که در اتوبوس می گذرد و ... ) و انجام کارها به طور همزمان دو راه برای ایجاد وقت است که بزرگترین توانایی ما کمک به افراد در ایجاد وقت برای مطالعه است. شعار ما این است: &amp;quot;با ایجاد وقت برای مطالعه از زندگی خود لذت ببرید.&amp;quot; کتابخانه الکترونیکی ما امکان چینش کتاب های شما را یه نحو مطلوب فراهم نموده و ابزار کتابخوان هوشمند ما از طریق ارایه امکانات منحصر به فرد، به شما لذت کتابخوانی را هدیه می کند. مشتریان ما همه اقشار باسواد جامعه خواهند بود. فروشگاه ما یکی از بزرگترین فروشگاه های محتوای دیجیتالی خواهد بود که در آن می توان انواع کتب الکترونیک، کتاب صوتی، سخنرانی، دوره های آموزش مجازی و آثار مکتوب دیگر را به طور قانونی خریداری و مطالعه نمود.&lt;br /&gt;
&lt;br /&gt;
== معرفی شرکت ==&lt;br /&gt;
فروشگاه کتاب الکترونیکی با نام تجاری Book-Zoom فعالیت خود را از تاریخ 1395/01/01 آغاز خواهد نمود.&lt;br /&gt;
آدرس فیزیکی فروشگاه: تهران- میدان انقلاب- ابتدای خیابان دکتر قریب&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
بنیان گذاران Book-Zoom &lt;br /&gt;
*دکتر علی زواره ای فرزند محسن ساکن تهران&lt;br /&gt;
*مهندس صادق آهنگریان فرزند سعید ساکن تهران&lt;br /&gt;
&amp;lt;br /&amp;gt;اهم فعالیت های شرکت عبارتند از&lt;br /&gt;
*فروش الکترونیکی انواع کتاب در دوقالب فیزیکی و دیجیتال&lt;br /&gt;
*توسعه نرم افزار کتاب خوان با قابلیت های منحصر به فرد&lt;br /&gt;
*ارایه خدمات کتابخانه ای به صورت الکترونیکی برای دسته بندی بهتر کتاب ها توسط مشتریان &lt;br /&gt;
=== چارت سازمانی ===&lt;br /&gt;
[[پرونده:Ebook-shop-chart.png|300px|قاب|وسط]]&lt;br /&gt;
&lt;br /&gt;
=== چشم انداز ===&lt;br /&gt;
* ورود به بازارهای جهانی فروش کتاب پس از 6 سال&lt;br /&gt;
* ایجاد شعب فروشگاه در 25 کشور جهان حداکثر تا 10 سال آینده&lt;br /&gt;
&lt;br /&gt;
=== ماموریت ===&lt;br /&gt;
ماموریت اصلی فروشگاه کتاب الکترونیک فروش انواع کتاب به صورت الکترونیکی و ارایه خدمات کتابخانه الکترونیک و کتابخوانی الکترونیکی می باشد.&lt;br /&gt;
&lt;br /&gt;
=== اهداف ===&lt;br /&gt;
* '''اهداف کسب و کار'''&lt;br /&gt;
رساندن موجودی کتاب الکترونیکی به 1000 نسخه و فیزیکی به 1000 جلد تا پایان سال دوم &amp;lt;br /&amp;gt;&lt;br /&gt;
کار در حوزه کتاب های تاریخی، تکنولوژی، علمی پس از سال اول &amp;lt;br /&amp;gt;&lt;br /&gt;
امکان فروش به صورت بین امللی و ارزی تا پایان سال دوم&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''اهداف مالي'''&lt;br /&gt;
بازگشت سرمایه طی سه سال اول &amp;lt;br /&amp;gt;&lt;br /&gt;
رساندن مبلغ فروش ماهیانه به پانصد میلیون ریال تا پایان شش ماه اول &amp;lt;br /&amp;gt;&lt;br /&gt;
شروع کسب درامد از طریق تبلیغات پس از شش ماه اول&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''اهداف پرسنلی '''&lt;br /&gt;
تشکیل تیم تحقیق و توسعه جهت ساخت ابزار و توسعه سایت تا حداکثر سه ماه آینده &amp;lt;br /&amp;gt;&lt;br /&gt;
تشکیل تیم پشتیبانی نرم افزار در سال اول &amp;lt;br /&amp;gt;&lt;br /&gt;
تامین تیم مشاورین تا یک ماه آینده&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''اهداف تحقيق و توسعه'''&lt;br /&gt;
ایجاد یک سیستم مستقل از بستر که به مشتریان اجازه خرید واستفاده از کتاب های مطلوبشان را در هر زمان و هر مکانی و برروی هر ابزار اعم از گوشی موبایل تبلت و یا کامپیوتر شخصی را می دهد.&amp;lt;br /&amp;gt;&lt;br /&gt;
ایجاد ابزار کتابخوان قابل خصوصی سازی توسط مشتری با امکانات کامل&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== معرفی محصولات و خدمات ==&lt;br /&gt;
محصولات این صنعت شامل موارد زیر است:&lt;br /&gt;
*کتاب های تجاری (شامل کتاب های فرهنگی، دانشگاهی و ...)&lt;br /&gt;
*کتاب های مذهبی&lt;br /&gt;
*کتاب های صوتی&lt;br /&gt;
*کتاب های متنی&lt;br /&gt;
*سایر کتاب ها&lt;br /&gt;
*مجلات و روزنامه&lt;br /&gt;
*سایر اقلام مرتبط با این صنعت &lt;br /&gt;
&lt;br /&gt;
خدمات و فعالیت ها شامل موارد زیر هستند:&lt;br /&gt;
*عرضه و فروش کتاب های جدید (شامل کتاب های الکترونیکی)&lt;br /&gt;
*فروش روزنامه، مجلات و سایر نشریات مقطعی (مثل ماهنامه ها و هفته نامه ها)&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===سایت های مشابه داخلی===&lt;br /&gt;
&amp;lt;big&amp;gt;فیدیبو (http://fidibo.com)&amp;lt;br /&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
به نظر می رسد یکی از کاملترین فروشگاه های کتاب الکترونیک داخلی است که مدعی ارایه امکانات زیر است:&lt;br /&gt;
* قالب کتابها pdf نبوده و قابلیت تطبیق پذیری با ابزار مورد استفاده را دارند که باید نرم افزار مربوطه از سایت دانلود و بر روی دستگاه نصب گردد.&lt;br /&gt;
* امکان فروش ریالی و ارزی&lt;br /&gt;
* واسط کاربری فروشگاه چندان دلچسب کاربر نبوده و می تواند از نقاط ضعف فروشگاه به حساب بیاید.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;فراکتاب (http://www.faraketab.ir)&amp;lt;/big&amp;gt;&lt;br /&gt;
* دارای نرم افزار کتابخوان با امکانات اولیه که تنها از سیستم عامل اندروید پشتیبانی می کند.&lt;br /&gt;
* واسط کاربری نه چندان قدرتمند&lt;br /&gt;
* ارایه کتاب های متنی و صوتی&lt;br /&gt;
* امکان فروش فقط به صورت ریالی&lt;br /&gt;
===سایت های مشابه خارجی===&lt;br /&gt;
&amp;lt;big&amp;gt;http://www.amazon.com&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* امکان جستجوی قوی&lt;br /&gt;
* واسط کاربری حرفه ای&lt;br /&gt;
* معرفی سایت های دیگر عرضه کننده کتاب&lt;br /&gt;
* نمایش خلاصه ای از کتاب&lt;br /&gt;
* ارایه پیشنهاد کتاب های مرتبط&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;https://books.google.com&amp;lt;/big&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
* امکان جستجوی قدرتمند از طریق موتور جستجوی google&lt;br /&gt;
* امکان مطالعه برخط کتاب در صورت داشتن مجوز یا خارج بودن از قانون کپی رایت&lt;br /&gt;
* امکان خرید یا امانت گرفتن کتاب&lt;br /&gt;
* ارجاع به سایت های دیگر جهت خرید&lt;br /&gt;
* ارایه پیشنهاد کتاب های مرتبط&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;http://www.barnesandnoble.com&amp;lt;br /&amp;gt;&lt;br /&gt;
* واسط کاربری حرفه ای&lt;br /&gt;
* امکان عضویت و ارایه مزایا به اعضا&lt;br /&gt;
* ارایه کتاب های صوتی و متنی&lt;br /&gt;
* امکان مذاکره برخط و چانه زنی&lt;br /&gt;
* فروش کتابخوان، فیلم و موسیقی&lt;br /&gt;
* ارایه پیشنهاد کتاب های مرتبط&lt;br /&gt;
&lt;br /&gt;
===ویژگی های متمایز کننده محصول===&lt;br /&gt;
&lt;br /&gt;
مهم ترین ویژگی های متمایز کننده محصول ما عبارتند از:&amp;lt;br /&amp;gt;&lt;br /&gt;
# ابزار کتابخوان قدرتمند مستقل از بستر که قابل اجرا بر روی تمامی ابزار ها و همچنین قابل خصوصی سازی توسط کاربر است.&amp;lt;br /&amp;gt;&lt;br /&gt;
# عرضه کتاب های الکترونیکی مبتني بر استانداردهاي جهاني صنعت نشر و با رعايت كامل قانون جهاني كپي رايت، طراحي و اجرا خواهد شد.&amp;lt;br /&amp;gt;&lt;br /&gt;
# طراحی حرفه ای سایت با امکانات سریع جستجو در شرایطی که اکثر سایت های فروش کتاب ایرانی از امکانات ضعیف طراحی بهره مند می شوند، می تواند فروشگاه ما را از دیگر فروشگاه های الکترونیکی کتاب متمایز نماید.&amp;lt;br /&amp;gt;&lt;br /&gt;
# قیمت کتاب های الکترونیکی به دلیل عدم نیاز به چاپ و کاغذ حدود 20 درصد ارزانتر از کتاب های کاغذی خواهد بود.&amp;lt;br /&amp;gt;&lt;br /&gt;
# وجود کتابخانه الکترونیکی قابل خصوصی سازی توسط مشتری برای سهولت در دسته بندی و چینش کتاب های مورد نظر.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== تحلیل صنعت مادر ==&lt;br /&gt;
در صنعت فروش کتاب، شرکت ها به فروش دامنه وسیعی از کتاب ها در حوزه های مختلف، مجلات، مقالات و کتاب های مقطعی می پردازند. این اقلام می توانند از ناشرین و عرضه کنندگان داخلی و حتی بین المللی خریداری شوند. عاملین فروش کتاب نهایتا این محصولات را از طریق فروشگاه های خود به صورت عمومی به فروش می رسانند. فروشگاه هایی که همه نوع اقلام تجاری را عرضه می کنند و همچنین مراکز پستی از این صنعت مستثنی هستند.&amp;lt;br /&amp;gt;&lt;br /&gt;
فروشگاه های کتاب از گذشته (که تنها روش سنتی امکانپذیر بود،) تاکنون (که روش های نوین فروش مثل روش الکترونیکی به وجود آمده است)، تفاوت های اساسی کرده اند، ولی تنها ماموریت آنها فروش کتاب بوده است. تعداد زیادی از فروشگاه های کتاب سنتی به دلیل بازار شدید رقابتی و کاهش مشتری از میدان به در رفته اند و برخی دیگر که معمولا فروشگاه های بزرگ زنجیره ای کتاب هستند، با ورود به بازارهای اینترنتی همچنان به فعالیت خود ادامه می دهند.&amp;lt;br /&amp;gt;&lt;br /&gt;
آمار (http://www.census.gov/prod/ec02/ec0244i04t.pdf) نشان می دهد که در آمریکا در سال 1997 تعداد فروشگاه کتاب فیزیکی در سه سطح کوچک خرده فروشی مستقل و زنجیره ای بزرگ از 12363 به 10800 در سال 2002 کاهش یافته است که در واقع 12.2 درصد کاهش داشته است. همچنین فروش کتاب فیزیکی نیز از 2007 تاکنون در امریکا 9.6 درصد کاهش داشته است.&lt;br /&gt;
&lt;br /&gt;
== تحلیل صنعت خود ==&lt;br /&gt;
صنعت فروش کتاب فیزیکی در مرحله کاهشی (رو به افول) از چرخه حیات خود می باشد که این موضوع با توجه به بازار محصول اشباع شده و کاهش نرخ رشد، کاملا مشهود است، ولی در نقطه مقابل آن صنعت فروش کتاب الکترونیکی است که تحقیقات بازار نشان می دهد که روز به روز در دنیا و در پی آن در ایران رو به رشد است.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
با استناد به سایت باشگاه خبرنگاران در پژوهش «نظرسنجی از بازدیدکنندگان نمایشگاه» سال 1392 در میان پاسخگویان 35.7 درصد کتاب‌های الکترونیک مطالعه کرده‌اند.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  0.5 درصد از افراد فاقد مطالعه کتب الکترونیک در یک هفته هستند. 6.4 درصد از پاسخگویان کمتر از یک ساعت، 7.9 درصد، یک تا دو ساعت؛ 20.9 درصد، دو ساعت و بیشتر در یک هفته مطالعه کتب الکترونیک داشته‌اند. در این پژوهش، میانگین مدت زمان مطالعه کتب الکترونیکی در یک هفته 233.61 دقیقه، است.&lt;br /&gt;
آمار فوق به علاوه آمار 70.7 درصدی طولانی بودن ساعات اشتغال و تحصیل و نداشتن وقت  نشان می دهد که بازار فروش کتاب الکترونیک به شرط آن که با کیفیت بالا انچام گیرد و بتواند مشتریان را راضی نگاه دارد می تواند آینده روشنی داشته باشد.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== تحلیل بازار ==&lt;br /&gt;
طبق آماری که شرکت [http://www.sbdcnet.org/small-business-research-reports/bookstore-2012 SBDCNet] که از شرکت های فعال در زمینه تحقیقات بازار می باشد؛ ارایه نموده، بازار اصلی هدف در فروش کتاب در امریکا عبارتند از:&lt;br /&gt;
*رده سنی 45 تا 64 سال&lt;br /&gt;
*افراد با درآمد بالا&lt;br /&gt;
*افراد متاهل بدون فرزند&lt;br /&gt;
*افراد متاهل با فرزندان محصل یا دانشجو&lt;br /&gt;
*افراد دانشگاهی&lt;br /&gt;
*افراد ساکن شهرهای بزرگ&lt;br /&gt;
افراد با مدارج دانشگاهی دو برابر سایر مشتریان برای کتاب هزینه می کنند و حدود 57 درصد بازار فروش کتاب را تشکیل می دهند. مشتریان رده سنی 45 تا 64 سال 28 تا 33 درصد بیشتر از سایر سطوح برای کتاب هزینه می کنند. بسیاری از افراد این رده سنی زمان خالی زیادی دارند که می توانند به مطالعه تخصیص دهند. زوج های بدون فرزند 24 درصد و زوج های دارای فرزند محصل حدود 34 تا 42 درصد بیشتر برای کتاب وقت صرف می کنند. جوان های رده 18 تا 24 سال و سالمندان رده سنی 65 به بالاتر، مبالغ  کمتری برای کتاب صرف می کنند.&lt;br /&gt;
[[پرونده:target-market.png|1000px|بندانگشتی|وسط]]&lt;br /&gt;
&lt;br /&gt;
در ایران طبق نتایج پژوهش «نظرسنجی از بازدیدکنندگان نمایشگاه» بیشترین مطالعه انواع کتاب در یکسال گذشته بدین ترتیب است:&lt;br /&gt;
*رمان و داستان (بزرگسالان) 14.79 درصد&lt;br /&gt;
*روانشناسی و تربیتی 11.17 درصد&lt;br /&gt;
*شعر 10.29 درصد&lt;br /&gt;
*تاریخ 9.22 درصد&lt;br /&gt;
*علوم ریاضی، طبیعی و عملی 7.76 درصد&lt;br /&gt;
*دینی 7.45 درصد&lt;br /&gt;
*زبان‌های خارجه 7.29 درصد&lt;br /&gt;
*قرآن و ادعیه 6.33 درصد&lt;br /&gt;
*اجتماعی 5.72 درصد&lt;br /&gt;
*فرهنگ، هنر و معماری 4.76 درصد&lt;br /&gt;
*فلسفی 4.26 درصد&lt;br /&gt;
*سیاسی 3.53 درصد&lt;br /&gt;
*کودک و نوجوان 3.34 درصد&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
طبق نتایج 8.9 درصد پاسخگویان عنوان کرده‌اند اصلاً کتاب‌های غیردرسی مطالعه نمی‌کنند، بیش از نیمی از پاسخگویان (57.4 درصد) اظهار کرده‌اند به میزان  کم و خیلی کم به مطالعه کتب غیردرسی می‌پردازند و 33.8 درصد هم مطالعه کتب غیردرسی خود را به میزان زیاد و خیلی زیاد مطرح کرده‌اند.&amp;lt;br /&amp;gt;&lt;br /&gt;
مطابق آمار فوق دانشجویان و دانش آموزان در صدر بازار هدف قرار می گیرند. کتب درسی و دانشگاهی و همجنین رمان و داستان نیز جز محصولات پرفروش خواهند بود.&lt;br /&gt;
&lt;br /&gt;
== تحلیل رقابتی ==&lt;br /&gt;
&lt;br /&gt;
[[پرونده:BookShopSwat.png|300px|قاب|وسط]]&lt;br /&gt;
&lt;br /&gt;
== تدوین استراتژی ==&lt;br /&gt;
*'''استراتژی های بازاریابی'''&lt;br /&gt;
**جذب نیروی های بازاریاب با تجربه برای جذب مشتری و آگهی های تبلیغاتی&lt;br /&gt;
**برگزاری دوره های تخصصی بازاریابی متناسب با هر بخش از بازار هدف&lt;br /&gt;
*'''استراتژی های تبلیغاتی'''&lt;br /&gt;
**تبلیغات اینترنتی در دیگر سایت های مرتبط با کتاب &lt;br /&gt;
**انعقاد قرارداد با شرکت های خبره تبلیغاتی جهت ارایه راهکارهای مناسب.&lt;br /&gt;
*'''استراتژی های قیمت گذاری'''&lt;br /&gt;
**امکانات عمومی استفاده از نرم افزار کتابخوان و همچنین کتابخانه هوشمند رایگان بوده ولی استفاده از برخی امکانات تخصصی مشمول هزینه خواهد بود.&lt;br /&gt;
**شیوه اصلی کسب درآمد در این سامانه از طریق فروش کتاب و محصولات خواهد بود.&lt;br /&gt;
*'''استراتژي هاي جذب و نگهداري مشتري'''&lt;br /&gt;
**ارايه خدمات ويژه و افزایش درصد تخفیف به ازای هر بار خرید&lt;br /&gt;
**برگزاري قرعه كشي و اهداي جوايز به مشتريان&lt;br /&gt;
** برگزاری مسابفات کتاب خوانی &lt;br /&gt;
**برگزاري نظرسنجي الكترونيكي به صورت مستمر براي بهبود سامانه مطابق با نظر كاربران&lt;br /&gt;
**مدل سازی کاربران برای ارایه سرویس بهتر&lt;br /&gt;
*'''استراتژي هاي امنيتي'''&lt;br /&gt;
**استفاده از آخرين تكنولوژي هاي روز امنيت اطلاعات شبكه و وب&lt;br /&gt;
**حفظ محرمانگي اطلاعات اختصاصي كاربران&lt;br /&gt;
**ثبت سوابق فعالیت های اعضا&lt;br /&gt;
&lt;br /&gt;
== مراحل توسعه محصولات ==&lt;br /&gt;
*انعقاد قرارداد با ناشرین برتر جهت تعاملات بیشتر در سال دوم&lt;br /&gt;
*عرضه موسیقی و فیلم در سال دوم&lt;br /&gt;
*تکمیل امکانات واسط کاربری حداکثر تا انتهای سال دوم&lt;br /&gt;
*ارایه امکان فروش ارزی در سال سوم&lt;br /&gt;
*افزودن سرورهای استانی در پنج استان بزرگ کشور جهت ارتقا سرعت ارایه خدمات در سال چهارم&lt;br /&gt;
*توسعه کتاب های تخصصی لاتین برای ورود به بازارهای جهانی از ابتدای سال چهارم&lt;br /&gt;
&lt;br /&gt;
== تحلیل مالی ==&lt;br /&gt;
&lt;br /&gt;
== تحلیل ریسک ==&lt;br /&gt;
&lt;br /&gt;
== طرح فنی ==&lt;br /&gt;
سامانه فروشگاه کتاب الکترونیکی یک سامانه تحت وب مستقل از بستر بوده که کاربران می توانند با هر ابزار اعم از موبایل، تبلت و کامپیوتر دسک تاپ تنها از طریق یک مرورگر اقدام به استفاده از سامانه نمایند. عملیات پیاده سازی این سامانه در بخش تحقیق و توسعه شرکت انجام خواهد شد.&lt;br /&gt;
&lt;br /&gt;
ویژگیهای فنی سامانه به شرح زیر است:&lt;br /&gt;
&lt;br /&gt;
[[پرونده:Technical-tools.png|300px|قاب|وسط]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
کاربران سامانه شامل دسته های زیر می باشند:&lt;br /&gt;
* خریداران&lt;br /&gt;
* اعضا&lt;br /&gt;
* ناشرین&lt;br /&gt;
مدل 7 لایه ای معماری سیستم تجارت الکترونیک نیز به صورت زیر خواهد بود:&lt;br /&gt;
[[پرونده:Seven-layers-model.png|300px|قاب|وسط]]&lt;/div&gt;</summary>
		<author><name>94131572</name></author>
	</entry>
</feed>