داده‌های جریانیمعماری های اطلاعاتیمفاهیم پایه

نگاهی به مفاهیم و ابزار جریان‌پردازی

در چند سال اخیر و به مدد رشد منابع تولید کننده داده، سمت و سوی فناوری‌های پردازش داده از کلان‌داده به داده‌های جریانی (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‌ هم اشاره به زمان تولید آن دارد.

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

شکل  2- یک نمونه از داده های جریانی

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

در ادامه برخی از مفاهیم پایه­‌ای پردازش جریان را با هم بررسی خواهیم کرد.

واحدهای پردازش / واحدهای دریافت

در یک سامانه جریان پرداز به دلیل پردازش­‌های گوناگونی که معمولاً روی داده‌­ها صورت می­گیرد و برای اینکه بتوانیم کارها را در یک شبکه یا کلاستر از واحدهای محاسباتی (Processing Nodes) به راحتی توزیع کنیم، هر بخش کوچک و مجزا از پردازشی که قرار است روی داده‌­ها صورت بگیرد را به یک واحد محاسباتی می­سپاریم. منظور از واحد محاسباتی یا واحد پردازش هم یک پردازنده است که می­تواند عملیاتی را روی داده انجام بدهد و نتیجه را در جایی ذخیره کند.

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

شکل ۳ – ساختار کلی سامانه های پردازش جریان

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

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

زمان دریافت / زمان پردازش

در بحث پردازش داده، ما دو زمان مختلف در رابطه با یک رخداد داریم :

  • زمان رخداد : زمانی که یک رخداد در دنیای واقعی اتفاق میفتد که البته زمان دقیق یک رخداد به دلیل تاخیرهایی که در شبکه و رسانه­‌های انتقال وجود دارد، مشخص نیست و ما معمولاً زمانی که رخداد را در سیستم مشاهده می­کنیم را به عنوان زمان رخداد در نظر می­گیریم .
  • زمان پردازش : زمانی که شروع به پردازش یک رخداد می­کنیم را زمان پردازش می­گوییم. برای تضمین بلادرنگ بودن یک سامانه پردازش جریان، به دنبال حداقل کردن زمان بین رخداد یک اتفاق و پردازش آن هستیم. البته به ازای یک رخداد، زمان­‌های پردازش مختلفی در خط پردازش داریم که میانگین تاخیر در همه آنها، می­تواند معیاری برای مقایسه سیستم­ها با یکدیگر باشد.
شکل  4 – زمان پردازش / زمان رخداد

داده­ های محدود / داده­ های نامحدود

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

پنجره­ های پردازش

از آنجا که داده­های تولید شده در سامانه­ های جریان­ پرداز نامحدود هستند، برای مقاصد تحلیلی و پردازشی بلادرنگ در زمان دریافت داده­ هم گاهی نیاز به دسته­ بندی داده ­ها (یکساعت گذشته، روزگذشته، کاربر فعلی و مانند آن) که معمولاً هم براساس زمان صورت می­گیرد، داریم.

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

با این توضیح برای بسیاری از سیستم­ها که علاوه بر بررسی تک تک رخدادها، به گروه ­بندی داده ­ها هم در زمان دریافت داده­ ها نیاز دارند، سه نوع پنجره پردازشی خواهیم داشت (منبع) :

  • پنجره­ ثابت : در این سیستم­ها یک پنجره ثابت زمانی برای تحلیل و پردازش داده‌­ها تعریف می­شود. در یک سامانه با پنجره ثابت یک دقیقه­‌ای، داده­‌های دریافت شده در یک دقیقه را جمع‌­آوری کرده و پس از اطمینان از اینکه داده­ای در این بازه از قلم نیفتاده است، به تحلیل داده­‌های این یک دقیقه می پردازیم.
  • پنجره لغزان : در این سیستم­ها، پنجره‌­های پردازشی ما با همدیگر هم­پوشانی دارند. مثلاً اگر معیار ما بررسی داده­‌ها در هر سه دقیقه باشد، از الان تا سه دقیقه قبل یک بازه، از دقیقه بعدی تا دو دقیقه قبل یک بازه، از دودقیقه بعد تا یک دقیقه قبل هم یک بازه ما را تشکیل می­دهند که هر بازه، دو دقیقه هم­پوشانی با بازه­‌های قبلی دارد. این امر باعث دقت بیشتر نتایج ما خواهد شد و از طرفی هم داده­‌هایی که ممکن است با تاخیر وارد شوند را به نحوی لحاظ می­کند.
شکل  5- پنجره های مختلف پردازش جریان 
  • پنجره جلسه کاری : در این نوع از پردازش، دسته­ بندی براساس رخدادهای خاص صورت می­گیرد. معمولاً پنجره جلسه کاری، به داده­ های دریافت شده بین رخداد لاگین (ورود یک کاربر) به سیستم تا رخداد خروج او از سیستم که به آن جلسه یا نشست کاری هم می­گوئیم، می­ پردازد.

گارانتی تحویل

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

  1. دقیقاً یک­بار : در این حالت، سامانه تضمین می­کند که هر رخداد دقیقاً یکبار پردازش خواهد شد حتی اگر خطایی در سیستم رخ دهد و باعث کارنکردن آن برای لحظاتی شود یا مجبور به بازیابی داده ­های پشتیبان شویم .
  2. حداقل یک­بار : در این حالت داده­ ها ممکن است به بیش از یک گره محاسباتی ارسال شوند و تضمین می شود که حداقل یک بار هر داده، پردازش خواهد شد.
  3. بدون تضمین پردازش : ممکن است در لحظاتی از کار، سیستم دچار مشکل شده و برخی رخدادها اصلاً پردازش نشوند. برای حوزه­هایی مثل دوربین­های نظارتی این چند لحظه، ممکن است چندان اهمیت نداشته باشد.

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

مجتبی بنائی

دانشجوی دکترای نرم‌افزار دانشگاه تهران (yun.ir/smbanaie)، مدرس دانشگاه و فعال در حوزه توسعه نرم‌افزار و مهندسی داده که تمرکز کاری خود را در چند سال اخیر بر روی مطالعه و تحقیق در حوزه کلان‌داده و زیرساخت‌های پردازش داده و تولید محتوای تخصصی و کاربردی به زبان فارسی و انتشار آنها در سایت مهندسی داده گذاشته است. مدیریت پروژه‌های نرم‌افزاری و طراحی سامانه‌های مقیاس‌پذیر اطلاعاتی از دیگر فعالیتهای صورت گرفته ایشان در چند سال گذشته است.

۵ دیدگاه

  1. بسیار ممنون واقعا عالی بود

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

     

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

  2. سلام ، ببخشید در عکس فوق ، عبارات داخل عکس ، مثل kafka چیه ؟

    1. ممنون از دقت نظرتون. شکل که بیشتر جنبه تزیینی داره اما کاملا با موضوع مقاله مرتبط هست. کافکا یک صف توزیع شده است که امروزه نقش مهمی توی معماری های کلان داده داره (مثلا این مقاله را مرور بفرمایید) بخصوص زمانی که قرار باشد یک خط پردازش داده ایجاد کنید و کارهای مختلفی را روی داده ها انجام بدهید بهترین گزینه شماست.
      بقیه مفاهیم هم مثل دیتابیس های ستون محور قبلا در همین سایت معرفی شده اند.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

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

دکمه بازگشت به بالا