سلام! به عنوان یک تامین کننده Combiner، اخیراً سؤالات زیادی در مورد اینکه چه چیزی برای اینکه یک Combiner در یک کار MapReduce ایمن باشد، دریافت کرده ام. بنابراین، فکر کردم که آن را در این پست وبلاگ برای شما شرح دهم.
ابتدا اجازه دهید به سرعت خلاصه کنیم که Combiner در زمینه یک کار MapReduce چیست. Combiner یک تابع اختیاری است که میتواند برای انجام تجمیع محلی در خروجی نقشهبرداران قبل از ارسال به کاهندهها استفاده شود. این می تواند به میزان قابل توجهی میزان داده های منتقل شده در سراسر شبکه را کاهش دهد که به نوبه خود سرعت اجرای کلی کار را افزایش می دهد.
حال، سوال بزرگ این است که الزامات یک کمباینر برای ایمن بودن نخ چیست؟
تغییرناپذیری ورودی و خروجی
یکی از ملزومات اساسی یک کمباین رزوه ای ایمن تغییرناپذیری ورودی و خروجی آن است. هنگامی که چندین رشته به طور همزمان به Combiner دسترسی پیدا می کنند، ما نمی خواهیم هیچ یک از آنها داده ها را به گونه ای تغییر دهند که بتواند روی رشته های دیگر تأثیر بگذارد.
به عنوان مثال، اگر داده های ورودی Combiner قابل تغییر باشد، ممکن است یک رشته مقادیر را تغییر دهد در حالی که دیگری سعی در خواندن یا پردازش آنها دارد. این می تواند منجر به نتایج متناقض شود. به طور مشابه، خروجی Combiner نیز باید تغییرناپذیر باشد. اگر بخشهای دیگر چارچوب MapReduce شروع به تغییر خروجی Combiner در حالی که هنوز توسط رشتههای دیگر استفاده میشود، میتواند باعث ایجاد انواع مشکلات شود.
فرض کنید روی یک کلمه کار می کنیم - کار MapReduce را بشمارید. نقشهبردار جفتهای کلید - مقدار را خروجی میدهد که در آن کلید یک کلمه است و مقدار آن تعداد است. Combiner این تعداد را برای هر کلمه جمع می کند. اگر جفتهای کلید - مقدار قابل تغییر باشند، یک رشته ممکن است مقدار تعداد را تغییر دهد در حالی که رشتهای دیگر تلاش میکند تعداد کل آن کلمه را محاسبه کند. این منجر به شمارش نهایی نادرست می شود.
عملیات اتمی
عملیات اتمی یکی دیگر از جنبه های حیاتی رزوه است - ترکیب کننده های ایمن. عملیات اتمی عملیاتی است که برای بقیه سیستم به نظر می رسد که گویی آنی انجام شده است. در زمینه یک Combiner، عملیات اتمی تضمین می کند که چندین رشته می توانند بدون تداخل با یکدیگر، عملیات را روی داده های مشترک انجام دهند.
به عنوان مثال، هنگام تجمیع مقادیر در Combiner، باید از عملیات افزایش یا جمع اتمی استفاده کنیم. در جاوا،عدد صحیح اتمیکلاس عملیات اتمی را برای اعداد صحیح فراهم می کند. به جای استفاده از یک متغیر عدد صحیح معمولی برای پیگیری تعداد، می توانیم از an استفاده کنیمعدد صحیح اتمی. به این ترتیب، هنگامی که چندین رشته سعی می کنند تعداد را به طور همزمان افزایش دهند، عملیات تضمین شده است که اتمی است و ما به نتایج متناقضی نخواهیم رسید.
بیایید کلمه - شمارش را دوباره مثال بزنیم. به جای استفاده از یک عدد صحیح معمولی برای پیگیری تعداد هر کلمه، می توانیم از یک استفاده کنیمعدد صحیح اتمی. هنگامی که یک رشته می خواهد تعداد یک کلمه خاص را افزایش دهد، می تواند آن را فراخوانی کندincrementAndGet()روش ازعدد صحیح اتمی. این روش اتمی است، بنابراین حتی اگر چندین نخ سعی کنند تعداد را به طور همزمان افزایش دهند، عملیات به درستی انجام می شود.
مکانیسم های همگام سازی
گاهی اوقات، عملیات اتمی ممکن است کافی نباشد، و ما باید از مکانیسم های همگام سازی برای اطمینان از ایمنی نخ استفاده کنیم. همگام سازی به ما این امکان را می دهد که دسترسی به منابع مشترک را کنترل کنیم به طوری که تنها یک رشته می تواند در یک زمان به آنها دسترسی داشته باشد.
در جاوا می توانیم ازهماهنگ شدهکلمه کلیدی برای ایجاد روش ها یا بلوک های همگام شده. به عنوان مثال، اگر Combiner ما یک ساختار داده مشترک مانند aHashMapبرای ذخیره مقادیر جمع شده، می توانیم از یک بلوک همگام استفاده کنیم تا اطمینان حاصل کنیم که فقط یک رشته می تواند بهHashMapدر یک زمان

وارد کردن java.util.HashMap. class public MyCombiner { private HashMap<String, Integer> countMap = new HashMap<>(); public void combination(String key, int value) { synchronized (this) { if (countMap.containsKey(key)) { countMap.put(key, countMap.get(key) + value); } else { countMap.put(key, value); } } }
در این مثال،ترکیب کردنمتد همگام است، به این معنی که تنها یک رشته می تواند این روش را در یک زمان اجرا کند. این تضمین می کند کهHashMapبه روشی امن دسترسی و اصلاح می شود.
اجتناب از دولت جهانی
وقتی صحبت از برنامه نویسی ایمن به میان می آید، وضعیت جهانی می تواند یک کابوس باشد. اگر یک Combiner به متغیرهای سراسری یا منابع مشترکی که می توانند توسط چندین رشته اصلاح شوند متکی باشد، به احتمال زیاد با شرایط مسابقه و سایر موضوعات ایمنی مواجه می شود.
در عوض، ما باید سعی کنیم وضعیت Combiner را تا حد امکان محلی نگه داریم. هر رشته باید کپی مخصوص به خود را از داده هایی که برای کار روی آن نیاز دارد داشته باشد، و نتایج باید در پایان به روشی امن ترکیب شوند.
به عنوان مثال، به جای استفاده از یک جهانیHashMapبرای ذخیره مقادیر تجمیع شده، می توانیم از محلی استفاده کنیمHashMapبرای هر رشته هنگامی که تمام تجمیع های محلی انجام شد، می توانیم این محلی ها را ادغام کنیمHashMapsبه روشی ایمن.
تست ایمنی نخ
تست بخشی ضروری برای اطمینان از اینکه یک Combiner ایمن است. ما باید Combiner را تحت سناریوهای مختلف با نخ های متعدد آزمایش کنیم تا مطمئن شویم که نتایج ثابتی ایجاد می کند.
یکی از راههای تست ایمنی نخ، استفاده از چارچوب تست چند رشتهای است. به عنوان مثال، JUnit می تواند برای نوشتن موارد تست چند رشته ای استفاده شود. ما می توانیم چندین رشته ایجاد کنیم که Combiner را به طور همزمان فراخوانی کنند و سپس صحت خروجی را تأیید کنیم.
ما همچنین میتوانیم از ابزارهایی مانند FindBugs یا ابزارهای تحلیل استاتیک داخلی IntelliJ IDEA برای شناسایی موضوعات ایمنی بالقوه در کد استفاده کنیم. این ابزارها می توانند اشتباهات رایجی مانند استفاده از عملیات غیر اتمی روی متغیرهای مشترک یا عدم همگام سازی صحیح دسترسی به منابع مشترک را شناسایی کنند.
محصولات کمباین ما
ما بهعنوان تامینکننده کمباینر، مجموعهای از ترکیبکنندههای با کیفیت بالا را ارائه میدهیم که با در نظر گرفتن ایمنی رزوه طراحی شدهاند. ما12 کانال منفعل Headend Combinerو24 کانال منفعل Headend Combinerبرای کارهای MapReduce که ایمنی نخ یک نگرانی است عالی هستند. این ترکیبکنندهها با استفاده از آخرین فناوری ساخته شدهاند و برای اطمینان از مطابقت با بالاترین استانداردهای عملکرد و قابلیت اطمینان، بهدقت آزمایش شدهاند.
اگر به دنبال یک Thread - Combiner ایمن برای کار MapReduce خود هستید، مایلیم از شما بشنویم. چه یک توسعه دهنده در مقیاس کوچک یا یک شرکت بزرگ باشید، ما راه حل مناسبی برای شما داریم. از تماس گرفتن و شروع گفتگو در مورد نیازهای خاص خود دریغ نکنید. ما اینجا هستیم تا به شما کمک کنیم بهترین Combiner را برای نیازهای خود بیابید و اطمینان حاصل کنیم که کارهای MapReduce شما روان و کارآمد هستند.
مراجع
- تام وایت. "هدوپ: راهنمای قطعی." رسانه O'Reilly، 2015.
- برایان گوتز و همکاران "همگامی جاوا در عمل." ادیسون - وسلی حرفه ای، 2006.
