از سال 2004 که گوگل MapReduce رو به عنوان یک پلتفرم پردازش موازی معرفی کرد, افراد و کمپانی ها در تلاش بودند ابزار هایی برای مدیریت job ها و task های MapReduce پیاده سازی کنن, که Yarn و JobTracker و TaskTracker محبوبش از جمله این ابزار ها بودن, یکی از مشکلاتی که اجرای تسک ها باهاش مواجه میشن straggler یا علاف شدن تسک هست به این صورت که ممکنه یک تسک بیش از حد یا برای همیشه طول بکشه و اتمام اجرای job رو با مشکل مواجه کنه, اینجاست که از روشی به نام Speculative Execution برای حل مشکل استفاده میکنیم;
هدوپ درک و دیدی از کدی که داخل تسک ها در حال اجراست نداره, فقط کد جاوا رو در کانتینر های جاوا اجرا میکنه و ورودی و خروجی اونها رو تعیین و هدایت میکنه, بنابراین تنها ابزاری که برای تشخیص تسک های straggler داره مدت اجرا و مقدار پیشرفت اجرای تسکه (بر اساس تعداد خروجی هایی که تحویل داده)
میتونه عوامل داخلی داشته باشه از جمله:
و عوامل خارجی از جمله:
هدوپ به صورت پیش فرض روش خیلی ساده ای رو در پیش میگیره, اگه یه تسک زیر ۲۰ درصد پیشرفت کرده باشه و بیشتر از ۱ دقیقه طول کشیده باشه به عنوان تسک straggler شناسایی میشه. اما هرچیزی رو در جاوا میشه از نو نوشت و مقاله های زیادی در مورد شناسایی هوشمند تسک های کند نوشته شده.
هدوپ وقتی تسک کند یا گیر کرده رو پیدا کرد, سریع یه نسخه دیگه از همون تسک رو یجای دیگه اجرا میکنه بعد نگاه میکنه کدومش زودتر تموم میشه, اونی که زودتر تموم کرد خروجیش رو ذخیره میکنه و تسک های replica رو kill میکنه.
در کل اگه Speculative Execution با سیاست درستی به کار گرفته بشه موجب میشه سرعت کلی اجرای job ها افزایش پیدا کنه و کلی ماشین بیکار معطل یه تسک که به دلایل مختلف گیر کرده نمیشن حتی اگه به قیمت اجرای موازی یکی دوتا تسک باشه.
--- به روز رسانی 17 دی 99:
دیدیم که Speculative Execution همیشه هم محبوب قلب ها نیست, و ممکنه مشکلات غیر قابل پیش بینی ایجاد کنه, برای همین خیلی وقتا تیم تصمیم میگیره این قابلیت رو برای reducer, mapper یا هردو غیر فعال کنه و اگر کسی این قابلیت رو نیاز داره در کانفیگ تسک جداگانه خودش این قابلیت رو فعال کنه.
برای غیر فعال کردن Speculative Execution در تسک های map از کانفیگ:
استفاده میکنیم که مقدارش به صورت پیش فرض true هست
برای reduce هم از کانفیگ
برای فعال یا غیر فعال کردن این ویژگی در کل job:
این کانفیگ در فایل mapred-site.xml و یا کانفیگ های خود Job صورت میگیره.
در کل اگر کلاستر یکنواختی دارید و جاب ها با روال مشخصی روی کلاستر اجرا میشن شاید این قابلیت جلوی خیلی از تاخیر ها رو بگیره اما اگر فکر میکنید دردسر های این ویژگی بیشتر از مزایاش برای شما هزینه ایجاد میکنه میتونید به راحتی غیر فعالش کنید, یا اینکه وقت بزارید و الگوریتم های پیچیده تر و هوشمند تری برای شناسایی تسک های straggler بنویسید.
نکته: اصطلاح خلاصه شده spec-exec در ادبیات هدوپ خیلی رایج نیست و صرفا از سر تنبلی نویسنده استفاده شده, ولی در ادبیات طراحی پردازنده برای مفهومی تقریبا با همین ویژگی ها ازش استفاده میشه.
منابع:
https://data-flair.training/blogs/speculative-execution-in-hadoop-mapreduce/
https://techvidvan.com/tutorials/speculative-execution-in-hadoop/
http://zhenxiao.com/papers/TC-2012-07-0457.R1_Chen.pdf
https://hadoop.apache.org/docs/r1.2.1/api/org/apache/hadoop/mapreduce/Job.html#setGroupingComparatorClass(java.lang.Class)