Реализация - bsuir-informatics-labs

advertisement
Министерство образования Республики Беларусь
УО «Белорусский Государственный Университет Информатики и
Радиоэлектроники»
Кафедра информатики
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
к курсовому проекту по курсу
«Операционные системы и среды»
Тема: «Распределенное решение вычислительной задачи»
Выполнил:
студент группы 852002
Бенько И.С.
Проверил:
Сиротко С.И.
Минск, 2011
Оглавление
1. Введение .......................................................................................................... 3
2. История распределенных вычислений ....................................................... 4
3. Теория распределенных вычислений .......................................................... 5
4. MapReduce....................................................................................................... 6
5. Реализация ...................................................................................................... 7
5.1 Серверная часть ........................................................................................ 8
5.2 Клиентская часть .................................................................................... 10
6. Взлом алгоритма хэширования MD5 ......................................................... 13
6.1 Реализация .............................................................................................. 14
7. Заключение ................................................................................................... 15
8. Список использованной литературы.......................................................... 16
9. Приложение .................................................................................................. 17
2
1. Введение
В настоящее время существует множество задач, решение которых требует очень много
времени (обработка петабайтов данных, научные задачи). И так как вычислительная
мощность ПК слишком ограничена, а создание суперкомпьютеров слишком дорого – то
помочь быстро выполнить ресурсоемкую задачу помогают распределенные
вычисления. Главная идея такого подхода – в разделении всей задачи на более мелкие
подзадачи, которые могут быть вычислены независимо друг от друга и объединены в
итоговый результат.
Можно определить 2 типа построения сетей распределенных вычислений:
специализированные кластера компьютеров и «обычные» ПК, подключенные к сети
интернет. Первый вариант предусматривает капитальные вложения в оборудование,
разворачивание сети, специальное ПО, тогда как второй вариант использует
персональные компьютеры интернет пользователей и необходимо лишь специальное
ПО и затраты на привлечение людей к вычислениям. Не секрет, что при обычной
работе компьютера (интернет браузер, офисные программы и проч.) 99% всего
рабочего времени процессор ПК попросту простаивает и понапрасну потребляет
электроэнергию.
3
2. История распределенных вычислений
В 1973 году Джон Шох и Джон Хапп из калифорнийского научно-исследовательского
центра Xerox PARC написали программу, которая по ночам запускалась в локальную
сеть PARC и заставляла работающие компьютеры выполнять вычисления [3].
В
1978
году
советский
математик Виктор
Глушков работал
над
проблемой макроконвейерных распределённых вычислений. Он предложил ряд
принципов распределения работы между процессорами.[2]:320 На базе этих принципов
им была разработана ЭВМ ЕС-2701.
В
1988
году Арьен
Ленстра и
Марк
Менес
написали
программу
для факторизации длинных чисел. Для ускорения процесса программа могла
запускаться на нескольких машинах, каждая из которых обрабатывала свой небольшой
фрагмент.[3].
В 1994 году Дэвидом Джиди была предложена идея по организации массового проекта
распределённых вычислений, который использует компьютеры добровольцев
(т. н. добровольные вычисления) — SETI@Home[4]. Научный план проекта котрый
разработали Дэвид Джиди и Крейг Каснофф из Сиэтла был представен на пятой
международной конференции по биоастрономии в июле 1996 года[5].
В январе 1996 года стартовал проект GIMPS по поиску простых чисел Мерсенна, также
используя компьютеры простых пользователей как добровольную вычислительную
сеть.
28 января 1997 года стартовал конкурс RSA Data Security на решение задачи взлома
методом простого перебора 56-битного ключа шифрования информации RC5.
Благодаря хорошей технической и организационной подготовке проект,
организованный некоммерческим сообществом distributed.net, быстро получил
широкую известность [3].
17 мая 1999 года стартовал SETI@home на базе Grid, а в начале 2002 года завершилась
разработка
Калифорнийского
Университета
в
Беркли
открытой
платформы BOINC (Berkeley
Open
Infrastructure
for
Network
Computing),
разрабатываемой с апреля 2000 года первоначально для SETI@Home, но первым на
платформе BOINC стал проект Predictor@home запущенный 9 июня 2004 года.
4
3. Теория распределенных вычислений
Распределённые вычисления — способ решения трудоёмких вычислительных задач с
использованием нескольких компьютеров, чаще всего объединённых в параллельную
вычислительную
систему.
Выполнение
последовательных
вычислений
в
распределенных системах имеет смысл в рамках решения многих задач одновременно,
например в распределенных системах управления. Особенностью распределенных
многопроцессорных
вычислительных
систем,
в
отличие
от
локальных суперкомпьютеров, является возможность неограниченного наращивания
производительности за счет масштабирования. Слабосвязанные, гетерогенные
вычислительные системы с высокой степенью распределения выделяют в отдельный
класс распределенных систем — Grid.
В распределенной системе вычислений существует переменное кол-во вычислительных
сущностей, каждая из которых имеет свою локальную память. Эти сущности
обмениваются информацией через сообщения.
Далее будет рассмотрена модель с одним управляющим центром вычислений, который
будет раздавать задачи клиентам. В частности будет реализован фреймворк MapReduce
и как пример использования – взлом MD5 хэширования.
5
4. MapReduce
MapReduce — это фреймворк для вычисления некоторых наборов распределенных
задач с использованием большого количества компьютеров (называемых
«нодами»), образующих кластер.
Работа MapReduce состоит из двух шагов: Map и Reduce.
На Map-шаге происходит предварительная обработка входных данных. Для этого
один из компьютеров (называемый главным узлом — master node) получает
входные данные задачи, разделяет их на части и передает другим компьютерам
(рабочим узлам — worker node) для предварительной обработки. Название данный
шаг получил от одноименной функции высшего порядка.
На Reduce-шаге происходит свёртка предварительно обработанных данных.
Главный узел получает ответы от рабочих узлов и на их основе формирует
результат — решение задачи, которая изначально формулировалась.
Преимущество MapReduce заключается в том, что он позволяет распределенно
производить операции предварительной обработки и свертки. Операции
предварительной обработки работают независимо друг от друга и могут
производиться параллельно (хотя на практике это ограничено источником входных
данных и/или количеством используемых процессоров). Аналогично, множество
рабочих узлов могут осуществлять свертку — для этого необходимо только чтобы
все результаты предварительной обработки с одним конкретным значением ключа
обрабатывались одним рабочим узлом в один момент времени. Хотя этот процесс
может быть менее эффективным по сравнению с более последовательными
алгоритмами, MapReduce может быть применен к большим объемам данных,
которые могут обрабатываться большим количеством серверов. Так, MapReduce
может быть использован для сортировки петабайта данных, что займет всего лишь
несколько часов. Параллелизм также дает некоторые возможности восстановления
после частичных сбоев серверов: если в рабочем узле, производящем операцию
предварительной обработки или свертки, возникает сбой, то его работа может быть
передана другому рабочему узлу (при условии, что входные данные для
проводимой операции доступны).
Фреймворк в большой степени основан на функциях map и reduce, широко
используемых в функциональном программировании, хотя фактически семантика
фреймворка отличается от прототипа.
6
5. Реализация
В качестве серверной платформы я выбрал .Net Framework 4.0 ASP.NET
MVC3 IIS7 WebServer.
Сервер будет позволять зарегистрировать задачу для вычисления,
посмотреть прогресс выполнения, перезапустить задачу (через вебинтерфейс) и также раздавать задачи клиентам. Клиенты могут быть
разработаны под различные платформы. В данном проекте я разработал
клиент для Windows и кроссплатформенный для браузеров, используя
Javascript.
7
5.1. Серверная часть
Интерфейс сервера:
- GetTasks() – получить зарегистрированные задачи
- GetClientExecutable(string taskId, ClientType clientType) – получить исполняемый файл
для конкретной задачи и конкретной платформы.
- RegisterTasks(File zipFile) – зарегистрировать задачи (Zip-архив)
- GetTaskResult(string taskId) – получить результат задачи (доступно после выполнения
всех частей задачи)
- GetPartOfTask(string taskId, ClientType clientType) – получить параметры для части
задачи. Возвращает уникальный идентификатор части задачи.
- PostTaskComputingResult(string taskId,
зарегистрировать вычисленный результат.
string
uid,
ClientType
clientType)
–
- GetAvailableTask() – получить идентификатор задачи, доступной для выполнения.
Регистрация задачи:
Задача описывается .Net классом, реализующим интерфейс ITask (представленный
ниже). Сборка с этим классом и дополнительные файлы, необходимые для реализации
интерфейса должны быть заархивированы и загружены на сервер.
/// <summary>
/// Describe methods for new task
/// </summary>
public interface ITask
{
/// <summary>
/// Initialize task object
/// </summary>
/// <param name="parameters">Initial parameters</param>
void Init(InitParameters parameters);
/// <summary>
/// Get calculated result of task.
/// </summary>
/// <returns>Return stream with result(file, text, zip archive)</returns>
Stream GetResult();
/// <summary>
/// Get current progress.
/// </summary>
/// <returns>Current progress in interval [0,1].</returns>
double GetProgress();
///
///
///
///
<summary>
Is task completed.
</summary>
<returns>True if task completed</returns>
8
bool IsDone();
/// <summary>
/// Reset task state. So, progress should be 0.
/// </summary>
void Reset();
/// <summary>
/// Returns object (actually string) that should be passed to client to
/// compute some part of task.
/// </summary>
/// <param name="clientType">Type of client</param>
/// <param name="uid">Unique computing session id</param>
/// <returns></returns>
///
///
object GetPartOfTask(ClientType clientType, string uid);
/// <summary>
/// Post calculated result from client.
/// </summary>
/// <param name="uid">Client calculation session unique identifier</param>
/// <param name="stream">Stream from client</param>
void PostResult(string uid, Stream stream);
/// <summary>
/// Returns client executable. For windows platform - actually .exe file.
/// For javascript - .js file, etc..
/// </summary>
/// <returns>Stream passed to client</returns>
Stream GetClientExecutable(ClientType clientType);
}
Пример реализации интерфейса для задачи MapReduce. Инициализируется числовым
интервалом и далее интервал разбивается на мелкие интервалы и отдается клиентом,
чтобы посчитать результат. Посчитанные результаты объединяются и это будет
результатом всей задачи:
9
5.2. Клиентская часть
Работа клиента заключается в бесконечном цикле:
1.
2.
3.
4.
Получить доступную задачу.
Получить исполняемый файл для задачи.
Получить параметры для расчета задачи.
Зарегистрировать результаты расчета.
Windows клиент.
Исполняемый файл - это написанная консольная программа, параметры для которой
передаются через командную строку, а результат записывается в заданный файл.
public void Run()
{
var taskManagerProxy = IoC.GetInstance<ITaskManagerProxy>();
for(;;Thread.Sleep(1.Minutes()))
{
try
{
var taskId = taskManagerProxy.GetAvailableTask();
if(string.IsNullOrEmpty(taskId))
continue;
PerformTask(taskId);
var clientConfig = _taskClients[taskId];
var tempFileName = Path.Combine(clientConfig.ResultDirectoryPath,
DateTime.Now.ToString("yyyy-MM-ddHH-mm-ss-ff") + ".txt");
for(;;)
{
var partOfTask = taskManagerProxy.GetPartOfTask(taskId);
var processStartInfo = new
ProcessStartInfo(clientConfig.ExecutablePath,
"{0}
/OutputFile:\"{1}\"".F(partOfTask.Parameters,
tempFileName));
processStartInfo.UseShellExecute = false;
var process = Process.Start(processStartInfo);
process.WaitForExit();
var result = File.ReadAllText(tempFileName);
taskManagerProxy.PostResult(taskId, partOfTask.Uid, result);
}
}
catch (Exception ex)
{
_log.LogException(ex);
}
}
}
10
Javascript клиент.
Исполняемый файл – javascript код. Клиент загружает исполняемый код, выполняет
его. Параметры для задачи – тоже javascript код, который выполняется клиентом и
результат передается серверу.
Run: function () {
var cl = this;
var getClientScript = function (taskId) {
$.ajax({
url: "/TaskManager/GetClientExecutable?taskId=" + taskId +
"&clientType=Javascript",
type: "GET",
success: function (scripts) {
$.globalEval(scripts);
getPartOfTask(taskId);
},
error: function (obj) {
window.setTimeout(computeAvailableTask, 500);
}
});
};
var computeAvailableTask = function () {
$.ajax({
url: "/TaskManager/GetAvailableTask",
type: "GET",
success: function (obj) {
if (obj.errorCode == 0) {
getClientScript(obj.taskId);
}
},
error: function (obj) {
window.setTimeout(computeAvailableTask, 500);
}
});
};
var computePartOfTask = function (script) {
var result = "";
try {
eval(script)
} catch (e) {
}
return result;
};
var postResult = function (taskId, uid, result) {
$.ajax({
url: "/TaskManager/PostTaskComputingResult",
type: "POST",
data: "taskId=" + taskId + "&uid=" + uid + "&result=" + result,
success: function (obj) {
if (obj.errorCode == 0) {
var val = $("#ComputingLog").text();
$("#ComputingLog").text(val + '|');
}
11
},
error: function (obj) {
}
});
};
var getPartOfTask = function (taskId) {
$.ajax({
url: "/TaskManager/GetPartOfTask?taskId=" + taskId +
"&clientType=Javascript",
type: "GET",
success: function (obj) {
if (obj.errorCode == 0) {
var result = computePartOfTask(obj.taskParameters);
postResult(taskId, obj.uid, result);
window.setTimeout(function () { getPartOfTask(taskId); },
500);
}
else {
window.setTimeout(computeAvailableTask, 500);
}
},
error: function (obj) {
window.setTimeout(computeAvailableTask, 500);
}
});
};
computeAvailableTask();
}
}
12
6. Взлом алгоритма хэширования MD5
Взлом есть обратная задача хэшированию: по данном хэшу найти строку, хэш которой
равен данному.
Допустим у нас известен алфавит из символов которого состоит строка. Для нашей
задачи алфавит будет состоять из 27 символов – 26 букв английского языка и 1 псевдо
буква (отсутствие буквы). Исходная строка будет состоять из 8 символов, то есть
существует 282 429 536 481 вариантов различных строк. По каждому номеру мы можем
однозначно определить строку. Поэтому задача сводится к разбиению отрезка от 0 до
282 429 536 481 на много интервалов и независимому поиску строку по данному хэшу.
В моей реализации задача будет разделяться на 100 000 мелких интервалов размером
около 2.8 млн.
13
6.1 . Реализация
Реализация на Javascript:
jQuery(function () {
Type.registerNamespace("TaskComputing.Range");
TaskComputing.Range.Md5Brutforce = function () {
this.init();
}
TaskComputing.Range.Md5Brutforce.prototype = {
init: function () {
this.alphabet = " abcdefghijklmnopqrstuvwxyz",
this.alphabetLength = this.alphabet.length;
},
find: function (from, to, md5toCheck) {
var result = '';
for (var i = from; i <= to; i++) {
var password = this.from10toN(i);
if (calcMD5(password) == md5toCheck) {
result = result + ' ' + password;
}
}
return result;
},
from10toN: function (number) {
var base = this.alphabetLength;
var result = '';
while (number > 0) {
result = this.alphabet.charAt(number % base) + result;
number = Math.floor(number / base);
}
return result;
}
}
});
14
7. Результат работы
На Javascript интервал в 2.8 обрабатывается примерно за 20 секунд (однопоточно).
Таким образом для вычисления всей задачи на 1 клиенте необходимо около 555 часов.
Система была протестирована на 20 компьютерах в корпоративной сети. На каждом
компьютере был 4-ядерный процессор AMD Athlon 2 965 и выполнялось по 4
экземпляра javascript клиента. На решение все задачи потребовалось около 9 часов
времени.
15
8. Заключение
В данном проекте была разработана платформа для организации распределенных
вычислений для любых задач. Также реализованы клиенты для платформ Windows и
Javascript. Таким образом достаточно написать на Javascript логику решения задачи, и
описать ее в .Net сборке.
16
9. Список использованной литературы
1.
2.
3.
4.
5.
6.
7.
http://en.wikipedia.org/wiki/Distributed_computing
http://ru.wikipedia.org/wiki/MapReduce
https://www.google.com/
http://habrahabr.ru/
http://www.asp.net/mvc/mvc3
http://jquery.com/
http://www.webtoolkit.info/javascript-md5.html
17
Download