آبشار

Chris K. Wensel

آبشار (Cascading) یک کتابخانه جاوای منبع باز و API است که یک لایه انتزاعی برای MapReduce فراهم می‌کند. این برنامه‌نویس‌ها را قادر می‌سازد تا برنامه‌های پیچیده و مهم برای پردازش داده‌ها را که روی خوشه‌های Hadoop اجرا می‌شوند، ایجاد کنند.

پروژه آبشار از تابستان سال 2007 آغاز شد. اولین نسخه عمومی آن، نسخه 0.1، در ژانویه سال 2008 راه‌اندازی شد. نسخه 1.0 در ژانویه 2009 منتشر شد.

Map وreduce عملیات، ابتدایی قدرتمند را ارائه می‌دهند. با این وجود، آنها برای ایجاد کدی پیشرفته و کاملاً سازگار که می‌تواند در بین توسعه‌دهندگان مختلف به اشتراک گذاشته شود، تمایل به بودن در سطح ناصحیح دانه دانه دارند. علاوه بر این، بسیاری از توسعه‌دهندگان هنگام مواجهه با مشکلات دنیای واقعی، فکر کردن را از نظر MapReduce دشوار می‌دانند.

برای پرداختن به شماره اول، Cascading  کلیدها و مقادیر به کار رفته در MapReduce را با نام‌های فیلد ساده و یک مدل داده tuple جایگزین می‌کند ، جایی که یک tuple در واقع لیستی از مقادیر است. برای شماره دوم، Cascading  با معرفی انتزاعات سطح بالاتر به عنوان گزینه‌‌‌های دیگر: توابع، فیلترها، برنامه‌های جمع آور و بافرها از Map وreduce  حرکت می‌کند.

گزینه‌های دیگر تقریباً همزمان با انتشار عمومی اولیه پروژه، ظهور کردند، اما Cascading برای تکمیل آنها طراحی شد. در نظر بگیرید که بیشتر این چهارچوبهای جایگزین شرایط پیش و بعد یا سایر انتظارات را تحمیل می‌کنند.

به عنوان مثال، در چندین ابزار MapReduce دیگر، شما باید قبل از اجرای برنامه، داده های خود را در HDFS از پیش تنظیم، فیلتر یا وارد کنید. آن مرحله از تهیه داده‌ها باید خارج از انتزاع برنامه‌نویسی باشد. در مقابل، Cascading  ابزاری برای تهیه و مدیریت داده‌های شما به عنوان بخش‌های صحیح انتزاع برنامه نویسی فراهم می‌کند.

این مطالعه موردی با مقدمه‌ای بر مفاهیم اصلی Cascading آغاز می‌شود ، سپس با مروری بر نحوه استفاده ShareThis از Cascading در زیرساخت‌های خود به پایان می‌رسد. برای نمایش عمیق‌تر مدل پردازش Cascading، به راهنمای کاربر Cascading در وب سایت پروژه مراجعه کنید.

زمینه‌ها، تاپل‌ها و لوله‌ها

مدل MapReduce از کلیدها و مقادیر برای پیوند دادن داده‌های ورودی به Map Function ،Map Function به Reduce  Function  و Reduce Function به داده‌های خروجی استفاده می‌کند.

اما همانطور که می‌دانیم، برنامه‌های Hadoop در دنیای واقعی معمولاً از بیش از یک کار MapReduce زنجیر شده در کنار هم تشکیل شده است. نمونه شمارش کلمات متعارف را که در MapReduce اجرا شده است را در نظر بگیرید. در صورت نیاز به مرتب کردن تعداد عددها به ترتیب نزولی، که این یک الزام بعید نیست، لازم است در یک کار MapReduce دوم انجام شود.

عملیات

همانطور که قبلاً نیز گفته شد، Cascading با معرفی عملیاتی جایگزین که یا بر روی دسته های جداگانه یا گروه‌های تاپل اعمال می‌شود، از MapReduce حرکت می‌کنند.

Function

یک Function  بر روی نوارهای ورودی فردی کار می‌کند و ممکن است برای هر یک از ورودی‌ها صفر یا تعداد بیشتری از کلیدهای خروجی بازگردد. توابع توسط هر pipe  اعمال می‌شوند.

Filter 

Filter  نوع خاصی از Function  است که مقدار Boolean را نشان می‌دهد که آیا باید جریان ورودی فعلی از جریان tuple  خارج شود. یک Function  می‌تواند به این هدف خدمت کند، اما فیلتر برای این مورد بهینه شده است و بسیاری از فیلترها را می‌توان با فیلترهای "منطقی" مانند AND ، OR ، XOR  و NOT دسته‌بندی کرد و به سرعت عملیات پیچیده‌تری برای فیلتر ایجاد کرد.

Aggregator  

Aggregator برخی از عملیات‌ها را در برابر گروهی از‌tuple ها انجام می‌دهد، جایی که دسته‌های tupleها توسط مجموعه متفاوتی از مقادیر میدانی (به عنوان مثال، تما tuple ها با همان "نام خانوادگی" یکسان هستند) دسته‌بندی شده‌اند. پیاده‌سازی‌های مشترک Aggregator عبارتند از Sum, Count, Average, Max, and Min.

Buffer

یک بافر شبیه به Aggregator است،  مگر اینکه بهینه سازی شود که به عنوان یک "پنجره کشویی" در تمام tupleها در یک گروه منحصر به فرد عمل کند. این زمانی مفید است که توسعه‌دهنده نیاز دارد تا مقادیر گمشده را به صورت مجموعه منظم از tupleها (مانند تاریخ یا مدت زمان از دست رفته) وارد کند یا یک میانگین در حال اجرا ایجاد کند. معمولاً Aggregator هنگام کار با گروههای tupleها عملکرد موردنظر است زیرا بسیاری از Aggregators را می‌توان با هم بسیار کارآمد زنجیر کرد اما گاهی اوقات Buffer بهترین ابزار برای کار است.

Taps, Schemes, and Flows

در بسیاری از نمودارهای قبلی، به "sources" و "sinks" اشاره شده است. درCascading ، تمام داده‌ها از نمونه‌های Tap یا خوانده شده به Tap نوشته می‌شوند، اما از طریق اشیاء Scheme objects  به نمونه‌های tuple تبدیل می‌شوند:

Tap

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

Schemes

یک Schemes  مسئول خواندن داده‌های خام و تبدیل آن به نوار و یا نوشتن یک نوت‌بوک به داده های خام را دارد ، جایی که این داده های "خام" می توانند خطوط متن، فایلهای دنباله دودویی Hadoop یا برخی از قالب‌های اختصاصی باشند.

انعطاف پذیری

Cascading در عمل

حالا که می دانیم Cascading چیست و ایده خوبی در مورد نحوه عملکرد آن داریم، برنامه ای که به زبان Cascading نوشته شده چیست؟

Example 24-1. Word count and sort

Scheme sourceScheme =

new TextLine(new Fields("line"));

Tap source =

new Hfs(sourceScheme, inputPath);

Scheme sinkScheme = new TextLine();

Tap sink =

new Hfs(sinkScheme, outputPath, SinkMode.REPLACE);

Pipe assembly = new Pipe("wordcount");

String regexString = "(?<!\\pL)(?=\\pL)[^ ]*(?<=\\pL)(?!\\pL)";

Function regex = new RegexGenerator(new Fields("word"), regexString);

assembly =

new Each(assembly, new Fields("line"), regex);

assembly =

new GroupBy(assembly, new Fields("word"));

Aggregator count = new Count(new Fields("count"));

assembly = new Every(assembly, count);

assembly =

new GroupBy(assembly, new Fields("count"), new Fields("word"));

FlowConnector flowConnector = new FlowConnector();

Flow flow =

flowConnector.connect("word-count", source, sink, assembly);

flow.complete();

Flexibility

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

در نظر داشته باشید، ما دیگر به لحاظ کارهای MapReduce یا اجراهای برنامه‌های رابط Mapper و Reducer و چگونگی اتصال یا پیوند دادن کارهای بعدی MapReduce به مواردی که قبل از آنها است، فکر نمی کنیم. در زمان اجرا، "برنامه ریز" آبشاری، روش بهینه برای تقسیم مونتاژ pipe در کارهای MapReduce را مشخص می‌کند و ارتباطات بین آنها را مدیریت می‌کند.

به همین دلیل، توسعه دهندگان می‌‌توانند برنامه‌های دانه‌داری دلخواه را ایجاد کنند. آنها می‌توانند با یک برنامه کوچک که فقط یک پرونده را فیلتر می‌کند، شروع کنند، سپس به صورت تکراری ویژگی‌های بیشتری را در صورت نیاز بسازند.

Hadoop and Cascading at ShareThis

ShareThis یک شبکه اشتراکی است که به اشتراک‌گذاری محتوای آنلاین را ساده می‌کند. با کلیک روی یک دکمه در یک صفحه وب یا افزونه مرورگر ShareThis  به کاربران امکان می‌دهد از هر نقطه آنلاین به مخاطبین و شبکه‌های خود دسترسی یکپارچه داشته و محتوا را از طریق ایمیل‌، IM ، Facebook ، Digg ، پیام کوتاه موبایل و سرویس‌های مشابه را بدون ترک صفحه فعلی به اشتراک بگذارند. ناشران می‌توانند دکمه ShareThis را به کار گیرند تا به قابلیت‌های اشتراکی جهانی سرویس برای هدایت ترافیک‌، تحریک فعالیت ویروسی و پیگیری اشتراک مطالب آنلاین استفاده کنند. ShareThis  همچنین خدمات رسانه‌های اجتماعی را با کاهش درهم و برهمی در صفحات وب و توزیع فوری مطالب در شبکه‌های اجتماعی، گروه‌های وابسته و جوامع ساده می‌کند.

از آنجا که کاربران ShareThis از طریق widgets آنلاین، صفحات و اطلاعات را به اشتراک می‌گذارند، یک جریان مداوم از رویدادها وارد شبکه ShareThis می‌شوند. این وقایع ابتدا فیلتر و پردازش می‌شوند و سپس به سیستم‌های مختلف با پس زمینه از جمله AsterData ، Hypertable و Katta تحویل داده می‌شوند.

حجم این وقایع می تواند بسیار زیاد باشد. بسیار بزرگ برای پردازش با سیستم‌های سنتی. این داده‌ها همچنین به لطف "injection attacks" از سیستم‌های سرکش، اشکالات مرورگر یا widgets  معیوب، می‌توانند بسیار "کثیف" باشند. به همین دلیل توسعه دهندگان در ShareThis تصمیم به استقرار Hadoop به عنوان پیش پرداز و ارکستراسیون جلوی سیستم‌هایbackend  خود گرفتند. آنها همچنین تصمیم گرفتند كه از خدمات وب آمازون برای میزبانی سرورهای خود در Elastic Computing Cloud (EC2)  استفاده كنند و مدت زمان طولانی ذخیره را در سرویس ساده ذخیره‌سازی (S3)  فراهم كنند تا چشم خود را به سمت  (EMR) Elastic MapReduce ببرند.

خلاصه

Hadoop  یک بستر بسیار قدرتمند برای پردازش و هماهنگی حرکت داده‌ها در بین اجزای مختلف معماری است. تنها نقطه ضعف آن این است که مدل محاسباتی اولیه MapReduce است.

Cascading  قصد دارد به توسعه دهندگان کمک کند تا برنامه‌های قدرتمند را به سرعت و به آسانی از طریق یک API خوب و منطقی و بدون نیاز به تفکر در MapReduce و در حالی که سنگینی توزیع داده‌ها، تکثیر، مدیریت فرایند توزیع شده و سرزندگی برای Hadoop برداشته شده است، کمک کند.