cd agent
node agent.js
cd master
node app.js
Система должна располагаться на 2-х и более серверах (для тестового задания достаточно 2-х). Для тестирования нет необходимости иметь 2 компьютера. Можно запустить 2 процесса на одном, но суть обмена данными через сетевой интерфейс должна остаться. На первом сервере располагается располагается текстовый файл (лог) и на нем же запускается мастер-процесс (далее мастер). На остальных серверах стоят скрипты, которые подключаются к мастеру (далее агенты). Способ подключения не важен (сокет, http, rpc и т.д.).
Мастер:
- Мастер создает несколько дочерних процессов (cluster) и дает команду подключившимся к нему тоже создать несколько дочерних процессов(обычно по колличеству ядер, но в тестовом варианте можно меньше).
- Мастер читает текстовый файл построчно и порциями (порции должны содержать целое число строк) переадрисовывает поток своим дочерним процессам и процессам на других машинах. Способ передачи потока в дочерние процессы на других машинах так же не важен (отдельное подключение или через агента на этом сервере).
- Если в процессе переадрисации потока подключится еще один агент, мастер также должен дать ему команду на создание дочерних процессов и распределять поток на них тоже.
- По окончании файла и окончании обработки потока на каждом дочернем процессе, мастер дает команду агентам закрыть потоки и переслать обработанный лог на сервер мастера (по ssh).
- По окончании пересылки мастер склеивает все полученные кусочки лога в один файл и выдает в консоль суммарное время обработки лога.
Агенты:
- После запуска мастера его должны увидеть агенты и автоматически подключиться к нему.
- При получении команды на создание дочерних процессов, создать кластер из указанного в команде колличества процессов.
- При получении команды окончания лога, дождаться окончания обработки потока в кластере, закрыть все процессы и скопировать по ssh полученные после обработки логи.
- По окончании копирования отправить команду мастеру об окончании копирования.
Кластер:
- Каждый процесс кластера должен получать на вход поток и разбивать его на строки.
- В строке найти число от 1 до 100 000 000 (отделенное табуляцией) перевести его в hex формат в верхнем регистре, 8 символов. (например: 654321 = 0009FBF1)
- Полученное число в hex формате записать в свой лог отдельной строкой.
Лог:
- Пример строк входного лога:
194.135.154.57 [15/Feb/2015:06:38:22 +0200] 654321 "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:37.0)
Gecko/20100101 Firefox/37.0"
46.165.13.23 [15/Feb/2015:06:38:48 +0200] 8761824 "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64;
Trident/6.0)"
81.25.53.30 [15/Feb/2015:06:39:01 +0200] 1233321 "Opera/9.80 (Windows NT 6.1) Presto/2.12.388 Version/12.17"
- Пример строк выходного лога:
0009FBF1
0085B1E0
0012D1A9