در این فصل به بررسی ابزار Apache Crunch پرداخته شده است.

Apache Crunch یک API با سطح بالاتر برای نوشتن pipelineهای MapReduce است. مهم‌ترین مزایای آن نسبت به MapReduce ساده، تمرکز آن بر روی برنامه‌نویسان انواع جاوا سازگار مانند رشتهها و اشیاء ساده قدیمی جاوا، مجموعه‌ای غنی‌تر از عملیات تبدیل داده‌ها و pipelineهای چند مرحله‌ای است (نیازی به مدیریت صریح کارهای MapReduce شخصی در یک گردش کار ندارد).

از این نظر، Crunch بسیار شبیه نسخه جاوا از Pig است.

API Core Crunch

در این بخش رابط های اصلی در Crunch ارائه شده است.  API Crunch  از لحاظ طراحی سطح بالایی دارد، بنابراین برنامه‌نویس می‌تواند به جای جزئیات نحوه اجرای آن، روی عملیات منطقی محاسبات متمرکز شود.

توابع

در درون هر برنامه Crunch توابع (نمایش داده شده توسط DoFn ) هستند که یک PCollection را به دیگری تبدیل می‌کنند.

متریال‌سازی

متریال‌سازی فرآیند ساختن مقادیر موجود در PCollection است تا در برنامه شما خوانده شود. به عنوان مثال، شما ممکن است بخواهید تمام مقادیر را از یک (معمولاً کوچک) PCollection بخوانید و آنها را به نمایش بگذارید، یا اینکه آنها را به جای نوشتن آنها در یک هدف Crunch، به قسمت دیگری از برنامه خود ارسال کنید. یکی دیگر از دلایل متریال‌سازی PCollection استفاده از مطالب به عنوان مبنای تعیین مراحل پردازش بیشتر است - برای مثال، آزمایش برای همگرایی در یک الگوریتم تکراری.

اجرای Pipeline

هنگام ساخت Pipeline ، Crunch یک برنامه اجرایی داخلی ایجاد می‌کند، که به طور صریح توسط کاربر یا به طور ضمنی توسط Crunch اجرا می‌شود. یک نقشه اجرای یک نمودار عملیاتی کارگردانی بر روی PCollections است، که در آن هر PCollection در این طرح با استفاده از PCollections که بحث برای این عملیات هستند، به عملکردی که آن را تولید می‌کند، اشاره دارد.

اجرای یک Pipeline

عملیات Pipeline به روش صریح با فراخوانی روش () اجرای Pipeline  () انجام می شود که مراحل زیر را انجام می‌دهد.

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

دوم، این کار هر مرحله را در برنامه بهینه‌سازی شده (به موازات، در صورت امکان) برای متریال‌سازی PCollection نتیجه انجام می‌دهد.

سرانجام، روش اجرای () یک شیء PipelineResult را به تماس گیرنده برمی‌گرداند، و اطلاعات مربوط به هر مرحله که اجرا شده است (مدت زمان و نقشه‌های MapReduce7)، و همچنین اینکه آیا Pipeline  موفقیت‌آمیز بود یا خیر (از طریق روش موفق ()).

توقف Pipeline

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

بازرسی یک برنامه  Crunch

بعضی اوقات برای بازرسی از برنامه اجرای بهینه مفید یا لااقل روشنگری است. قطعه زیر نحوه دستیابی به نمایندگی پرونده DOT از نمودار عملکرد در یک Pipeline به عنوان یک رشته، و نوشتن آن را برای یک فایل (با استفاده از کلاس ابزارهای Guava's Files) نشان می‌دهد. این متکی بر دسترسی به PipelineExociation است که از اجرای Pipeline به صورت غیر همزمان و به طور غیرمستقیم برگشته است:

PipelineExecution execution = pipeline.runAsync();

String dot = execution.getPlanDotFile();

Files.write(dot, new File("pipeline.dot"), Charsets.UTF_8);

execution.waitUntilDone();

pipeline.done();

الگوریتم های تکراری

استفاده مشترک از PObjects برای بررسی همگرایی در یک الگوریتم تکراری است. مثال کلاسیک یک الگوریتم تکرار شونده توزیع شده، الگوریتم PageRank برای رتبه‌بندی اهمیت نسبی هر یک از صفحات مرتبط، مانند شبکه جهانی وب است. جریان کنترلی برای اجرای Crunch از PageRank به شرح زیر است:

PTable<String, PageRankData> scores = readUrls(pipeline, urlInput);

Float delta = 1.0f;

while (delta > 0.01) {

scores = pageRank(scores, 0.5f);

PObject<Float> pDelta = computeDelta(scores);

delta = pDelta.getValue();

}

بررسی Pipeline

در بخش قبلی ، دیدیم که Crunch از هرگونه PCollections که در هر نوع اجرای قبلی از همانPipeline  متریالایز شده استفاده می‌کند. با این وجود، اگر نمونهPipeline  جدیدی ایجاد کنید، آنگاه به طور خودکار هیچ‌گونه PCollections متریالایز شده از سایرPipeline ها را به اشتراک نمی‌گذارد، حتی اگر منبع ورودی یکسان باشد. این می‌تواند باعث ایجاد Pipeline شود و زمان برتری داشته باشد، زیرا حتی تغییر کوچکی در محاسبات در انتهای Pipeline به معنای آن است که Crunch  از ابتدا Pipeline جدید را اجرا خواهد کرد.

کتابخانه‌های Crunch

Crunch با مجموعه قدرتمندی از توابع کتابخانه در بسته org.apache.crunch.lib همراه است - در جدول انتهاي فصل خلاصه شده‌اند.