روش درست مدیریت و کار کرد با Big data یک شبکه اجتماعی به چه صورت می باشد؟

مقدمه

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

قبل از هرچی سعی کردم ترجمه ای رو از این مبحث رو از ویکی پدیا پیدا کنم :

«کلان داده یا طبق مصوبه فرهنگستان مه داده[۱] دارایی‌های داده‌ای‌اند بسیار انبوه، پرشتاب و/یا گوناگون که نیاز به روش‌های پردازشی تازه‌ای دارند تا تصمیم‌گیری، بینش تازه و بهینگی پردازش پیشرفته را فراهم آورند»[۲]. کلان داده یا بزرگ‌ داده‌ها مسیر حرکت کسب و کار و فرآیند چرخش کار در سازمان‌ها را مشخص می‌کنند. در بزرگ‌داده با داده‌های متمایز و بزرگ که دائماً از لحاظ حجم، نرخ تولید داده و تنوع در حال تغییر هستند سروکار داریم.[۳]

منبع ویکی پدیا


طرح مسئله

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

فکر کنید حتی کوچکترین رتفار یک فرد نیز مورد محاسبه لحظه ای قرار می گیرد و به بانکی بسیار بزرگ انتقال داده می شود

در پست قبلی در انجمن ( فریم ورک Play ) بحثی به شرح بالا مطرح شد که در آن بیان شد اگر یک جامعه مجازی داشتیم که ۸ ترابایت با ملیون کاربر و درخواست داشتیم چطور باید با اون رفتار می کردیم ؟

راه حل پیشنهادی

دید محدود بنده در مبحث Big data :
  1. من در اینجا سعی می کردم از دیتابیس هایی که قبلا در انجمن معرفی شده برای داده های زیاد و برخی از تکنولوژی ها تا در حد توانم استفاده کنم
  2. در مرحله بعدی سعی می کنم بیام داده ها رو تا حد ممکن تفکیک کنم . به عنوان مثال بخش یوزر با بخش فروش با بخش تیکت دهی کاملا تفکیک پیدا کند و هر کدام جدا شود ( دیدگاه میکروسرویسی )
  3. با این رفتار من فکر می کنم برای خواندن آخرین مطالب وب سایت دیگر دیتابیس بخش فروش درگیر نمی شود
  4. تا جایی که منابع من می کشد سعی می کنم برخی از موارد پر بازدید را کش کنم تا درخواست به دیتابیس کم شود
  5. اگر داده ها نیاز به پردازش دارد برای داشبرد هایی مدیریتی اطلاعات در جای دیگر پردازش بشود اگر جواب نیاز نیست سریع بیاید مثل دیتاور هاست ها

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


تمام سواد و فکر کنم در همین حد می باشد . حال من همیشه در مطالب می بنیم که این موارد ربطی به زبان برنامه نویسی خاصی ندارد بلکه باید هر زبانی رفتار مناسب را نشان داد.

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

ببخشید این مطالب طولانی بود خواستم کمی خوب ثبت بشه در گوگل

با تشکر

2 پسندیده

قبل از اینکه این بحث باز کنیم بگذارید چند مفهوم و توضیح بدیم
چهار V داده کلان
سیستم های یک یا چند ویژگی زیر داشته باشن به طور کلاسیک big data نامیده میشوند
Volume: حجم داده که از چندین terabyte تا petabyte ها داده گفته میشود

Velocity: سرعت دریافت داده اگر سیستمی دربازه بسیار پایین حجم داده بسیاری میگیره مثلا ۵۰۰ مگ در ثانیه

Variety گوناگونی نوع داده

Veracity مقداره داده درست به نادرست یا noise

نسبت به کاراکتر داده تکنولوژی های که برای کار مطلوب هستند فرق میکنه و نمیشه گفت یک تکنولوژی همه نیاز ها رو جواب میده فقط هر تکنولوژی معاوضه انجام میده

طبقه بندی دیتابیس ها

یک قانون سیستم های توزیع شده وجود داره که بین سه کاراکتر
Consistency همه دیتابیس یک طور داده رو میبینند
Availablity در صورت پایین رفتن یک سرور سیستم پایین نمیره
Partition Tolerance در صورت مشکل ارتباط سرور های دیتابیس سیستم میتونه به کار خود ادامه بده
فقط دو کاراکتر همزمان میشه داشت
Postgresql یک سیستم CP ولی Cassandra
AP

postgresql همیشه یک node برای نوشتن داده داره Master
که به این صورت همیشه همچیز consistent اما با پایین رفتن Master سیستم دیگه available نیست و داده نمیپذیره
cassandra ولی هر نودش میتونه هم داده بخونه هم بنویسه و با پایین رفتن یک نود سیستم پایین نمیره ولی چون هر تغیر باید sync بشه احتمال اینکه داده ها consistent
نباشه وجود داره

3 پسندیده

اول اینکه این بحث خیلی بزرگ هست و اسکیلش در حد چندین و چند کتاب هست.

دوم اینکه اشتباهی که عموما می بینم اینه که big data رو با دیتابیس و این مسائل یکی می بینن در صورتی که اشتباه هست. big data به صورت کلی به مشکلات و راه حل هایی اونها برای سیستم هایی گفته می شه که با دیتای بسیار زیادی سرو کار دارن. حالا چه تولیدش چه نگهداریش چه پردازشش و …

تو همچین سیستم هایی باید به خیلی از نکات توجه داشت. مثلا دیتا به چه صورت و کجاها باید نگهداری بشه. روش پردازش به چه نحوی باید باشه. کش کردن به چه صورت باشه و …

شاید در نگاه اول ساده به نظر بیاد اما خیلی سخت و پیچیده هست.

برای اینکه با مثال جلو بریم پیشنهاد می کنم برای همون کاربردی که مثال زدی رو بازش کنی و بگی فکر می کنی روش درست چیه ؟ ( اگه تو پست رو ادیت کنی و به عنوان صورت مساله بنویسی خیلی عالی میشه )

1 پسندیده

سمیر جان من تیتر رو ویرایش کردم اگر فکر می کنید تیتر مشکلی داره لطفا یک پیشنهاد بدید که فرمایش شما انجام بشه . درست می فرمایید تیتر بسیار بزرگ بوده و ممکنه بحث رو گم کنه

1 پسندیده

منظور من خود پست بود. مثلا صورت مساله رو شرح بده بعد بنویس که از دید خودت چه جوری هندل می کنی

2 پسندیده

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

در پروژه ای که بنده شاهد آن بودم حدود ۸ ترابایت اطلاعات بوده

و همینطور کاربران اطلاعات بسیار زیادی رو در ثانیه تولید می کنند

و این اطلاعات از اعداد گرفته تا متن و همینطور تصاویر و الگوی های گرافیکی می باشد

متاسفانه امکان دارد این داده ها به علت اشتباهات در آن داده های پرت نیز باشد که امکان دارد در آینده استفاده شود یا نشود .

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

با این صحبت شما یعنی ما باید چندین دیتابیس همزمان از نوع های مختلف استفاده کنیم یا منظور شما چیز دیگه ای بوده من بد فهمیدم؟

بازم ممنون .

راستی من می خوام بدونم آیا مسیری که من به صورت محدود پیشنهاد دادم در پست اول آیا درست است یا خیر؟

1 پسندیده

شما هدفه کلی سیستمت چیه
قسمت ها و service های مختلف میتونن بستگی به کاربرد technology های مختلفی استفاده کنند این یکی از مزایای microservice هاست

1 پسندیده

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

من پست اول رو ویرایش کردم و در ۵ مورد از راه حل هام توضیح دادم که من این کارا رو دارم می کنم ولی همیشه برام جالب هست جایی که هر لحظه تمام امکانات ممکن هست درخواست شود چطور نگهداری انجام می شود مخصوصا با محدودیت های هزینه ای و تحریم هایی که ما داریم در داخل با اون دست پنجه نرم می کنیم.

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

ممنون از صبر همه عزیزان واقعیت امر جز تشکر و فشردن یک دکمه کاری از دستمون بر نمی یاد و ما بسیار در این زمینه شرمنده شما هستیم

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

۱. ما دارای شبکه اجتماعی با اطلاعات زیاد کاربری
۲. ما اطلاعات زیادی رو از هواشناسی
۳. اطلاعات زیادی رو از شبکه های اجتماعی معروف
۴. اطلاعات زیادی از پزشکی
۵. اطلاعات زیادی از ورزش روزانه
۶. رفتار روزانه کاربر

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

۱. چه تبلیغاتی نشان داده شود
۲. چه برنامه غذایی پیشنهاد شود
۳. چه محتوایی نشان داده شود

حالا این موارد اضافه بر اینکه ما تمام فعالیت های روزانه را جمع می کنیم و رفتار هارو آنالیز می کنیم و به وسیله مشاور پزشکی می آییم خود مدیریتی را به کاربر یاد می دهیم که چطور برنامه ریزی کند تا به سلامت برسد

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

این اطلاعات در شروع یک نفر هست ولی با جمع َآوری به کل استان و بعد کشور می رسد . حال تصمیمات گروهی گرفته می شود

یعنی من هم آنالیز داده ها را می خواهم هم جمع آوری داده ها و نگهداری و فراخوانیشون به لحظه

2 پسندیده

قسمت های برنامه شما عالی برای کافکا در کناره cassandra

2 پسندیده

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

1 پسندیده

Kafka برای دریافت داده بسیار زیاد در مدت کم بسیار خوبه ظرفیت کافکا با اضافه کردن سرور بالا میره
کافکا داده هارو در topic نگاه میداره هر topic میشه به چندین قسمت تقسیم بشه و هر قسمت Partition در چند نود باشه
بعد سیستم که با یک topic کار دار به topic گوش میده و وقتی داده میاد پروسس میکنه
سیستم که داده رو پروسس میکنه consumer گفته میشه
در مثال شما داده دمای هوا به topic هوا انتشار میشه بعد consumer میخونه تو cassandra ذخیره میکنه
نوع ذخیره در cassandra بسیار مهمه و باید یک کم از مدل کردن داده در کاساندرا آشنایی داشته باشی
هدف در cassandra اینکه داده و جدول ها رو بر اساس نوع query که میخواهی بزنی بسازی

اگر من بودم ID شهر میکردم Partition Key بعد سال ماه روز ساعت میشدن Clustering Key

2 پسندیده

Partition Key در cassandra استفاده میشه که داده رو در cluster پیدا کنی Clustering Key برای اینکه داده که پیدا شده چجوری قسمت بشه

2 پسندیده

حالا شما شاید بپرسی چرا برای همه چیز از کسندرا استفاده نکنیم
و دلیلش اینه که چون داده partition میشه در کسندرا نمیتونی بعد ساخت جدول و کلی داده عوضش کنی پس باید از قبل بدونی چه query میخوای بزنی

در دیتابیس مثل postgresql داده partition نشده و هر نوع query جواب میده و احتمال داره سریع و به صورت بهینه نباشه ولی Cassandra یک نوع query و به صورت عالی جواب میده

2 پسندیده

اینجوری که سام عزیز من از صحبت های بسیار مفید شما متوجه شدم . ما باید مثلا در سیستم هامون مواردی که هر لحظه تغییر نمی کنند رو با دیتابیس های که تغییر می کنند جدا کنیم درسته ؟

حال یک سوال اساسی

آیا Kafka خودش مثل یک میکروسرویس در سرویس های ما محاسبه می شه یا خیر؟ چون من با دیدن تصویر صفحه اول اون در وب سایت آپاچی به این فکر افتادم این کلا خودش یک چیزی هست که ما بقی میکروسرویسش هست . در هسته قرار داره .

1 پسندیده

بله شما باید سعی کنی استفاده از داده رو در مرحله های مختلف نگاه کنی کافکا برای دریافت داده به سرعت بالا کسندرا برای قسمت کردن و query کردن داده با سرعت بالا روی قسمتی از داده hadoop برای ذخیره داده حجم بالا و query های report مانند analytical
که سریع جواب دادن مهم نیست ولی میخواهی روکل داده کار کنی
به هر مرحله stage گفته میشه و به کل مراحل data pipeline

3 پسندیده

Kafka قبلا سمیر توضیح دادن کافکا یک لاگ توزیع شده هست که بین سرویس ها قرار میگیره

2 پسندیده

یه سری نکته که باید اضافه کنم.

۱. همیشه تو سیستم های بزرگی که با big data سرو کار دارن بهتره که یه database of facts داشته باشین که بهترین حالتش یه دیتابیس immutable از log هایی از دیتا و رخداد های سیستم شماست.

۲. از Dual write باید همیشه دوری کنید. Dual write چیزیه که شاید کار ها رو آسون کنه اما اشتباه مهلکی هست. و به این معتاست که شما مثلا یه database of facts داری بعد بیای همون دیتا رو یه جا دیگه هم داشته باشی و یه کدی که جفتش رو آپدیت کنه ـ( بر اساس state خودش ). این باعث می شه به راحتی دیتا ای که دارین inconsistent بشه و دیگه نشه درستش کرد.

۳. به جای Dual write بهتر از change capture یا مفاهیم مشابه استفاده کنین. مثلا Cache و دیتا بیس های موقت میانی رو با استفاده از database of facts آپدیت نگه دارین. برای مثال با استفاده از kafka و kafka connect سرویس هاتون رو به database of facts اضافه کنین.

۴. از Microservice ها دوری کنین. این مساله یه ترندی بوده که کاربردش از دردسرش خیلی کمتر هست.
۵. بهتر بجای یه سری سرویس که با HTTP باهم در ارتباط هستند از یه سری کامپوننت تو سیستمتون استفاده کنین که ورودیشون یا از کاربر هست یا از یه تاپیک kafka و خروجیشون هم یا به کاربر هست یا به یه تاپبک Kafka. اینجوری راحت می تونین data pipeline بسازین.

۶. همه کامپوننت های سیستم باید scalable باشن و ترجیحا stateless.
۷. خیلی بهتر هست که یه Coordinator داشته باشین. مثل Zookeeper اینجوری همون state هر Node و کامپوننت رو می شه رو Zookeeper نگه داشت.

اینا نکاتی بودن که در تکمیل حرف های سام عزیز به ذهنم رسید.
خیلی خیلی پیشنهاد می کنم این ویدئو رو ببینید:

مهمتر از همه اینکه برای این موضوع حتما کتاب های زیر رو باید خوند:

https://www.amazon.com/Big-Data-Principles-practices-scalable/dp/1617290343/

https://www.amazon.com/Designing-Data-Intensive-Applications-Reliable-Maintainable/dp/1449373321/ref=asap_bc?ie=UTF8

4 پسندیده

ممنون از سمیر عزیز بسیار ممنون با دسته بندی خوبی خیلی نکات انتقال پیدا کرد .
فقط در مورد شماره ۴ می شه توضیح بدید. چرا باید دوری کرد یعنی سیستم هایی که میکروسرویسی دارند ارتقاع پیدا می کنند مشکل ایجاد می کنه ؟

چطور می شه بدون میکروسرویس بیاییم هر سرویس رو تفکیک کنیم؟ هر کدوم مستقل هست آیا باید باز هم بره تو یک سیستم یک پارچه ؟

من این مورد رو درک نکردم

در آخر صمیمانه از شما و سام عزیز بخاطر مسیر دادن به این بحث بسیار ممنونم امید وارم بتونم جبران کنم

1 پسندیده

Designing Data Intensive Applications
شاید بهترین کتابه Big Data

3 پسندیده