Streaming-in-Spark-Flink-and-Kafka

جریان داده در اسپارک، فلینک و کافکا

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

هر دو جریان داده اسپارک و فلینک دقیقا یک مورد را ضمانت می کنند: اینکه هر رکورد دقیقا یک بار پردازش شود. در نتیجه هرگونه  تکراری که ممکن است در دسترس باشد، حذف می شود. هر دو در مقایسه با سایر سیستم های پردازش مانند storm، توان عملیاتی بسیار بالای دارند اما در هر دوی آنها سربار تحمل خطا پایین است. این در حالی ست که کلاینت های کافکا می توانند برای حداقل و حداکثر یکبار ایجاد شده و دقیقا نیازهای پردازش پیام را برطرف کنند. کافکا برای دو کلاس گسترده ی کاربردی استفاده می شود:

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

زمانی که داده ها به صورت جریان پیوسته ای از رویدادها می رسند، به عنوان مثال سیگنال های GPS ماشین در حال حرکت، تراکنش های مالی، تبادل سیگنال های بین برج های تلفن همراه، ترافیک وب شامل چیزهایی مانند ردیابی سشن و درک رفتار کاربر در وب سایت ها و همینطور اندازه گیری مقادیر در سنسورهای صنعتی، نیاز به پردازش جریان به صورت بلادرنگ احساس می شود.

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

تفاوت اسپارک و فلینک در مدل محاسباتی آنهاست. در حالی که اسپارک چندین میکرو را به خود اختصاص می دهد، فلینک مدل جریان پیوسته و مبتنی بر عامل را اتخاذ کرده است. بدین صورت که اسپارک مبتنی بر زمان است در حالی که فلینک مبتنی بر رکورد (یا هر معیار سفارشی که توسط کاربر تعریف شده باشد) می باشد.

فلینک و اسپارک هر دو سیستم عامل داده پرداز بوده و از پروژه های سطح بالا در بنیاد آپاچی (ASF) هستند. آنها زمینه ی گسترده ای از برنامه های کاربردی دارند و برای ده ها سناریو بزرگ داده قابل استفاده اند. هر دو قادر به اجرا در حالت مستقل هستند، اما افراد بسیاری از آنها، در سطوح بالای هادوپ (YARN، HDFS) استفاده می کنند. آنها با توجه به ماهیت حافظه ی خود، از عملکرد قدرتمندی بهره مندند.

حال نگاهی به مزایای هر کدام به صورت مجزا می پردازیم.

آپاچی اسپارک

اسپارک یک چارچوب محاسباتی خوشه ای به صورت متن باز بوده و دارای کاربران عمومی در سطح جهان می باشد. این برنامه تحت R، جاوا، اسکالا و پایتون نوشته شده و به برنامه نویسان یک رابط کاربردی برنامه نویسی (API) ارائه می دهد که دارای تحمل پذیری در برابر خطا بوده و براساس اقلام فقط خواندنی از چندین مجموعه داده توزیع شده ساخته شده است. دو سال پس از انتشار اولیه اسپارک (مه 2014)، در بکارگیری آن در موارد بلادرنگ و تجزیه و تحلیل های پیشرفته – به علت سهولت استفاده و توانایی اداره ی نیازهای تحلیلی پیچیده – با پذیرش گسترده ای روبرو شد.

مزایای اسپارک:

  • سرعت: اسپارک قابلیت اجرای کارهای پردازش دسته ای را 10 تا 100 برابر سریع تر از mapReduce دارد.
  • سهولت استفاده: انجام عملیات بر روی مجموعه داده های بزرگ را به آسانی امکان پذیر می کند.
  • موتور یکپارچه: اسپارک می تواند در لایه بالای هادوپ اجرا شود و از مدیر خوشه ها در هادوپ (YARN) و ذخیره سازی پایه آن ( HDFS، Hbaseو …) استفاده کند. اگرچه اسپارک می تواند مستقل از هادوپ نیز اجرا شود و همینطور می تواند از سایر مدیران خوشه و سیستم های ذخیره سازی نظیر کاساندرا و آمازون S3 نیز استفاده کند. علاوه براین از کوئری های SQL ، جریان های داده ای ، ماشین یادگیرنده  و الگوریتم های گراف هم پشتیبانی می کند.
  • از بین جاوا، اسکالا یا پایتون هر کدام را می خواهید انتخاب کنید: اسپارک شما را به یک زبان خاص متصل نمی کند و به شما اجازه می دهد از میان زبان های محبوب مانند R، پایتون، اسکالا، جاوا و حتی Clojure هر کدام را که می خواهید انتخاب کنید.
  • اشتراک گذاری داده های حافظه: کارهای مختلف می توانند داده ها را در حافظه به اشتراک بگذارند که این امر باعث می شود تا یک انتخاب ایده آل برای کارهای پردازش داده های تکراری، تعاملی و جریان رویداد داشته باشید.
  • اسپارک دارای 80 دستور سطح بالا ( high-level ) برای کوئری های تعاملی می باشد.

آپاچی فلینک

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

مزایای فلینک:

  • جریان پردازش داده به عنوان یک جریان واقعی: به عنوان مثال، عناصر داده بلافاصله پس از رسیدن از طریق یک برنامه جریان پرداز به صورت “خط لوله ای (pipelined)” جریان می یابند. این عمل باعث افزایش انعطاف پذیری عملیات ویندوز می شود.
  • مدیریت حافظه بهتر: مدیریت حافظه به صورت صریح انجام می شود و از شر خوشه ها در چارچوب اسپارک رها می شود.
  • سرعت: پردازش تکراری به جای اینکه بر روی خوشه اجرا شود، بر روی یک گره به طور مستقل اجرا می شود که این امر باعث افزایش سرعت می شود. می توان با تنظیم آن به نحوی که به جای پردازش مجدد تمام داده ها، تنها بخشی از آنها را مجدداً پردازش کند، عملکرد را بهبود بخشید. این عمل در مقایسه با الگوریتم پردازش استاندارد، سرعت را تا پنج برابر افزایش می دهد.

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

آپاچی کافکا

کافکا پلتفرمی جریان پرداز و توزیع شده می باشد. کافکا در تبدیلات پیچیده تر، یک API کاملا یکپارچه ارائه می دهد. جریان های API به برنامه اجازه می دهند تا به عنوان یک پردازنده ی جریان عمل کند، یک جریان ورودی را از یک یا چند تاپیک دریافت کند و جریان خروجی را به یک یا چند تاپیک خروجی تبدیل کند. به طور موثر می توان کاربرد آن را بصورت تبدیل جریان ورودی به جریان خروجی عنوان کرد.

کافکا بسیاری از مسائل پردازش جریان را پشتیبانی می کند:

  • داده های بدون نظم را مدیریت می کند.
  • عملیات ورودی را به عنوان کد تغییر می دهد
  • انجام محاسبات عمومی و …
  • API های تولید کننده و مصرف کننده برای ورودی
  • مکانیزم گروهی برای تحمل خطا در بین نمونه های پردازنده ی جریان

این تسهیلات به حل مشکلات سختی که برنامه با آن مواجه می شود، از قبیل برخورد با داده های بدون نظم، پردازش مجدد ورودی به عنوان تغییرات کد، انجام محاسبات عمومی و … ، کمک می کند.

جریان های API ساخته شده بر روی هسته ی اولیه ی کافکا شامل عملیات زیر می باشد: از API تولید کننده و مصرف کننده به عنوان ورودی استفاده می کند، از کافکا برای ذخیره سازی وضعیت استفاده کرده و از مکانیزم همان گروه، برای تحمل پذیری در برابر خطا در میان نمونه های جریان پردازنده، استفاده می کند.

اسپارک و فلینک

اسپارک و فلینک دیتاست های درون حافظه ای هستند که می توانند داده های خود را درحافظه دائمی (storage) بنویسند، نکته ی مهم در جریان پردازی، این است که برای تحلیل داده های جاری، آنها را در حافظه (memory) نگه داری می کنند. این کار به برنامه نویسان اجازه می دهد برنامه های حجیم را با استفاده از جریان پردازی داده ها بنویسند. آنها می توانند داده ها را به هر فرمتی که هست گرفته و به مجموعه های مختلف پیوند دهند، آن ها را به جفت مقادیر کلیدی (Map) کاهش دهند و سپس محاسبات را در جفت های مجاور انجام داده و یک مقدار نهایی تولید کنند. علاوه براین آنها می توانند برای شکل دهی برخی از طرح ها (مدل های پیش بینی) یا الگوهای اکتشافی (مدل های طبقه بندی)، آیتم های داده را درون الگوریتم های یادگیری ماشین جای دهند.

در اینجا به مقایسه اسپارک و فلینک، براساس پردازش داده، مدیریت حافظه، گردش داده، CLI و پشتیبانی از سایر تولیدات جریان پردازی، می پردازیم.

پردازش داده

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

مدیریت حافظه

فلینک می تواند به صورت خودکار با مجموعه داده های متناسب سازگار باشد اما اسپارک نیاز به بهینه سازی و تنظیم کارها به صورت دستی و متناسب با هر مجموعه داده دارد. همچنین اسپارک تقسیم بندی و ذخیره سازی را به صورت دستی انجام می دهد. بنابراین انتظار تاخیر در پردازش وجود دارد. فلینک روشی متفاوت برای مدیریت حافظه دارد. هنگامی که حافظه پر شود، صفحات فلینک به دیسک بر می گردند. این همان عملی است که در ویندوز و لینوکس هم اتفاق می افتد. در اسپارک زمانی که گره خارج از حافظه باشد تصادم یا crash اتفاق می افتد اما چون در مقابل خطا، تحمل پذیر است، داده ها از دست نخواهند رفت.

گردش داده

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

رابط خط فرمان (CLI)

اسپارک رابط خط فرمان R، اسکالا و پایتون را دارد. فلینک در واقع از همین رابط خط فرمان ها استفاده نمی کند و تفاوت های ظریفی دارد.

داشتن رابط خط فرمان در اسپارک بدین معناست که کاربران می توانند اسپارک را شروع کرده، یک sparkContext دریافت نموده و برنامه های خود را در یک خط و در یک زمان بنویسند. این امر باعث می شود که حرکت در بین داده ها و اشکال زدایی آن ساده تر شود. حرکت در بین داده ها، اجرای map ، کاهش پردازش ها و انجام همه ی این مراحل را می توان به عنوان وظایف دانشمندان داده بیان کرد.

فلینک دارای رابط خط فرمان اسکالا نیز می باشد اما خب دقیقا به همان شکل نمی باشد. در فلینک، شما کد را نوشته و دستور print() را اجرا می کنید تا آن را به صورت دسته ای ارسال کرده و منتظر خروجی بماند.

پشتیبانی از سایر محصولات جریان پردازی

هر دو مورد یعنی فلینک و اسپارک با کافکا کار می کنند، محصول جریان پردازی توسط linkedIn نوشته شده است. علاوه براین فلینک با توپولوژی های storm نیز کار می کند.

فلینک و کافکا

بزرگترین تفاوت بین دو سیستم با هماهنگ سازی توزیع شده به صورت زیر می باشد:

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

نتیجه گیری

واقعیت این است که API فلینک به نسبت ساده تر از API اسپارک است و اینکه سیستم آن نسبت به آپاچی اسپارک انعطاف پذیری بیشتری دارد. هنگامی که در خوشه ی محاسباتی از ذخیره سازی شبکه متصل (NAS) استفاده می شود، فلینک بسیار سریعتر از آپاچی اسپارک می باشد. از نظر پردازش دسته ای نیز، آپاچی فلینک سریعتر است و تقریبا دو برابر سریعتر از آپاچی اسپارک با NAS عمل می کند. آپاچی فلینک در مقایسه با آپاچی اسپارک تقریبا هیچ تاخیری در پردازش عناصر جریان، ندارد.

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

ثبت دیدگاه

ایمیل شما نمایش داده نخواهد شد. لطفا فیلد های مرتبط را پر کنید.