نگاهی به مفاهیم و ابزار جریانپردازی
در چند سال اخیر و به مدد رشد منابع تولید کننده داده، سمت و سوی فناوریهای پردازش داده از کلانداده به دادههای جریانی (Stream) تغییر مسیر داده است. تا چند سال پیش، دغدغه ما پردازش میلیونها دادهای بود که ذخیره شده بودند و نیاز به پردازش داشتند (Data at Rest) اما سرعت تولید اطلاعات و نیاز به پردازش سریع و اتخاذ تصمیمات لحظهای باعث شده است امروزه نیاز اصلی ما در پردازش داده به پردازش جریان یا داده در حال حرکت (Data in Motion) تبدیل شود. (رجوع کنید به مقاله Data in motion vs. data at rest).
بعد از حدود یک دهه از ظهور و رواج ابزار و کتابخانههای کلانداده، این سامانهها از لحاظ الگوریتمها و مدلهای پردازشی مقیاسپذیر به یک ثبات نسبی رسیدهاند اما مبحث پردازش جریان، به دلیل رواج روزافزون اینترنت اشیاء و دستگاههای هوشمند و لزوم پردازش سریع و لحظهای حجم عظیم دادههای ورودی، به یک موضوع داغ پژوهشی در چند سال اخیر تبدیل شده است به گونهای که حتی سامانههای کلاسیک پردازش زمانمند دادهها (Batch Processing) مانند هدوپ را به عنوان بخشی از یک سامانه جریانپرداز تعریف میکنند با این توجیه که در این سامانهها، در صورت نیاز به پردازش دادههای ذخیره شده، جریان دادهای از آنها تولید میکنیم و جریان ورودی به جای اینکه از دادههای فعلی و در حال ورود باشد، از دادههای قبلی و ذخیره شده تشکیل میشود. با این تفسیر جدید، تمرکز و اولویت تحقیقات به نوعی به سمت این سامانههای جریان پرداز (stream processing systems) معطوف شده است.
از آنجا که امروزه، دادههای تولید شده در لحظه توسط ابزارها و کاربران انسانی، بسیار زیادتر از حدیست که بتوان با یک سیستم و یا یک نرم افزار، آنها را به صورت بلادرنگ دریافت، مدیریت و تحلیل کرد، سامانههای جریانپرداز (stream processing systems) از اهمیت دوچندان در حوزه تحقیقات کلانداده، برخوردار شدهاند.
در این نوشتار، به مفاهیم پایه حوزه پردازش جریان خواهیم پرداخت و در ادامه، کتابخانههای پردازش جریان آپاچی که گرایش اصلی حوزه کلانداده هستند، با بیان معایب و مزایای هر یک معرفی خواهند شد.
نگاهی به مسیر طی شده
تمرکز اصلی محققین حوزه کلانداده در یک دهه گذشته بر ارائه روشهایی برای ذخیره و پردازش حجم عظیم داده بوده است. سیستم فایل HDFS و مدل پردازشی توزیع شده توزیع و تجمیع (Map/Reduce) ، ماحصل و نقطه عطف این تلاشهاست که در طی سالیان گذشته به بلوغ لازم رسیده اند و در بسیاری از شرکتها و سازمانها نسخه های مختلف آنها نهادینه شده است. رواج بانکهای اطلاعاتی غیررابطه ای در دنیا که با نام NoSQL شناخته میشوند، بخشی دیگر از این ره آوردهاست. البته ارتقای معماری و طراحی ساختار نوین برای بانکهای اطلاعاتی رابطهای سنتی تحت عنوان NewSQL هم بسیاری از نیازهای شرکتها و سازمانهای بزرگ را برای ذخیره و بازیابی حجم عظیم داده ها برطرف کرده است .
در روشهای سنتی پردازش کلان داده، ابتدا داده ها را در سیستم های فایل توزیع شده یا بانکهای اطلاعاتی مناسب مانند کاساندرا و مانگودیبی، ذخیره میکنیم و سپس به کمک چارچوب های پردازشی توزیع شده مانند توزیع و تجمیع (Map/Reduce) و یا اسپارک به تحلیل دادهها و استخراج اطلاعات لازم میپردازیم. این سبک از پردازش داده به نام پردازش انبوه یا پردازش زمانمند (Batch Processing) در ادبیات کلانداده معروف شده است.
با این وجود، نیازهای دنیای فناوری اطلاعات روزبروز در حال تغییر است و در بسیاری از کاربردهای نوین و بخصوص با رواج اینترنت اشیاء، نیاز به پردازش لحظه ای و بلادرنگ داده ها داریم و برخلاف مدل کلاسیک پردازش انبوه، قبل از ذخیره داده و یا در همان حین، باید به پردازش و بررسی آن اقدام کنیم. (این مقاله را از دست ندهید)
این سبک از پردازش که به محض دریافت یک داده کار خود را با آن آغاز میکند، پایه گذار ادبیات و جنبش جدیدی در حوزه کلانداده شده است که به نام مدل پردارش جریان یا جریانپردازی از آن یاد میکنیم .
ابتدا خود مفهوم جریان را به طور دقیق تر بررسی میکنیم. منظور از جریان، دادههاییست که به صورت مداوم و نامحدود در قالب چندتاییهایی به شکل (a1, a2,…, an, t) تولید میشوند. در این چندتایی که نشاندهنده یک رخداد خاص است، ai نمایانگر یک خصوصیت از آن رخداد و t هم اشاره به زمان تولید آن دارد.
به عنوان مثال، فرض کنید که گوگل قصد جمع آوری دادههای آماری مربوط به بازدیدکنندگان سایتهای وب را براساس نتایج جستجویی که به کاربران نمایش میدهد، دارد. برای این منظور، به ازای هر کلیک کاربران در سرتاسر دنیا بر روی یک نتیجه جستجوی گوگل، رخدادی به شکل زیر تولید و برای پردازش و ذخیره به سامانههای داخلی آن ارسال میشود:
همانطور که میبینید به ازای هر بازدید از یک صفحه یک داده مشابه فوق تولید میشود و مجموعه این رخدادها در لحظه، یک جریان از دادهها را برای ما تولید خواهد کرد.
در ادامه برخی از مفاهیم پایهای پردازش جریان را با هم بررسی خواهیم کرد.
واحدهای پردازش / واحدهای دریافت
در یک سامانه جریان پرداز به دلیل پردازشهای گوناگونی که معمولاً روی دادهها صورت میگیرد و برای اینکه بتوانیم کارها را در یک شبکه یا کلاستر از واحدهای محاسباتی (Processing Nodes) به راحتی توزیع کنیم، هر بخش کوچک و مجزا از پردازشی که قرار است روی دادهها صورت بگیرد را به یک واحد محاسباتی میسپاریم. منظور از واحد محاسباتی یا واحد پردازش هم یک پردازنده است که میتواند عملیاتی را روی داده انجام بدهد و نتیجه را در جایی ذخیره کند.
بنابراین یک سامانه جریانپرداز، مجموعهای از واحدهای پردازش خواهد بود که هر کدام، کار خاصی را روی داده انجام داده، نتیجه را به مرحله بعد ارسال میکنند. فرض کنید جریان داده ورودی ما یک مطلب جدید در شبکه اجتماعی توئیتر باشد. اولین واحد پردازش با دریافت این داده، برچسبها و هشتگهای آنرا استخراج و در دیتابیس ذخیره کرده میکند و سپس آنرا به واحد بعدی تحویل میدهد. واحد پردازش دوم، پیش پردازشهای متنی مثل یکی کردن کاف فارسی و کاف عربی، حذف همزه و مانند آنرا انجام میدهد که متن، نرمال شود.
واحد پردازش بعدی، به دسته بندی مطلب میپردازد و تعیین میکند که مطلب دریافتی، سیاسی، ورزشی، اجتماعی و مانند آن است و این دستهبندی، به خصوصیات داده دریافتی اضافه میشود. در مرحله بعدی، این مطلب وارد بخش آماری میشود و به ازای هر هشتگ، دسته بندی، مطلب و مانند آن، آمار روزانه، هفتگی ، ماهیانه و آمار کل به روز میشود و در مرحله آخر هم وارد واحد پردازشی نهایی میشود تا در بانکهای اطلاعاتی مورد نیاز، ذخیره گردد. واحدهای ابتدایی که وظیفه دریافت دادهها را برعهده دارند، گاهاً به عنوان واحدهای دریافت، معرفی میشوند.
این روند، جزء الزامات سامانههای جریانپرداز است یعنی باید بتوانیم در یک سامانه جریانپرداز به راحتی یک خط پردازش داده ایجاد کنیم. البته گاهی اوقات، این خط تولید یا خط پردازش داده توسط سامانههای پیامرسان مانند کافکا که یک صف توزیعشده است پیادهسازی میشود.
زمان دریافت / زمان پردازش
در بحث پردازش داده، ما دو زمان مختلف در رابطه با یک رخداد داریم :
- زمان رخداد : زمانی که یک رخداد در دنیای واقعی اتفاق میفتد که البته زمان دقیق یک رخداد به دلیل تاخیرهایی که در شبکه و رسانههای انتقال وجود دارد، مشخص نیست و ما معمولاً زمانی که رخداد را در سیستم مشاهده میکنیم را به عنوان زمان رخداد در نظر میگیریم .
- زمان پردازش : زمانی که شروع به پردازش یک رخداد میکنیم را زمان پردازش میگوییم. برای تضمین بلادرنگ بودن یک سامانه پردازش جریان، به دنبال حداقل کردن زمان بین رخداد یک اتفاق و پردازش آن هستیم. البته به ازای یک رخداد، زمانهای پردازش مختلفی در خط پردازش داریم که میانگین تاخیر در همه آنها، میتواند معیاری برای مقایسه سیستمها با یکدیگر باشد.
داده های محدود / داده های نامحدود
Akidau و همکارانش سامانه های پردازش جریان را سامانه هایی میدانند که می توانند داده های مداوم و بدون وقفه با هر حجم را پردازش کنند بدون اینکه در کار پردازش این داده های نامحدود، خلل و وقفهای حاصل شود. این تعریف در مقابل داده های ذخیره شده و با حجم مشخص است که سامانه های کلان داده مانند هدوپ با آنها سروکار دارند و به پردازش زمان مند یا انبوه هم معروف هستند.
پنجره های پردازش
از آنجا که دادههای تولید شده در سامانه های جریان پرداز نامحدود هستند، برای مقاصد تحلیلی و پردازشی بلادرنگ در زمان دریافت داده هم گاهی نیاز به دسته بندی داده ها (یکساعت گذشته، روزگذشته، کاربر فعلی و مانند آن) که معمولاً هم براساس زمان صورت میگیرد، داریم.
از طرفی، با وجود مشکلات ذاتی سیستم های توزیع شده که باعث تاخیر دریافت داده ها میگردد، اغلب نیاز داریم که تصمیمگیری های فعلی خود را کمی به تعویق بیندازیم تا مطمئن شویم همه داده ها در یک بازه خاص را حتماً دریافت کرده ایم. این نیاز به دسته بندی داده ها و پردازش بر اساس آن، باعث بوجود آمدن مفهوم پنجره های پردازش شده است. منظور از پنجره، بازه ای از زمان است که قرار است پردازش و تحلیل ما روی دادههای آن بازه صورت گیرد.
با این توضیح برای بسیاری از سیستمها که علاوه بر بررسی تک تک رخدادها، به گروه بندی داده ها هم در زمان دریافت داده ها نیاز دارند، سه نوع پنجره پردازشی خواهیم داشت (منبع) :
- پنجره ثابت : در این سیستمها یک پنجره ثابت زمانی برای تحلیل و پردازش دادهها تعریف میشود. در یک سامانه با پنجره ثابت یک دقیقهای، دادههای دریافت شده در یک دقیقه را جمعآوری کرده و پس از اطمینان از اینکه دادهای در این بازه از قلم نیفتاده است، به تحلیل دادههای این یک دقیقه می پردازیم.
- پنجره لغزان : در این سیستمها، پنجرههای پردازشی ما با همدیگر همپوشانی دارند. مثلاً اگر معیار ما بررسی دادهها در هر سه دقیقه باشد، از الان تا سه دقیقه قبل یک بازه، از دقیقه بعدی تا دو دقیقه قبل یک بازه، از دودقیقه بعد تا یک دقیقه قبل هم یک بازه ما را تشکیل میدهند که هر بازه، دو دقیقه همپوشانی با بازههای قبلی دارد. این امر باعث دقت بیشتر نتایج ما خواهد شد و از طرفی هم دادههایی که ممکن است با تاخیر وارد شوند را به نحوی لحاظ میکند.
- پنجره جلسه کاری : در این نوع از پردازش، دسته بندی براساس رخدادهای خاص صورت میگیرد. معمولاً پنجره جلسه کاری، به داده های دریافت شده بین رخداد لاگین (ورود یک کاربر) به سیستم تا رخداد خروج او از سیستم که به آن جلسه یا نشست کاری هم میگوئیم، می پردازد.
گارانتی تحویل
یکی از دیگر از مفاهیم اصلی که در حوزه پردازش جریان با آن مواجه هستیم، نحوه دریافت رخدادها و تحویل آن به سامانه جریان پرداز است به گونه ای که بتوانیم تضمین کنیم هر رخدادی که در دنیای واقع رخ داده است، حتما مورد پردازش قرار خواهد گرفت. سه حالت مختلف برای این موضوع میتوان در نظر گرفت :
- دقیقاً یکبار : در این حالت، سامانه تضمین میکند که هر رخداد دقیقاً یکبار پردازش خواهد شد حتی اگر خطایی در سیستم رخ دهد و باعث کارنکردن آن برای لحظاتی شود یا مجبور به بازیابی داده های پشتیبان شویم .
- حداقل یکبار : در این حالت داده ها ممکن است به بیش از یک گره محاسباتی ارسال شوند و تضمین می شود که حداقل یک بار هر داده، پردازش خواهد شد.
- بدون تضمین پردازش : ممکن است در لحظاتی از کار، سیستم دچار مشکل شده و برخی رخدادها اصلاً پردازش نشوند. برای حوزههایی مثل دوربینهای نظارتی این چند لحظه، ممکن است چندان اهمیت نداشته باشد.
در ادامه، به معرفی معماریهای موجود در طراحی سامانههای جریان پرداز و بیان معایب و مزایای هر یک خواهیم پرداخت . با ما همراه باشید و نظرات خود را حتما با ما مطرح کنید.
مثل همیشه کامل و عالی بود ممنون
بسیار ممنون واقعا عالی بود
منتهی یک موضوع اینکه به نظرم باید یک سری واژه ها و عبارات که هنوز ترجمه فارسیش خیلی جا نیفتاده و مرسوم نیست، اگر قراره ک ترجمه بشوند، اصل عبارت به انگلیسی هم در کنارش یا در توضیحاتش آورده بشه که مخاطب بدونه باید چطور به زبان اصلی سرچ کنه و مطلب بیشتری رو مطالعه کنه. بعنوان مثال عبارت “سامانه های جریان پرداز” …
با سلام
ممنونم از اینکه وقت گذاشتید و این نکته مفید را گفتید . بله حق باشماست و سعی خواهم کرد، از این پس، تا حد امکان این موضوع را رعایت کنم.
سلام ، ببخشید در عکس فوق ، عبارات داخل عکس ، مثل kafka چیه ؟
ممنون از دقت نظرتون. شکل که بیشتر جنبه تزیینی داره اما کاملا با موضوع مقاله مرتبط هست. کافکا یک صف توزیع شده است که امروزه نقش مهمی توی معماری های کلان داده داره (مثلا این مقاله را مرور بفرمایید) بخصوص زمانی که قرار باشد یک خط پردازش داده ایجاد کنید و کارهای مختلفی را روی داده ها انجام بدهید بهترین گزینه شماست.
بقیه مفاهیم هم مثل دیتابیس های ستون محور قبلا در همین سایت معرفی شده اند.