MapReduce یک مدل ساده از پردازش داده‌ها را دارد: ورودی‌ها و خروجی‌ها برایmap  و توابع reduce   جفت‌های کلید ارزش هستند. این فصل به تفصیل به مدل MapReduce  می‌پردازد و به ویژه به اینکه چگونه داده‌ها در فرمت‌های مختلف از متن ساده تا اشیاء باینری ساختارمند می‌توانند با این مدل استفاده شوند.

  • انواع MapReduce

map  و توابع reduce   در Hadoop MapReduce فرم زیر را دارا می باشند:

map: (K1، V1) → فهرست (K2، V2)

reduce: (K2, list(V2)) → list (K3, V3)

  • کار پیش فرض MapReduce

هنگام اجرای MapReduce بدون ایجاد یک Mapper یا Reducer چه اتفاقی می افتد؟

public class MinimalMapReduce extends Configured implements Tool {

@Override

public int run(String[] args) throws Exception {

if (args.length != 2) {

System.err.printf("Usage: %s [generic options] <input> <output>\n",

getClass().getSimpleName());

ToolRunner.printGenericCommandUsage(System.err);

return -1;

}

Job job = new Job(getConf());

job.setJarByClass(getClass());

FileInputFormat.addInputPath(job, new Path(args[0]));

FileOutputFormat.setOutputPath(job, new Path(args[1]));

return job.waitForCompletion(true) ? 0 : 1;

}

public static void main(String[] args) throws Exception {

int exitCode = ToolRunner.run(new MinimalMapReduce(), args);

System.exit(exitCode);

}

}

  • کار پیش فرض جریان

در جریان، کار پیش فرض شبیه به معادل جاوا است اما یکسان نیست. فرم پایه بدين شكل است:

% hadoop jar $HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-*.jar \-input input/ncdc/sample.txt \

-output output \

-mapper /bin/cat

  • کلیدها و ارزش ها در جریان

یک برنامه جریان می‌تواند جداکننده‌ای را که هنگام جفت شدن کلید-ارزش استفاده می‌شود را کنترل کند، به یک سری از بایت‌ها تبدیل کند و به map  ارسال می‌شود یا فرآیند را بیش از ورودی استاندارد کاهش می‌دهد.

  • فرمت های ورودی

Hadoop می‌تواند انواع مختلفی از فرمت‌های داده را پردازش کند، از فایل‌های متن یکدست به پایگاه داده‌ها. در این بخش، فرمت‌های مختلف موجود بررسی می‌شود.

 

  • ورودی تقسیم و رکوردها

یک تقسیم ورودی یک بخش از ورودی است که توسط یک map پردازش شده است. هر map  یک تقسیم واحد را پردازش می‌کند. هر تقسیم به سوابق تقسیم می٬شود و map   هر رکورد را پردازش می‌کند که به نوبه خود - یک جفت کلید-ارزش است.

  • فرمت ورودی فایل (FileInputFormat)

FileInputFormat کلاس پایه‌ای برای تمام پیاده‌سازی‌های InputFormat است که از فایل‌ها به عنوان منبع داده استفاده می‌کنند.

  • مسیر ورودی FileInputFormat

ورودی به یک کار به عنوان مجموعه‌ای از مسیرها مشخص شده است که انعطاف‌پذیری زیادی در محدود کردن ورودی عرضه می‌کند. FileInputFormat چهار روش تسهیلات استاتیک برای تنظیم مسیر ورودی کار (Job) را ارائه می‌دهد:

public static void addInputPath(Job job, Path path)

public static void addInputPaths(Job job, String commaSeparatedPaths)

public static void setInputPaths(Job job, Path... inputPaths)

public static void setInputPaths(Job job, String commaSeparatedPaths)

  • تقسیم های (splits) ورودی FileInputFormat

با توجه به مجموعه‌ای از فایل‌ها، FileInputFormat چگونه آنها را به splits تبدیل می‌کند؟ FileInputFormat تنها فایل‌های بزرگ را تقسیم می‌کند، در اینجا "بزرگ" به معنای بزرگتر از یک بلوک HDFS است. اندازه تقسیم معمولا اندازه یک بلوک HDFS است که برای اکثر برنامه‌های کاربردی مناسب است.

  • فایل‌های کوچک و CombineFileInputFormat

Hadoop با تعداد کمی از فایل‌های بزرگ بهتر از تعداد زیادی فایل کوچک کار می‌کند. یکی از دلایل این امر این است که FileInputFormat تقسیم‌های (splits) تولید می‌کند به طوری که هر split تمام یا بخشی از یک فایل واحد است.

  • جلوگیری از تقسیم

بعضی از برنامه‌ها نمی‌خواهند فایل‌ها تقسیم شوند، زیرا این اجازه می‌دهد تا یک Mapper هر فایل ورودی را در داخل خود به طور کامل پردازش کند.

  • اطلاعات فایل در mapper

پردازش mapper  یک تقسیم فایل ورودی می‌تواند اطلاعات را در مورد تقسیم شدن با فراخوانی روش getInputSplit ()  در Mapper’s Context object  پیدا کند.

  • پردازش یک فایل کامل به عنوان یک رکورد

نیازمندی مربوط به آن که گاهی اوقات درک می‌شود ، برای mappers  برای دسترسی به محتوای کامل یک پرونده است. تقسیم نکردن فایل بخشی از راه را می‌دهد، اما شما همچنین باید یک RecordReader داشته باشید که محتویات فایل را به عنوان مقدار رکورد ارائه می‌کند.

  • ورودی متن

Hadoop در پردازش متن بدون ساختار پیشی گرفته است. در این بخش، در مورد InputFormats های مختلف که Hadoop برای پردازش متن فراهم می‌کند، صحبت می‌شود.

 

  • TextInputFormat

TextInputFormat به طور پیش‌فرض InputFormat است. هر رکورد یک خط ورودی است. کلید، LongWritable، علامت جابجایی بایتی در فایل آغاز خط است. value  محتویات خط، به استثنای هر پایان رساننده خط است.

  • KeyValueTextInputFormat

کلیدهای TextInputFormat، که به سادگی offsets در فایل می‌شوند، به طور معمول بسیار مفید نیست. متداول است که برای هر خط در یک فایل، یک جفت کلید- ارزش باشد که توسط یک حائل مانند یک کارکتر تب جدا شده است.

  • NLineInputFormat

با TextInputFormat و KeyValueTextInputFormat، هر Mapper یک تعداد متغیر خطوط ورودی را دریافت می‌کند. این تعداد به اندازه تقسیم و طول خط ها بستگی دارد.

  • XML

اکثر تجزیه‌کننده های XML بر روی کل اسناد XML عمل می‌کنند، بنابراین اگر یک سند XML بزرگ از تقسیم ورودی‌های چندگانه تشکیل شده باشد، این چالش است که آنها را به صورت جداگانه تجزیه کنید.

  • ورودی باینری (Binary Input)

Hadoop MapReduce به پردازش داده‌های متنی محدود نمی‌شود. بلکه از فرمت‌های دودویی (باینری) نیز پشتیبانی می‌کند.

  • SequenceFileInputFormat

فرمت فایل دنباله‌ای Hadoop توالی‌هایی از جفت‌های کلید- ارزش را ذخیره می‌کند.

  • SequenceFileAsTextInputFormat

SequenceFileAsTextInputFormat یک نوع از SequenceFileInputFormat است که کلیدها و ارزش‌های فایل دنباله را به objects Text تبدیل می‌کند. تبدیل با فراخوانی با toString ()  بر روی کلید- ارزش انجام می‌شود. این فرمت باعث می‌شود فایل های توالی مناسب برای جریان باشد.

  • SequenceFileAsBinaryInputFormat

SequenceFileAsBinaryInputFormat نوع دیگری از SequenceFileInputFormat است که کلید- ارزش فایل دنباله را به عنوان اشیاء باینری مبهم بازیابی می‌کند.

  • FixedLengthInputFormat

FixedLengthInputFormat برای خواندن رکوردهای باینری پهنای ثابت از یک فایل است، زمانی که رکوردها توسط جدا کننده ها جدا نمی‌شوند. اندازه رکورد باید از طریق lengthinputformat.record.length ثابت تنظیم شود.

  • ورودی های چندگانه

اگر چه ورودی به یک کار MapReduce ممکن است شامل چندین فایل ورودی (ساخته شده توسط ترکیبی از تکه های کوچک فایل، فیلتر، و مسیرهای ساده) باشد، تمام ورودی توسط یک InputFormat و یک Mapper واحد تفسیر می‌شود.

  • ورودی بانک اطلاعاتی (و خروجی) (Database Input (and Output))

DBInputFormat یک فرمت ورودی برای خواندن داده‌ها از یک پایگاه داده‌ی Relational، با استفاده از JDBC است.

  • فرمت های خروجی

Hadoop دارای فرمت‌های داده خروجی است که مشابه فرمت‌های ورودی پوشش داده شده در بخش قبلی است.

  • خروجی متن

فرمت خروجی پیش فرض، TextOutputFormat، رکوردها را مانند خطوط از متن می‌نویسد.

  • خروجی دودویی (Binary Output)
  • SequenceFileOutputFormat

همانطور که نام نشان می‌دهد، SequenceFileOutputFormat فایل‌های توالی را برای خروجی آن می‌نویسد.

  • SequenceFileAsBinaryOutputFormat

SequenceFileAsBinaryOutputFormat- (نقطه مقابل SequenceFileAsBinaryIn putFormat) کلید – ارزشها را در فرمت دودویی خام به یک حامل فایل دنباله می‌نویسد.

  • MapFileOutputFormat

MapFileOutputFormat فایل‌هایmap  را به عنوان خروجی می‌نویسد. کلیدها در MapFile باید به ترتیب اضافه شوند، بنابراین شما باید اطمینان حاصل کنید که کاهنده‌های شما کلید‌های مرتب شده را منتشر می‌کنند.

  • خروجی های چندگانه

FileOutputFormat و Subclasses آن مجموعه‌ای از فایل‌ها را در دایرکتوری خروجی تولید می‌کند.

  • MultipleOutputs

MultipleOutputs به شما اجازه می‌دهد تا داده‌ها را در فایل‌هایی که اسامی آنها از کلید – ارزش‌های خروجی و یا در واقع از یک رشته اختیاری مشتق شده است، بنویسید.

  • خروجی کُند (Lazy Output)

Subclasses FileOutputFormat فایل‌های خروجی (part-r-nnnnn) را ایجاد می‌کنند، حتی اگر آنها خالی باشند. بعضی از برنامه‌ها ترجیح می‌دهند که فایل‌های خالی ایجاد نشوند، که در آن Lazy OutputFormat کمک می‌کند.

  • خروجی پایگاه داده

فرمت‌های خروجی برای نوشتن به پایگاه داده‌های رابطه‌ای و HBase در "ورودی (و خروجی پایگاه داده)" ذکر شده است.