<

عصر هدوپ

آشنایی با Big Data و کار با Hadoop

عصر هدوپ

آشنایی با Big Data و کار با Hadoop

عصر هدوپ
بایگانی

مطلب ۶ (قسمت سوم) : MapReduce

دوشنبه, ۱۰ آذر ۱۳۹۳، ۱۰:۵۰ ق.ظ

Java MapReduce

 بعد از آشنایی با چگونگی عملکرد MapReduce، نوبت به پیاده سازی مثال قسمت قبل (یافتن بیشترین درجه آب و هوا به ازای هر سال) در زبان برنامه نویسی Java رسیده است. ما به سه چیز نیاز داریم: تابع map، تابع reduce، تابع main. 


تابع map:



کلاس Mapper از نوع جنریک تعریف شده است، چهار پارامتر که به ترتیب input key (عددی)، input value (رشته)، output key (رشته)و output value (عددی) می باشند، ورودی و خروجی های تابع map را مشخص می نمایند. در مثال حاضر، با توجه به اینکه ورودی ما تعدادی فایل لاگ (به ازای هر سال یک فایل لاگ) با طراحی سطر به سطر است که هر سطر بیانگر یک گزارش آب و هوا توسط یک ایستگاه هواشناسی می باشد، مقدار input key برابر است با شماره سطر، مقدار input value برابر است با محتوای سطر، مقدار output key برابر است با  فیلد سال استخراج شده از input value و output value برابر است با مقدار  فیلد درجه آب و هوای استخراج شده از input value.
در هر بار فراخوانی تابع map، یک key و value به آن فرستاده می شود. ابتدا مقدارvalue در یک متغیر رشته ای (String) با نام line قرار می گیرد و سپس با استفاده از متد ()substring کلاس String دو فیلد سال و درجه از آن استخراج می شود.
در کد بالا objectی از کلاس Context مشاهده می شود که به منظور نوشتن output مورد استفاده قرار می گیرد.

تابع reduce:

در این قسمت مجددا چهار پارامتر برای مشخص شدن نوع های ورودی و خروجی استفاده شده است، نوع ورودی های این تابع می بایست با نوع خروجی های تابع map یکسان باشد. از آنجایی که قرار است به ازای هر سال بیشترین درجه آب و هوا مشخص شود، لذا نوع های خروجی عبارتند از output key (رشته) که بیانگر مقدار سال و output value (عددی) که بیانگر بیشترین درجه آب و هوا می باشد. به ازای هر بار فراخوانی، یک key (سال بدست آمده در تابع map) و همچنین یک value (لیست درجه های بدست آمده برای همان سال در تابع map) به عنوان ورودی به این تابع ارسال می شود. این تابع می بایست ابتدا بزرگترین درجه آب و هوا را برای هر سال پیدا نماید و بعد آن را با استفاده از objectی از کلاس Context به عنوان خروجی برگرداند.

تابع main:

یک شی از کلاس Job بیانگر یک کار در MapReduce می باشد. برای اینکه بتوان نحوه اجرای یک کار را کنترل نمود، می بایست از این کلاس استفاده شود. زمانیکه می خواهیم یک کار بروی کلاستری از ماشین ها به اجرا درآید، ابتدا کدهای نوشته شده را از طریق JAR فایل بسته بندی می نماییم. البته بجای استفاده صریح از نام JAR فایل، می توان یک کلاس را به متد ()setJarByClass از کلاس Job ارسال نمود، که در این حالت هدوپ JAR فایل متناسب با آن کلاس را تشخیص خواهد داد.
بعد از ساختن یک شی از کلاس Job،می بایست مسیرهای ورودی و خروجی مشخص شوند. با استفاده از متد ()addInputPath از کلاس FileInputFormat می توان مسیر(های) ورودی را تعیین نمود. وهمچنین با استفاده از ()setOutputPath از کلاس FileInputFormat می توان مسیر خروجی را بیان کرد. نکته مهم این که مسیر خروجی هنگام اجرا نمی بایست وجود داشته باشد که در این صورت هدوپ به منظور جلوگیری از Data Loss از ادامه کار خودداری می نماید.
در گام بعد می بایست Mapper وReducer کار را با استفاده از متدهای ()setMapperClass و()setReducerClass مشخص نماییم. متدهای ()setOutputKeyClass و ()setOutputValueClass به منظور تعیین نوع های خروجی تابع map و reducer استفاده می شود. در شرایطی که نوع های خروجی دو تابع map و reduce با هم متفاوت باشند، می توان از متدهای اختصاصی خودشان استفاده نمود. برای مثال ()setMapOutputKeyClass و یا ()setMapOutputValueClass.
نوع های ورودی از طریق فرمت ورودی کنترل می شوند، که در اینجا باتوجه به اینکه ما بطور صریح فرمت ورودی را تعیین نکرده ایم، بصورت پیش فرض TextInputFormat استفاده خواهد شد.
بعد از انجام تنظیمات مربوط به فاز Map و Reduce، می توانیم Job را با فراخوانی متد ()waitForCompletion آغاز نماییم.

Hadoop: The Definitive Guide by Tom White

استفاده از این مطلب با ذکر منبع بلامانع می باشد.
موافقین ۰ مخالفین ۰ ۹۳/۰۹/۱۰
مهدی شهیدی صادقی

Java

hadoop

هادوپ

هدوپ

نظرات  (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی