بررسی ابزارهای MapReduce در BigData

از OCCC Wiki
پرش به ناوبری پرش به جستجو

چکیده

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

Mapreduce.png

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

مقدمه

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

Mapreduce-Model.png

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

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

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

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

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

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

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

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

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

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

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

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

  • Distributed File System (HDFS)

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

  • Hadoop YARN

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

  • Apache Pig

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

  • Hive

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

  • HBase

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

Hadoop-Structure.png

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

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

Hadoop-vs-Spark.png


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

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

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

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

اساس Spark مجموعه داده های توزیع شده واکنشی یا RDD ها هستندکه در واقع مجموعه هایی از اشیا بخش بندی شده مقاوم در برابر خرابی هستند که بر روی گره های کلاستر شده توزیع شده اند و می توانند به صورت موازی کار کنند. به Rdd های ایجاد شده توسط کاربر تبدیل یا transformation اطلاق می شود که درحقیقت هر تبدیل، عملیاتی نظیر نگاشت، غربال و یا گروه بندی داده در سیستم ذخیره سازی پایدار نظیر سیستم فایل توزیع شده Hadoop یا HDFS می باشد. [5]
به عنوان مثال قطعه کد زیر یک RDD ایجاد می کند که پیغام های خطا را از طریق جستجوی خطوطی که با عبارت ERROR آغاز می شوند از یک فایل log استخراج کرده و بر روی کنسول نمایش می دهد.

val lines = spark.textFile(“hdfs://...”) 
val errors = lines.filter(line => line.startsWith(“ERROR”)) 
println(“Total errors: “ + errors.count())


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

Hadoop-vs-Spark-Iteration.png


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

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

// Count the errors mentioning MySQL
errors.filter(line => line.contains(“MySQL”)).count() 
// Fetch the MySQL errors as an array of strings 
errors.filter(line => line.contains(“MySQL”)).collect() 
// Fetch the time fields of errors mentioning PHP as an array 
// (assuming time is field number 3 in a tab-separated format): 
errors.filter(line => line.contains(“PHP”)) 
.map(line => line.split(‘\t’)(3)) .collect()

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

Spark-Fault-Tolerance.png


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

نتیجه گیری

در جدول زیر مقایسه ای از ویژگی های Hadoop و Spark را مشاهده می کنید:

Hadoop-vs-Spark-Table.png


مراجع

1. Daniel Peralta, Sara del Río, Sergio Ramírez-Gallego, Isaac Triguero, Jose M. Benitez, and Francisco Herrera/Evolutionary Feature Selection for Big Data Classification: A MapReduce Approach/2015/ لینک به مقاله

2. Anand Loganathan, Ankur Sinha, Muthuramakrishnan V., and Srikanth Natarajan/A Systematic Approach to Big Data Exploration of the Hadoop Framework/2014/لینک به مقاله

3.Xing Wu, Yan Liu, Ian Gorton / Exploring Performance Models of Hadoop Applications on Cloud Architecture/2015/لینک به مقاله

4.Xiaoyi Lu ; Dept. of Comput. Sci. & Eng., Ohio State Univ., Columbus, OH, USA ; Rahman, M.W.U. ; Islam, N. ; Shankar, D / Accelerating Spark with RDMA for Big Data Processing: Early Experiences /2014/لینک به مقاله

5.MATEI ZAHARIA, MOSHARAF CHOWDHURY, TATHAGATA DAS, ANKUR DAVE, JUSTIN MA, MURPHY MCCAULEY, MICHAEL J. FRANKLIN, SCOTT SHENKER, AND ION STOICA / Fast and Interactive Analytics over Hadoop Data with Spark /2012/لینک به مقاله

6.Dilpreet Singh and Chandan K Reddy / A survey on platforms for big data analytics /2014/لینک به مقاله