مطلب ۶ (قسمت اول) : MapReduce
MapReduce یک مدل برنامه نویسی پردازش داده می باشد. هدوپ می تواند برنامه هایی که با این مدل در زبانهای برنامه نویسی گوناگون نظیر Java، Ruby، Python و ++C ایجاد شده است را اجرا نماید. اما نکته مهم این است که برنامه های نوشته شده تحت MapReduce ذاتا بصورت موازی طراحی و پیاده سازی می شوند، یعنی برای تحلیل یک حجم زیاد داده می بایست آن را بین چندین ماشین تقسیم نمود.
یک مجموعه داده هواشناسی
برای مثال، می خواهیم برنامه ای بنویسیم که روی یک مجموعه داده هواشناسی پردازش انجام دهد. سیستم های هوشمند هواشناسی همواره مشغول به جمع آوری لحظه ای اطلاعات از سرتاسر دنیا هستند که این عمل باعث ایجاد حجم زیادی داده یا به اصطلاح تعداد زیادی فایل لاگ می شود، و از آنجایی که نوع داده آنها نیمه ساختار یافته و طراحی آن بصورت رکورد به کورد می باشد، برنامه های نوشته شده توسط MapReduce به خوبی از آنها استفاده می کنند. نمونه ساده شده از یک رکورد از این نوع داده در ادامه آورده شده است که برای خوانایی بیشتر، هر فیلد جدا گانه توضیح داده می شود.
Example 2-1. Format of a National Climate Data Center record
005733213099999195001010300 4+51317+028783FM-12+017199999V0203201 # A line of the log file which represents a record.
0057
332130 # USAF weather station identifier
99999 # WBAN weather station identifier
19500101 # observation date
0300 # observation time
4
+51317 # latitude (degrees x 1000)
+028783 # longitude (degrees x 1000)
FM-12
+0171 # elevation (meters)
99999
V020
320 # wind direction (degrees)
1 # quality code
لاگ ها براساس تاریخ و ایستگاه هواشناسی سازماندهی می شوند. به عبارت بهتر، به ازای هر سال پوشه ای وجود دارد که فایل های لاگ تولید شده توسط هر ایستگاه در آن قرار می گیرد. برای مثال، دراینجا قسمتی از فایل های موجود در سال 1990 آورده شده است:
% ls raw/1990 | head
010010-99999-1990.gz
010014-99999-1990.gz
010015-99999-1990.gz
010016-99999-1990.gz
010017-99999-1990.gz
010030-99999-1990.gz
با توجه به تعداد زیاد ایستگاه های هواشناسی، داده جمع آوری شده از تعداد زیادی فایل کم حجم تشکیل می شود. به صورت کلی پردازش تعداد کمی فایل حجیم به مراتب راحتر و سریع تر خواهد بود، بنابراین ابتدا تمام فایل های لاگ مربوط به هر پوشه را با هم ادغام کرده تا به ازای هر سال یک فایل داشته باشیم.
به منظور بالا بردن سرعت پردازش، می بایست قسمت های مختلف کار بصورت موازی به اجرا در آیند. در تئوری، این عمل راحت به نظر می رسد: می توان به ازای داده هر سال یک پردازش جدا گانه اجرا نمود، می توان از تمام Thread های سخت افزاری موجود در یک ماشین استفاده کرد. البته برای انجام این کار موانعی پیش روی خواهیم داشت:
اول، تقسیم کار به اندازه های مساوی برای انجام پردازش های موازی همیشه کار آسان و واضحی نیست. در این مثال، به ازای هر سال داده ای جدا گانه وجود دارد، البته ممکن است حجم داده به ازای هر سال متفاوت باشد که در این حالت پردازش برخی از آنها زودتر از باقی به اتمام می رسد. حتی اگر آنهایی که پردازش خود را به اتمام رسانده، شروع به انجام پردازش های بیشتر نمایند، باز کل اجرا تحت کنترل بیشترین حجم داده خواهد بود. روش بهتر آن است که ابتدا ورودی به قطعه های معینی تقسیم شود(Input Splits) و هر یک از آن قطعه ها به یک پردازش اختصاص یابد.
دوم، ممکن است ادغام نتایج بدست آمده از پردازش های مختلف نیازمند پردازش جداگانه ای باشد. در این مثال، از آنجایی که نتیجه هر سال با سال دیگر متفاوت است ممکن است بتوان آنها را باهم ادغام کرده و براساس سال مرتب نمود. اگر از روش پیشنهادی قسمت اول (تقسیم ورودی به قطعه های معین) استفاده شود، فرآیند ادغام کمی متفاوت خواهد شد. فرض کنید می خواهیم بیشترین درجه آب و هوا را برای یک سال خاص بدست آوریم، ابتدا داده آن به عنوان ورودی به چندین قطعه معین تقسیم می شود سپس هر یک از قطعه ها بصورت کاملا مستقل مورد پردازش قرار می گیرد. بنابراین به ازای هر قطعه یک نتیجه (بیشترین درجه آب و هوا) وجود خواهد داشت که برای بدست آمدن نتیجه نهایی می بایست پردازش جداگانه ای بروی آن نتایج انجام شود.
سوم، همواره محدودیت ظرفیت پردازش یک ماشین مطرح می باشد و از آن طرف حجم داده فراتر از ظرفیت یک ماشین در حال رشد است. در اینجا به ذهن می رسد که از چندین ماشین به منظور انجام یک پردازش استفاده شود که این خود مسئله مدیریت و هماهنگی بین آنها را بدنبال خواهد داشت. برای مثال، چه کسی مسئول بدست آوردن نتیجه نهایی از نتایج بدست آمده می باشد؟، با پردازش های ناموفق چگونه رفتار شود؟، چگونه بین پردازش ها هماهنگی صورت پذیرد؟.
بنابراین، امکان انجام پردازش های موازی وجود دارد اما در عمل بسیار پیچیده خواهد بود. استفاده از موجودیتی نظیر هدوپ این مسئله را بخوبی برای ما انجام خواهد داد.
Hadoop: The Definitive Guide by Tom White