امروزه با زیاد شدن اطلاعات و حجم داده های نرم افزاری، مبحث داده های حجیم (Big Data) و پردازش آن ها به یکی از مباحث روز صنعت نرم افزار تبدیل شده است. مبحث داده های حجیم از بخش های مختلفی مانند: چگونگی استخراج اطلاعات، نحوه ذخیره سازی داده ها، پیش پردازش و پردازش داده ها، تجزیه و تحلیل داده ها و ... تشکیل شده است. در واقع این سیستم ها نیازمندیهای متفاوتی با سایر سیستم ها دارند و به همین دلیل است که معماری به کار برده شده در آن ها نیز با معماری به کار گرفته شده سایر نرم افزار ها متفاوت است. لذا توسعه این نوع نرم افزار ها نیازمند رعایت یک سری چارچوب و قوانین و به طور کلی استفاده از معماری های اصولی می باشد. ما در این تحقیق قصد داریم تا ابتدا به طور کلی با مفهوم داده های حجیم و نحوه پردازش آن ها آشنا شویم. سپس نقش و اهمیت معماری نرم افزار در نرم افزارهایی که وظیفه شان پردازش این اطلاعات و داده های حجیم است را بررسی کرده و نهایتا معماری های موجود در این زمینه را طبقه بندی خواهیم کرد.
کلمات کلیدی: معماری نرم افزار، داده های حجیم، پردازش داده، الگوی طراحی
در این بخش قصد داریم تا به طور کلی با مفاهیم داده های حجیم و نحوه پردازش آن ها آشنا شویم. امروزه در دنیای دیجیتال پیرامون ما، در یک مدت زمان کوتاه، حجم بسیار زیادی داده تولید و ذخیره شده است. این رشد سریع حجم داده ها، چالش های زیادی را ایجاد کرده است. در ادامه این فصل با مفهوم داده های حجیم و ویژگی آنان و همچنین روش هایی که برای پردازش آن ها وجود دارد آشنا خواهیم شد.
داده های حجیم تعاریف مختلف و گوناگونی دارد. اما یک تعریف مناسب برای داده های حجیم که در مرجع [15] ذکر شده است به شرح زیر می باشد:
داده های حجیم داده هایی هستند که بیش از اندازه بزرگ و پیچیده هستند و نمی توان با روش های سنتی پردازش داده آن ها را پردازش کرد.
همچنین بسیاری از دانشمندان داده و مراجع، از جمله مرجع [12]، سه ویژگی: حجم، سرعت و تنوع را به داده های حجیم نسبت می دهند:
برای پردازش و استخراج دانش از داده های حجیم، مدل ها، برنامه ها، نرم افزارها، سخت افزارها و فناوری های مختلفی طراحی و پیشنهاد شده است. در مرجع [14] پردازش داده های حجیم به این صورت تعریف شده است:
به طور کلی پردازش داده های حجیم، شامل فناوری ها و مدل های برنامه نویسی ای می باشد که اطلاعات مفید را داده های حجیم استخراج کرده و به فرآیند تصمیم گیری کمک می کنند.
در واقع پردازش داده به معنی استخراج اطلاعات مفید (Information) از داده های خام (raw data) می باشد.
آن چه باید به آن توجه کرد این است که روش های پردازش داده های حجیم با روش های معمول پردازش داده تفاوت دارد و چالش های زیادی دارد، چرا که همانطور که در فصل قبل دیدیم، داده های حجیم ویژگی هایی دارد که آن را از سایر داده ها متمایز می کند. مثلا ممکن است فرمت داده ها با یکدیگر کاملا متفاوت باشد، در این صورت نمی توان صرفا به استفاده از یک روش بسنده کرد. لذا همانطور که در مرجع [16] بیان شده است، پردازش داده های حجیم به طور کلی شامل مراحل و قدم های زیر می شود: (سه گام نخست به ETL نیز معروف هستند)
استخراج داده: اولین گام در پردازش داده های حجیم استخراج آنهاست. داده های حجیم از منابع مختلف و گوناگونی استخراج می شوند که فرمت های مختلفی نیز دارند. این منابع می توانند انواع وبسایت یا اپلیکیشن یا پایگاه داده یا ... باشند.
تبدیل داده: دومین گام در پردازش داده های حجیم تبدیل داده های استخراج شده به فرمت مورد نظر است. در این گام داده ها ضمت حفظ مفهوم خود، به فرمت و ساختار مورد نظر تغییر می یابند.
بارگذاری داده: سومین گام در پردازش داده های بارگذاری داده ها در یک مرکز جهت انجام مراحل بعدی می باشد. داده هایی که در مراحل قبل استخراج شدند و فرمتشان تغییر کرد، حال در یک مکان مشخص (مانند پایگاه داده) ذخیره و بارگذاری می شوند.
مصور سازی و تحلیل داده: چهارمین گام در پردازش داده های حجیم مصورسازی این داده هاست. به کمک ابزارهای هوش تجاری می توان یک دید کلی از داده ها و فرآیندهای کسب و کار که باعث تغییر داده ها می شوند به دست آورد. همچنین به کمک ابزار های هوش تجاری (مانند Power BI) می توان پیش بینی های مختلفی از کسب و کار انجام داد و تحلیل های گوناگونی انجام داد و تصمیمات مختلفی گرفت.
استفاده از روش های یادگیری ماشین: تنها بدست آوردن یک دید از کسب و کار و داده ها کافی نیست و ما باید بتوانیم نسبت به ورودی های جدید نیز واکنش نشان بدهیم. الگوریتم های یادگری ماشین علاوه بر اینکه خودشان ورودی های جدید را نیز تحلیل و طبقه بندی می کنند، سرعت بسیار بالایی نیز دارند و می توان حجم زیادی از داده ها را به کمک آن ها تحلیل کرد. مفاهیمی مانند یادگیری عمیق (Deep Learning)، یادگیری فعال (Active Learning)، یادگیری برخط (Online Learning) و ... در این حوزه قرار می گیرند.
در بخش بعدی ابتدا اهمیت و لزوم استفاده از معماری نرم افزار را بیان کرده و پس از آن به طبقه بندی معماری ها و الگوریتم های پردازش داده های حجیم خواهیم پرداخت.
در این بخش قصد داریم تا با ضرورت استفاده از معماری نرم افزار در فرآیند پردازش داده های آشنا شویم. به طور کلی استفاده از معماری و الگوریتم های نوین نرم افزاری باعث افزایش درک اشخاص از نرم افزار و بهبود ویژگی های کیفی (مانند مقیاس پذیری، قابلیت استفاده مجدد قابلیت تغییر و ...) می شود. اما همانطور که دیدیم فرآیند پردازش داده های حجیم یک فرآیند سنگین و پیچیده است. به طور کلی دلایل زیر را می توان از اهمیت های استفاده از الگو های طراحی و معماری نرم افزار در فرآیند پردازش داده های حجیم بیان کرد:
1- افزایش سرعت: یکی از مهم ترین فاکتور هایی که در فرآیند پردازش داده باید به آن اشاره کرد سرعت است. از آنجایی که حجم داده هایی که قرار است پردازش شوند بسیار زیاد است، اگر بخواهیم از روش های سنتی پردازش داده استفاده کنیم زمان زیادی را از دست خواهیم داد. استفاده از الگو ها و معماری های نوین این امکان را فراهم می کند تا این فرآیند سریع تر انجام شود.
2- بهبود نتیجه: بسیاری از الگو ها و معماری ها برای رسیدن به نتیجه بهتر ابداع شده اند. در بسیاری از مواقع این الگو ها و معماری های نرم افزاری جدید بوده اند که باعث شده اند تا بتوانیم به هدف و نتیجه نهایی مطلوب خود برسیم.
3- افزایش مقیاس پذیری: استفاده از الگو های معماری باعث بهبود ویژگی های غیر عملکردی نرم افزار می شوند که مقیاس پذیری (Scalability) یکی از این ویژگی ها است. در حوزه داده های حجیم، حجم داده ها مدام در حال بیشتر شدن است و منابع تولید کننده آن ها نیز رو به افزایش هستند. همچنین اهداف ما نیز روز به روز تکامل می یابند. داشتن یک معماری خوب می تواند به مقیاس پذیری فرآیند پردازش این داده های حجیم کمک شایاین بکند.
4- و ...
فواید داشتن یک معماری نرم افزار خوب صرفا به موارد بالا محدود نمی شود. در این بخش سعی کردیم تا تعداد کمی از این فواید را ببینیم تا با ضرورت استفاده از معماری نرم افزار در فرآیند پردازش داده آشنا بشویم.
برای پردازش داده های حجیم، الگوهای طراحی، روش ها، مدل ها و الگوریتم های گوناگونی عنوان شده اند که می توان از دید معماری نرم افزار به آن ها نگاه کرد و آن ها را به عنوان زیرشاخه ای از معماری نرم افزار دانست. ما در این بخش ابتدا قصد داریم تا تعدادی از معماری نرم افزار های معروف در حوزه پردازش داده های حجیم را معرفی کرده و سپس در ادامه فصل آن ها را طبقه بندی خواهیم کرد.
هنگامی که با حجم زیادی از داده ها مواجه هستیم، دو رویکرد کلی ETL و ELT برای آماده کردن این داده ها برای پردازش های بعدی وجود دارد.
اولین رویکرد که به ETL معروف است، ابتدا داده ها را جمع آوری کرده، سپس فرمت ها و ساختار های داده را تغییر کرده و آن ها را تمیز کرده و در نهایت آن ها را در یک مکان نهایی که به آن Data warehouse می گویند بارگذاری می کند تا آماده پردازش و تحلیل های بعدی شوند.
دومین رویکرد به ELT معروف است و فرق آن با ETL در این است که ابتدا تمام داده ها با تمام فرمت ها و ساختار ها در یک مکان به نام Data Lake بارگذاری می شوند. سپس هر موقع نیاز به پردازش و تخلیل داشتیم، باید داده های مورد نظر را از این دریاچه داده برداشته و پردازش و تحلیل را روی آن انجام می دهیم.
در واقع تفاوت ETL با ELT در این است که در ETL ابتدا داده ها را برای پردازش آماده می کنیم، اما در ELT هر موقع نیاز به پردازش داشتیم اقدام به آماده کردن داده ها می کنیم.
یکی از ابزارهای معروفی که هم از ETL و هم از ELT پشتیبانی می کند و امکان پردازش داده ها را نیز در خود دارد ابزار SnowFlake است. معماری SnowFlake به شرح زیر است:
به کمک این ابزار می توان داده ها را جمع آوری کرد و انواع تحلیل های هوش تجاری را در سریع ترین زمان ممکن (حتی سریع تر از SQL) انجام داد.
یکی دیگر از ابزارهای پرکاربرد و معروف این حوزه Azure Data lake می باشد که این ابزار هم امکان ذخیره سازی داده های حجیم و پردازش آن ها را فراهم کرده است. این ابزار از U-SQL که ترکیبی از SQL و C# است برای پردازش داده های استفاده می کند.
مپ ردیوس در واقع یک مدل برنامه نویسی است که در سال 2004 توسط گوگل معرفی شده است [11]. این الگوریتم داده ها را به صورت توزیع شده پردازش می کند و از دو عمل مهم مپ (Map) و ردیوس (Reduce) تشکیل شده است.
فرض کنید می خواهیم در یک متن بلند، تعداد تکرار هر کلمه را پیدا کنیم و کلمات بسیار زیادی در این متن وجود دارد. ما اگر بخواهیم به روش سنتی و غیر توزیع شده این کار را انجام بدهیم، زمان و منابع زیادی هدر می رود. ایده اصلی الگوریتم مپ ردیوس این است که این پردازش به صورت توزیع شده و موازی انجام شود. ابتدا این متن را به چند متن کوچک تر تقسیم می کنیم (Split). سپس در هر قسمت به صورت مجزا تعداد تکرار هر کلمه در متن کوچک شده را به صورت (key, value) که key خود کلمه و value تعداد تکرار آن است محاسبه می کنیم (Map). در گام بعدی نتایج را مرتب سازی می کنیم تا برای جمع زدن آماده بشوند (Shuffle). در نهایت نیز نتایجی که از هر قسمت به دست آمده بود با یکدیگر جمع می شوند تا نتیجه نهایی که تعداد تکرار هر کلمه در متن اصلی است به دست بیاید (Reduce).
مثال فوق یک مثال ساده از این الگوریتم بود و امروزه از این الگوریتم در بسیاری از پردازش های سنگین داده های حجیم استفاده می شود. مزیت عمده ای که این الگوریتم دارد این است که امکان پردازش به صورت توزیع شده را فراهم می کند. در روش سنتی تمام پردازش ها بر عهده یک پردازنده و برنامه واحد است، در صورتی که به کمک الگوریتم مپ ردیوس می توان این پردازش را بین پردازنده ها و ماشین های مختلف توزیع کرد و مقیاس پذیری را افزایش داد [8].
ابزار آپاچی هدوپ (Apache Hadoop) پر استفاده ترین پیاده سازی منبع باز از الگوریتم مپ ردیوس است [10] که کلیات آن را در شکل زیر میبینیم:
به طور کلی، معماری هدوپ امکان ذخیره سازی و پردازش و تحلیل داده ها را فراهم می کند. سیستم توزیع شده فایل هدوپ یا همان Hadoop distributed file system یا به اختصار HDFS، سیستم فایل هدوپ است که داده ها را مدیریت کرده و امکان دسترسی به داده ها را فراهم میکند. در معماری هدوپ، مپ ردیوس به عنوان پردازش کننده داده های خوشه ها به صورت توزیع شده عمل می کند که کاربرد آن را با ذکر مثال دیدیم. فناوری YARN نیز در نسخه جدید هدوپ اضافه شده که وظیفه مدیریت منابع را بر عهده گرفته است.
گراف جهت دار بدون دور (Directed Acyclic Graph) یا به اختصار DAG، یک پارادایم برای تحلیل و پردازش داده های پیچیده می باشد و اغلب به صورت توزیع شده و بر بستر ابر (Cloud) عمل می کند. DAG یک نوع گراف است که هر گره آن نشان دهنده یک Task است که در آن دور وجود ندارد:
معماری DAG نشان گر کلیات فرآیند پردازش داده های ورودی می باشد. در هر گره که نشان گر یک Task به خصوص است، یک سری پردازش خاص روی داده ها انجام می گیرد. این گراف روند منطقی پردازش داده ورودی را به تصویر میکشد. با پیاده سازی این گراف، امکان پردازش موازی (parallel) فراهم میشود و چندین Task می توانند به صورت همزمان با هم انجام شوند. گرچه ممکن است یک Task برای اجرا نیاز به خروجی یک Task دیگر داشته باشد که در این صورت باید منتظر آن بماند.
ابزار Apache Spark یک ابزار معروف برای پردازش داده های حجیم با سرعت بالا است که قابلیت های زیادی مانند: بهینه سازی کوئری و سیستم کشینگ درون حافظه و ... دارد. این ابزار در گردش کار (work flow) خود از مفهوم DAG کمک گرفته است، به این صورت که راس ها نشان گر سیستم های توزیع شده انعطاف پذیر (RDD) و یال ها همان عملیاتی هستند که قرار است روی RDD ها انجام بشوند. سایت معروف نتفلیکس از این ابزار برای درک سلیقه مخاطبان ارائه پیشنهاد به آنان استفاده می کند [18].
ابزار Apache Storm یکی دیگر از این ابزار ها است که از DAG استفاده می کند و سرعت بالایی نیز دارد. این بزار تفاوت های جزیی با Apache spark دارد، مثلا Apache storm محاسبات Task ها را موازی سازی می کند، در حالی که Apache Spark محاسبات داده ها را موازی سازی می کند.
روش پردازش دسته زمانی به کار می آید که حجم زیادی از داده هایی داشته باشیم که تقریبا تکراری هستند و مفهوم یکسان اما مقادیر متفاوتی دارند. در این روش داده ها به صورت دوره ای (Periodic) مثلا هر روز یا هر هفته یا هر ماه و بدون دخالت کاربر توسط سیستم پردازش می شوند.
به عنوان مثال انتقال وجه پایا را در نظر بگیرید. در این نوع انتقال وجه پول همان لحظه به حساب مبدا واریز نمی شود و در ساعت های خاص روز (مثلا ساعت 4 و 10 و 14 و 18) به حساب مقصد واریز می شوند. در بین این ساعت ها مشتریان در حال انتقال وجه هستند و فرم های پایا را پر می کنند، اما سیستم مرکزی بانک در همان لحظه به آنان پاسخ نمی دهد، بلکه در ساعت های خاص روز، هر آن چه انتقال پایا که ثبت شده و پردازش نشده را پردازش کرده و در صورت تایید وجه را به حساب مقصد واریز می کند. این پردازش در ساعات خاص روز اتفاق می افتد و می تواند شامل عملیات مختلفی مانند برسی صحت مبلغ یا صحت اسناد عدم پولشویی یا ... باشد.
یک مثال دیگر ارسال مرسولات پستی می باشد. یک فروشگاه آنلاین بزرگ را در نظر بگیرید که روزانه تعداد زیادی سفارش دارد. طبیعتا هر سفارش پس از ثبت باید توسط پست تحویل مشتری گردد. اگر ادمین سیستم بخواهد بلافاصله بعد از هر سفارش، کالای مورد نظر مشتری را از انبار بیرون بیاورد و به اداره پست برود و آن را برای مشتری ارسال کند، در طی روز باید به تعداد سفارشات به اداره پست مراجعه کند که باعث اتلاف وقت و انرژی و حتی منابع مالی زیادی می شود. اما به کمک پردازش دسته ای، ادمین سیستم هر روز در یک ساعت خاص (مثلا هر روز 9 صبح) لیست سفارشات روز گذشته را پردازش کرده و تمام کالا ها را از انبار بیرون آورده و هنگامی که به اداره پست مراجعه می کند به جای ارسال 1 بسته، تمام آن بسته را برای مقصد های مختلف مشتریان ارسال می کند.
مزایای عمده این روش صرفه جویی در منابع و افزایش توانایی نظارت می باشند. از معایب این روش می توان به احتمال افزایش تعداد خطا (مثلا فرض کنید سیستم پست در آن ساعات دچار اشکال باشد در نتیجه هیچ کدام از سفارشات ارسال نخواهند شد) و افزایش کلی زمان پردازش (در مثال اول مشتری باید چند ساعت منتظر بماند تا وجه به حسابش واریز شود) اشاره کرد.
در این مقاله سعی کردیم تا معماری های معروف در حوزه پردازش داده های حجیم را بیان کنیم. واضح است که مواردی که در این مقاله ذکر شدند تمام معماری های موجود نیستند و تعداد بسیار زیادی معماری برای پردازش داده های حجیم وجود دارد. اگر بخواهیم یک طبقه بندی از معماری های نرم افزار در حوزه پردازش داده های حجیم داشته باشیم، به شکل زیر می رسیم:
همانطور که در شکل فوق نیز مشخص شده است، معماری نرم افزار می تواند شامل سیستم، مدل، الگوریتم، روش، الگوهای معماری و الگوهای طراحی و ... بشود. ما در این مقاله سعی کردیم تا روش های معروف موجود را توضیح داده و در یکی از 4 دسته بندی: سیستم، مدل، الگوریتم و روش قرار بدهیم. طبیعتا سیستم درشت دانه تر از سایر دسته ها می باشد. مفاهیم مرتبط با هر دسته بندی با رنگ نارنجی و فناوری های موجود در آخرین سط و با رنگ خاکستری نشان داده شده اند.
این مقاله یک مرور کلی بر معماری ها و فناوری های نوین در حوزه پردازش داده های حجیم بود و در آینده می توان روش های مرتبط با هوش مصنوعی در پردازش داده های حجیم را نیز مورد بحث و برسی قرار داد.
«این مطلب، بخشی از تمرینهای درس معماری نرمافزار در دانشگاه شهیدبهشتی است.»
منابع
[1] Silvestri, Stefano, et al. "A big data architecture for the extraction and analysis of EHR data." 2019 IEEE World Congress on Services (SERVICES). Vol. 2642. IEEE, 2019.
[2] Arooj, Ansif, et al. "Big data processing and analysis in internet of vehicles: architecture, taxonomy, and open research challenges." Archives of Computational Methods in Engineering 29.2 (2022): 793-829.
[3] Kumar, S. Rakesh, et al. "Medical big data mining and processing in e-healthcare." Internet of things in biomedical engineering. Academic Press, 2019. 323-339.
[4] Habeeb, Riyaz Ahamed Ariyaluran, et al. "Real-time big data processing for anomaly detection: A survey." International Journal of Information Management 45 (2019): 289-307.
[5] Shakhovska, Natalya. "The method of Big data processing." 2017 12th international scientific and technical conference on computer sciences and information technologies (CSIT). Vol. 1. IEEE, 2017.
[6] Qiu, Junfei, et al. "A survey of machine learning for big data processing." EURASIP Journal on Advances in Signal Processing 2016 (2016): 1-16.
[7] Boranbayev, Seilkhan, et al. "Method of processing big data." Information Technology-New Generations: 15th International Conference on Information Technology. Springer International Publishing, 2018.
[8] Sharma, Diksha, Gagan Pabby, and Neeraj Kumar. "Challenges involved in big data processing & methods to solve big data processing problems." IJRASET 5.8 (2017): 841-844.
[9] Lehmann, Claude, et al. "Big Data architecture for intelligent maintenance: a focus on query processing and machine learning algorithms." Journal of Big Data 7.1 (2020): 1-26.
[10] Belcastro, Loris, Fabrizio Marozzo, and Domenico Talia. "Programming models and systems for big data analysis." International Journal of Parallel, Emergent and Distributed Systems 34.6 (2019): 632-652.
[11] Suvarnamukhi, B., and M. Seshashayee. "Big data concepts and techniques in data processing." International Journal of Computer Sciences and Engineering 6.10 (2018): 712-714.
[12] https://www.optalitix.com/guides/what-are-the-3-vs-of-big-data/#:~:text=These%20are%20the%203%20V's,%3A%20volume%2C%20velocity%20and%20variety.
[13] https://www.projectpro.io/article/how-big-data-analysis-helped-increase-walmarts-sales-turnover/109#:~:text=American%20multinational%20retail%20giant%20Walmart,text%20or%20one%20quadrillion%20bytes.
[15] https://en.wikipedia.org/wiki/Big_data
[16] https://hevodata.com/learn/big-data-processing/#Stages-in-the-Big-Data-Processing
[17] https://data-flair.training/blogs/hadoop-architecture
[19] https://k21academy.com/microsoft-azure/data-engineer/batch-processing-vs-stream-processing/
[20] https://people.cs.rutgers.edu