Simple MapReduce
Общи приказки:
Представете си че имаме >100 машини, които обслужват хиляди заявки/байтове в секунда от клиенти по някакъв протокол(HTTP). За всяка завка се генерира един ред лог, който се записва в логовете по някакъв протокол(UDP 514 - syslog). Логовете са огромни и се записват в централно място с огромни и бавни SATA дискове, което прави ваденето на агрегирана информация доста бавно. Не е невъзможно събития, които се случват днес да можем да ги начертаем на графика чак утре(никой не е доволен ако трябва да чака 1 ден, за да разбере, че услугата му не работи). Един възможен подход да решим този проблем(без да променяме сервиращия софтуер) е ако на всяка машина, която генерира логове, прихванем всеки лог(UDP 514), извлечем необходимите данни, редуцираме ги и ги препратим на системата, която чертае графики/праща нотификации.
Задачата:
Да се имплементира mapper, който:
- Работи на всяка машина генерираща логове
- Прихваща входящи логове по определен протокол(в начлото само UDP 514)
- Parse-ва входящото съобщение по зададен темплейт
-
Изпълнява n на брой регистрирани mapper-a за всяко входящо съобщение:
- mapper 1: asn_performance_per_region - за даден ASN,POP,QUALITY опреdеля bytes/hits/tcp rtt/below_bitrate
- mapper 2: graphite - определя hits/below_file_bitrate/below_requested_ bitrate
- mapper 3: syslog_relay - запазва входното съобщение и го предава на syslog server по UDP
! Архитектурата трябва да позволява сравнително лесно добавяне на нови mappers
-
Резултатът на всеки mapper може да се изпрати(но не е задължително) на n на брой регистрирани модула за изпращне:
- sender 1: изпраща се json до реалните reducers(намират се на други машини), като използваме zmq
! Даден mapper може да изпрати своя резултат на предварително регистрирани senders или да има своя вътрешна имплементация за изпращанне на данните
Измерва msg/s на входа и msg/s на изхода
- Предоставя информация за измерените статистики и текущи грешки/проблеми на 80 порт по HTTP протокол(json)
В другия край на zmq тръбата слушат съответните reducers, които пишат в db/ипзращат нотификация, но те няма да са предмет на текущата имплементация.
Това е реален usecase и mapper-a имплементиран на GO ще замени такива написани на Python.