RSS    

   Курсовая работа: Використання функціонального підходу при програмуванні розподілених задач для кластеру на прикладі технології DryadLINQ

IEnumerable<T> - представляється як ітератор по колекції даних, які знаходяться на комп’ютері. Під час виконання програми об’єкт колекції компілюються локальним.net JIT компілятором, і ітератори використовуються для покращення виконання програми локально.

IQueryable<T> - представляється як запит по колекції даних. Під час виконання програми об’єкт колекції передається провайдеру DryadLINQ що транслює запити в роботу Dryad і повертає вже оброблені дані до програми. Це використовується для розподілених програм на кластері.

Під час виконання роботи Dryad на кластері вхідні дані представляються у вигляді PartitionedTable<T>. PartitionedTable<T> наслідує IQueryable<T>, а отже наслідує і всі методи IQueryable<T>. PartitionedTable<T> представляє дані ніби вони знаходяться на одному вузлі, проте в реальності вони розділені на частини та знаходяться не на одному вузлі.

 
2.4 Файл метаданих

Як вже було зазначено даний версія DryadLINQ не підтримує автоматичне розбиття даних та копіювання їх на вузли. Це необхідно зробити самостійно, або програмно, написавши додаткові процедури що будуть це виконувати. Отже множина розподілених даних полягає в наступних файлах:

-  файл метаданих, який являться текстовим файлом що містить метадані які описують розподілені дані

-  множини розподілених даних, вони можуть бути будь якого зручного для вашої програми формату включно бінарний формат.

Файл метеданих може приймати наступний вигляд (у випадку виконання роботи на 4 вузлах):

Файл метаданих має формат. pt і містить три розділи:

-  папка та ім’я файлу - перша строчка описує стандартну папку з відкритим доступом і стандартне ім’я для часткових даних. Кожен вузол в кластері має папку DryadData з відповідними правами доступу та кожна частина розподілених даних повинна міститися в цій папці на відповідних вузлах

-  кількість частин - друга строчка описує кількість частин розподілених даних. В даному випадку 4

-  опис розподілених даних - решта файлу. Одна строка - на одну частину. Кожна лінія містить три або більше елементів розподілених комою: номер частини даних (в десятковому вигляді), розмір частини, ім’я комп’ютерів де знаходяться ці дані.

У файлі метеданих не повинно бути жодних пробілів. Номер частин розподілених починається з 00000000. Розмір частини вказувати не обов’язково, тобто якщо при кожному новому виконанні роботи Dryad її розмір змінюється можна вказати нульовий розмір. Також певна чатина даних може не знаходитися в стандартній папці. У цьому випадку в рядку опису цієї частини після переліку вузлів де знаходиться ця частина необхідно поставити ": " та потім вказати ім’я папки та ім’я частини. Наприклад у випадку використання тільки однієї частини розподілених даних файл метаданих може бути наступним

Тут ми не вказуємо папку та ім’я за замовчуванням.

  2.5 Бібліотеки LinqToDryad. dll та System. Threading. dll

Також проект що використовує DryadLINQ необхідно підключити дві бібліотеки LinqToDryad. dll та System. Threading. dll. LinqToDryad. dll містить клас бібліотек DryadLINQ та провайдер DryadLINQ. Розташування цієї бібліотеки за замовчуванням C: \Program Files\Microsoft Research DryadLINQ\lib де міститься версії цієї бібліотеки для відлагодження та для кінцевої версії проекту. System. Threading. dll стандартна бібліотека платформи.net 3. 5 необхідна для використання стандартних можливостей цієї платформи (наприклад WCF). Розташовується вона за замовчуванням в С: \Program Files\Microsoft Research DryadLINQ\Lib\Microsoft\Framework\v3. 5\

 


2.6 Виконання роботи Dryad

Для реалізації консольної програми обчислення інтегралу 1/х методом Монте-Карло на кластері Windows HPC 2008 з використанням DryadLINQ програма перед початком роботи генерує випадкові точки в певному діапазоні записує їх у декілька текстових файлів кожен з яких потім копіюється на відповідний вузол.

Розглянемо виконання роботи Dryad на прикладі запиту DryadLINQ

PartitionedTable<LineRecord> table = PartitionedTable. Get<LineRecord> (uri);

IQueryable<string> table1 = table

. Select (s => s. line)

. Where (s => (1/ (fun (s. Split (' ') [0]))) > fun (s. Split (' ') [1]));

double result = (1. 000000 * table1. Count () * (x2-x1) * (y2-y1)) /lenght;

Спочатку зчитується файл метаданих де вказується кількість та місце знаходження частин розподілених даних які попередньо були скопійовані на відповідні вузли. Далі представляється IQueryable<string> у вигляді PartitionedTable<string>. В запиті DryadLINQ реалізується вибірка тих текстових рядків в яких функція 1/x від першого числа більша за друге число. Тут використовується функція fun яка переводить string у double та функція Split з простору System. Text що розділяє стрічку на частини між якими був знак пробілу. Це реалізується двома методами Select та Where. Перший серед всієї сукупності вхідних діних виділяє рядок, а другий аналізує чи цей рядок задовольняє нашим умовам. Після цього підраховується кількість обраних рядків за допомогою методу Count.

Під час виконання роботи Dryad на консолі провайдер Dryad виводить наступне:

Новый рисунок.bmp

Рис. 2.2

Як видно з рисунка провайдер Dryad виводить:

-  шлях стандартної папки виводу

-  місце знаходження файлу метаданих

-  елементи кожного рівня виконавчого графа Dryad

-  інформація про стан підключення до кластера та погодження роботи на ньому

-  інформується чи робота виконується (running) чи вона поки що в черзі (queued)

Після завершення виконання роботи Dryad на кластері провайдер Dryad повертає оброблені дані до програми.

Дана програма обчислення інтегралу методом Монте-Карло була запущена на різній кількості вузлів: від одного до шести.

Подпись: t, хв.

n

 

Рис. 2.3. Залежність часу виконання роботи Dryad від кількості задіяних вузлів.


Висновки

В результаті зробленого аналізу підходів до розробки паралельних програм було обґрунтовано доцільність створення нового, який передбачає покладання фонової роботи по розпаралеленню на інструментальні засоби, а не на розробника. Серед існуючих парадигм програмування було обрано парадигму функціонального програмування як таку що відповідає висунутим критеріям.

Внаслідок аналізу інструментальних засобів для створення функціонально орієнтованих програм було обрано DryadLINQ.

Реалізована обчислювальна задача методом Монте-Карло дозволила сформувати концепцію використання функціонального підходу у програмуванні для реалізації паралельних обчислювальних задач.


Перелік посилань

1.  Windows® HPC Server 2008 Resource Kit: // http://resourcekit. windowshpc.net/home.html

2.  DryadLINQ - Microsoft Research Project Page // http://research. microsoft.com/en-us/projects/dryadlinq/

3.  Microsoft® Connect – Dryad // http://connect. microsoft.com/Dryad

4.  Dryad - Microsoft Research Project Page // http://research. microsoft.com/en-us/projects/dryad/

5.  Dryad and DryadLINQ for Data Intensive Research // http://research. microsoft.com/en-us/collaboration/tools/dryad. aspx

6.  Intel - HPC: архитектура суперкомпьютеров и разновидности // http://ru. intel.com/business/community/? automodule=blog&blogid=6276&showentry=888

7.  Russian Software Developer Network // http://www.rsdn.ru/

8.  Language-Integrated Query (LINQ) // http://msdn. microsoft.com/en-us/library/bb397926. aspx

9.  LINQ:.net Language-Integrated Query // http://msdn. microsoft.com/en-us/library/bb308959. aspx

10.  Dryad and DryadLINQ team blogs // http://blogs. msdn.com/b/dryad/

11.  Meijer E., Barga R. Introduction to Dryad and DryadLINQ // http://channel9. msdn.com/posts/Charles/Expert-to-Expert-Erik-Roger-Barga-Introduction-to-Dryad-and-DryadLINQ/

12.  Vert J. Data-Intensive Computing on Windows HPC Server with the DryadLINQ Framework // http://microsoftpdc.com/Sessions/SVR17

13.  Podwysocki M. Dryad/DryadLINQ and Project Trident Released

14.  // http://weblogs. asp.net/podwysocki/archive/2009/07/16/dryad-dryadlinq-and-project-trident-released. aspx

15.  Campbell D. Dryad and DryadLINQ: Academic Accelerators for Parallel Data Analysis // http://blogs. msdn.com/b/msr_er/archive/2010/02. aspx

16.  Colaci A. Dryad and DryadLINQ for Data Intensive Research // http://blogs. msdn.com/b/lchong/archive/2009/09/23/dryad-and-dryadlinq-for-data-intensive-research. aspx

17.  Chong L. Scaling out PLINQ: DryadLINQ at PDC09 and Supercomputing09 // http://blogs. msdn.com/b/pfxteam/archive/2009/11/11/9921066. aspx


Додатки

Додаток А

Текст глобального файлу конфігурації

<DryadLinqConfig>

<ClusterName>hnode</ClusterName>

<Cluster name="hnode"

schedulertype="Hpc"

partitionuncdir=" XC\output "

dryadoutputdir="file: // \\hnode\Userdata\tmaliarchuk\output" />

</DryadLinqConfig>


Додаток Б

Текст локального файлу конфігурації

DryadLinqConfig>

<DryadLinqRoot>

C: \Program Files\Microsoft Research DryadLINQ

</DryadLinqRoot>

</DryadLinqConfig>


Додаток B

Текст файлу метаданих (у випадку чотирьох обчислювальних вузлів)

\DryadData\tmaliarchuk\mc

4

0,0,NODE05

1,0,NODE06

2,0,NODE10

3,0,NODE14


Додаток Г

Текст програми обрахунку інтегралу методом Монте-Карло

using System;

using System. IO;

using System. Collections. Generic;

using System. Text;

using System. Linq;

using LinqToDryad;

using System. Diagnostics;

public class MatchString2

{

public static double fun (string s)

{

int i, j = 1;

double ds = 0;

bool b = false;

for (i = 0; (i! = (s. Length)); i++)

{

if (s [i]! = ',')

if (! b) ds = ds*10 + ( (int) s [i] - 48);

else

{

j *= 10;

ds = ds + (1. 0000 * ( (int) s [i] - 48) / j);

}

else b = true;

}

return ds;

}

public static void create (int lenght, int x1, int x2, int y1, int y2, string source,string destination)

{

Console. WriteLine (source);

Random rnd = new Random ();

using (StreamWriter sw = new StreamWriter (source))

{

for (int i = 0; i < lenght / 2; i++)

{

sw. Write (Convert. ToString (x1 + (x2 - x1) * rnd. NextDouble ()));

sw. Write (' ');

sw. WriteLine (Convert. ToString (y1 + (y2 - y1) * rnd. NextDouble ()));

}

}

Console. WriteLine ("copying");

System. IO. File. Copy (source, destination, true);

}

static void Main (string [] args)

{

int lenght = 1000000;

int x1 = 1;

int x2 = 10;

int y1 = 0;

int y2 = 1;

create (lenght/4, x1, x2, y1, y2, @"D: \temp\mc. 00000000", "\\\\node05\\DryadData\\tmaliarchuk\\mc. 00000000");

create (lenght/4, x1, x2, y1, y2, @"D: \temp\mc. 00000001", "\\\\node06\\DryadData\\tmaliarchuk\\mc. 00000001");

create (lenght/4, x1, x2, y1, y2, @"D: \temp\mc. 00000002", "\\\\node10\\DryadData\\tmaliarchuk\\mc. 00000002");

create (lenght/4, x1, x2, y1, y2, @"D: \temp\mc. 00000003", "\\\\node14\\DryadData\\tmaliarchuk\\mc. 00000003");

string uri = DataPath. FileUriPrefix + Path.combine ("\\\\hnode\\UserData\\tmaliarchuk", "montecarlo. pt");

PartitionedTable<LineRecord> table = PartitionedTable. Get<LineRecord> (uri);

Stopwatch t = new Stopwatch ();

t. Start ();

IQueryable<string> table1 = table. Select (s => s. line)

. Where (s => (1/ (fun (s. Split (' ') [0]))) > fun (s. Split (' ') [1]));

double result = (1. 000000 * table1. Count () * (x2-x1) * (y2-y1)) /lenght;

t. Stop ();

Console. WriteLine (t. Elapsed);

Console. WriteLine (result);

Console. ReadKey ();

}

}


Страницы: 1, 2, 3, 4


Новости


Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

                   

Новости

Обратная связь

Поиск
Обратная связь
Реклама и размещение статей на сайте
© 2010.