عدالت در توزیع پذیری

متاسفانه عنوان مناسبی نتونستم پیدا کنم

فرض کنید ما چهارتا node داریم و یکی از نودها به سه تای دیگه قراره داده بفرسته. مثلا قراره اعداد 1 تا ایکس رو بفرسته ! آیا راهی برای اینکه بشه این فرستادن عادلانه باشه هست؟
تو کامپیوتر خودم دوسه تا راه رفتم اما یکی از نودها در عرض ۳۰ ثانیه کل داده رو میگیره در صفحه چاپ میکنه اما اون ۲ تای دیگه درست ۱۰ دقیقه طول میکشه ! دلیلش به خاطر سیستم عامله که به یک نود منابع بیشتری میده؟ یا در خود الکسیر داده فرستادن رو از نود اول شروع میکنه تا برسه به سومی؟
اگر چندتا کامپیوتر واقعی رو کلاستر کنم فرضا آیا در اونها هم همچین اتفاقی خواهد افتاد؟ اگر خواهد افتاد راهی هست که بشه عدالت برقرار کرد؟

1 Like

ساده ترین راه برای اینکار استفاده از hash و modulus

اگر یک لیست از نود ها داشته باشی میتونی hash داده که یک عدد باشه رو بر تعداد نود ها در لیست mod کنی

node_list = [127.0.0.1, 127.0.0.2, 127.0.0.3]

some_hash_function(data) #123445
node_index = rem(123445,node_list) #1
node = Enum.at(nodes, node_index) #127.0.0.2

http://dataidol.com/tonyrogerson/2013/11/25/what-is-hashing-using-modulus-to-partition-data/

1 Like

عزیز صادقانه بگم هیچی نگرفتم :joy::joy::joy::joy::joy::joy::joy:
لطفا اگر ممکنه یکم بازترش کن متوجه بشم!

1 Like

فرض کن ۱۰ تا عدد داریم و میخواهیم به صورت عادلانه بین سه نود تقسیم کنیم
اگه هر عدد باقی مانده شو با ۳ بگیریم یک عدد بین صفر تا ۲ میده

scala> (1 to 10).map(x=> x % 3).map(println)
1
2
0
1
2
0
1
2
0
1

تا اینجا متوجه شدی؟

1 Like

بله متوجه شدم! فقط چیزی که من میخوام اینه که فرضا اگر یک دیتا رو به طور عادلانه بخش بخش کردیم برای هر نود! چطوری میشه اینها رو عادلانه فرستاد؟‌ مثلا دیگه اول داده نود اول رو نفرسته بعد سراغ بعدی بلکه عادلانه بفرسته. مثلا اگر ده تا به نود اول داده میفرسته از هزارتا. ده تا هم به نود دوم و سوم و… بفرسته همزمان

1 Like

باقی مانده کاملا عادلانه تقسیم میکنه

1 Like

:rofl::rofl: پس عذر میخوام لطفا ادامه رو توضیح بدید من فکر کردم شما منظور منو اشتباه گرفتین بازم شرمنده
یکی هم لطفا توضیح بدین چرا باقی مانده ها رو گرفتین منظورم x % 3 هست

حالا هر داده که داریم میخواهیم به صورت عادلانه به یک نود بفرستیم
برای این کار باید با یک الگوریتم hash داده به یک عدد تبدیل کنیم مثلا داده “کتاب” تبدیل بشه به ۱۲۳۴
حالا باقی مانده ۱۲۳۴ با تعداد کل نود ها که داریم تو لیست میگیریم مثلا ۳ تا نود

scala> 1234 % 3
res8: Int = 1

بخاطر اینکه جواب ۱ هستش از لیست نود با ایندکس ۱ برمیگردونیم و داده به اون نود میفرستیم

1 Like

تا این حد فهمیدم که که چون سه تا نود داریم عدد سه وجود داره ! اینکه چرا باید x%3 بشه و مقادیرش رو که بین صفر تا ۲ هستند به چه درد میخورند رو نفهمیدم !

اینها به چه دردی میخورند ؟‌ آیا هر کدوم اینها قراره شماره یکی از نودها بشه ؟

اگه لیست نود هارو داشته باشی با این عدد ها میتونی نود برای اون داده رو برگردونی

node_list = [127.0.0.1, 127.0.0.2, 127.0.0.3]
node = Enum.at(node_list, 0)
1 Like

خیلی ممنون .
فرض کنیم ما لیست زیر رو که داده های ما هستند رو داریم و میخواییم اینها رو به مثلا دو تا نود عادلانه توزیع کنیم :

val data : List[Int] = List(1,2,3,4,5,6)

میشه با هرزبونی که دوست دارین یک مثال برای این بزنید ؟ و یه لینک یا کتاب خوب در مورد hash , modulas و این چیزا معرفی کنید ؟‌خیلی ممنون میشم

https://scalafiddle.io/sf/jNmOzdq/0

اگر در مورد partitioning بخونید اینا توضیح داده میشه

1 Like

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

خیلی ممنون خودتون . منبع خوبی ندارین ؟ در کتابهای مثل distributed compute… این مسائل نوشته میشه دانلود کنم ؟‌

2 Likes

@toomaj توماج جان الان دیدم میشه دقیقا بگی چه بلایی سر پست های من میاری :rofl::rofl::rofl:

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

در مجموع بیکاری هم خوب چیزیه، آدم راه میوفته توی سایتا و فاصله حذف میکنه :joy::joy::joy:

2 Likes

:sweat_smile: آقا یجوری میگی قدیما ادم فکرمیکنه چند سالتونه ! هنوز که جوونی

خب عامیانه مینویسم دیگه ! یکی فارسی نسخه کتابی هست یکی هم عامیانه که باهم ارتباط برقرار میکنیم

:sweat_smile::sweat_smile::sweat_smile::sweat_smile::sweat_smile:

اسرار روی بعضی نکات اونم با استدلال های عجیب هم از اون مواردیه که بازم بد جوری شیوع پیدا کرده و نمیتونه نشونه مثبتی از پیشرفت باشه :wink:

3 Likes

البته مدل فرستادن شما هم اشتباهه، همزمان ارسال نمیکنه
اینجوری مثلا میشه همزمان

for i <- nodes do
  spawn fn -> 
    for j <- 1..500000 do
      send i,j
    end
  end
end

اینجوری برای هر نود یه پروسه ایجاد میشه که کار ارسال عدد رو جدا و همزمان با بقیه انجام میده.
میتونید کار ارسال اعداد رو هم به پروسه های کوچک‌تری تقسیم کنید، مثلا هر ۱۰۰۰۰۰ تا رو با یه پروسه انجام بدید که کدش رو به عنوان کار در منزل جلسه بعدی بیارید :grin:

ویرایش:
نکته‌هایی که مطرح شده در تاپیک، مربوط به این میشن که شما بخوای ۵۰۰۰۰۰ تا رو بین ۳ تا نود تقسیم کنی، در حالی که شما داری به هر نود ۵۰۰۰۰۰ تا میفرستی. شاید سوالتون رو بهتر مطرح کنید بهتر باشه.

3 Likes

من اصلا متوجه نشدم که یک range هاردکد شده و ثابت اینجا به چه کاری میاد، بنظر منم بهتره سوال جوری عنوان بشه که حداقل تا حدی شرایط منطقی رو شبیه سازی کنه.‌

1 Like