I gave this lightning talk at Yapc 2011. My company uses Perl in a variety of products, some of which have serious performance implications. Here I give a quick overview of some of the tricks we use to squeeze extra performance out of Perl.
I gave this lightning talk at Yapc 2011. My company uses Perl in a variety of products, some of which have serious performance implications. Here I give a quick overview of some of the tricks we use to squeeze extra performance out of Perl.
"Отчётность как механизм контроля качества процессов управления ИТ и работы п...itSMF Ukraine
Тема доклада: "Отчётность как механизм контроля качества процессов управления ИТ и работы подрядчиков (на примере проекта Ленэнерго)"
Докладчик: Юрий Медяный, OmniWay
Презентация с доклада на RIW-2013.
В презентации делюсь полезными практиками работы со статистикой сайта:
- Контроль качества данных, отделение пользовательского поведения, фрода
- Оповещения об изменении ключевых показателей
- Автоматизация отчётов, ключевые моменты
- Измерение внутренних переходов
-Структурирование контента: как правильно ориентироваться в миллионах страниц
- Показываем, что действительно видит пользователь
- Веб-аналитика полезна не только для сайта, как получить дополнительную выгоду для бизнеса
Илья Василенко. SEO здорового проекта: проведение аудита, составление стратег...Octopus Events
1. Каким должно быть семантическое ядро проекта?
2. Как правильно провести анализ ранжирования?
3. Как грамотно оценить нишу и выявить прямых конкурентов проекта?
4. Почему важно иметь лог работ по проекту за предыдущие периоды?
5. Каким должен быть контент на сайте: стоит ли писать SEO-тексты, размещать отзывы, добавлять фото и видео-контент? Реальные примеры.
6. Поиск точек роста и составление прогноза прироста трафика.
7. Как должна выглядеть идеальная стратегия по SEO?
8. Что делать после проведения аудита?
9. Что должно быть для каждого проекта в регулярных отчётах по SEO?
Similar to Управляемый Code injection (Михаил Якшин) (20)
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...Ontico
HighLoad++ 2017
Зал «Калининград», 8 ноября, 15:00
Тезисы:
http://www.highload.ru/2017/abstracts/2964.html
Одноклассники состоят из более чем восьми тысяч железных серверов, расположенных в нескольких дата-центрах. Каждая из этих машин была специализированной под конкретную задачу - как для обеспечения изоляции отказов, так и для обеспечения автоматизированного управления инфраструктурой.
...
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Ontico
HighLoad++ 2017
Зал «Калининград», 8 ноября, 16:00
Тезисы:
http://www.highload.ru/2017/abstracts/3032.html
Протокол DNS на семь лет старше, чем Всемирная паутина. Стандарты RFC 882 и 883, определяющие основную функциональность системы доменных имён, появились в конце 1983 года, а первая реализация последовала уже годом позже. Естественно, что у технологии столь старой и при этом по сей день активнейшим образом используемой просто не могли не накопиться особенности, неочевидные обыкновенным пользователям.
...
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Ontico
HighLoad++ 2017
Зал «Калининград», 8 ноября, 13:00
Тезисы:
http://www.highload.ru/2017/abstracts/3010.html
В этом докладе я расскажу, как BigData-платформа помогает трансформировать Почту России, как мы управляем построением и развитием платформы. Расскажу про найденные удачные решения, например, как разбиение на продукты с понятными SLA и интерфейсами между ними помогло нам сохранять управляемость с ростом масштабов проекта.
...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 10:00
Тезисы:
http://www.highload.ru/2017/abstracts/2914.html
Казалось бы, что нужно для организации тестового окружения? Тестовая железка и копия боевого окружения - и тестовый сервер готов. Но как быть, когда проект сложный? А когда большой? А если нужно тестировать одновременно много версий? А если все это вместе?
Организация тестирования большого развивающегося проекта, где одновременно в разработке и тестировании около полусотни фич - достаточно непростая задача. Ситуация обычно осложняется тем, что иногда есть желание потрогать еще не полностью готовый функционал. В таких ситуациях часто возникает вопрос: "А куда это можно накатить и где покликать?"
...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 18:00
Тезисы:
http://www.highload.ru/2017/abstracts/2854.html
Из этого доклада вы узнаете о возможностях репликации и автофейловера PostgreSQL, в том числе о возможностях, ставших доступных в PostgreSQL 10.
Среди прочих, будет затронуты следующие темы:
* Виды репликации и решаемые с ее помощью проблемы.
* Настройка потоковой репликации.
* Настройка логической репликации.
* Настройка автофейловера / HA средствами Stolon и Consul.
После прослушивания доклада вы сможете самостоятельно настраивать репликацию и автофейловер PostgreSQL.
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 17:00
Тезисы:
http://www.highload.ru/2017/abstracts/3096.html
PostgreSQL is the world’s most advanced open source database. Indeed! With around 270 configuration parameters in postgresql.conf, plus all the knobs in pg_hba.conf, it is definitely ADVANCED!
How many parameters do you tune? 1? 8? 32? Anyone ever tuned more than 64?
No tuning means below par performance. But how to start? Which parameters to tune? What are the appropriate values? Is there a tool --not just an editor like vim or emacs-- to help users manage the 700-line postgresql.conf file?
Join this talk to understand the performance advantages of appropriately tuning your postgresql.conf file, showcase a new free tool to make PostgreSQL configuration possible for HUMANS, and learn the best practices for tuning several relevant postgresql.conf parameters.
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 16:00
Тезисы:
http://www.highload.ru/2017/abstracts/3115.html
During this session we will cover the last development in ProxySQL to support regular expressions (RE2 and PCRE) and how we can use this strong technique in correlation with ProxySQL's query rules to anonymize live data quickly and transparently. We will explain the mechanism and how to generate these rules quickly. We show live demo with all challenges we got from the Community and we finish the session by an interactive brainstorm testing queries from the audience.
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 15:00
Тезисы:
http://www.highload.ru/2017/abstracts/2957.html
Расскажем о нашем опыте разработки модуля межсетевого экрана для MySQL с использованием генератора парсеров ANTLR и языка Kotlin.
Подробно рассмотрим следующие вопросы:
— когда и почему целесообразно использовать ANTLR;
— особенности разработки ANTLR-грамматики для MySQL;
— сравнение производительности рантаймов для ANTLR в рамках задачи синтаксического анализа MySQL (C#, Java, Kotlin, Go, Python, PyPy, C++);
— вспомогательные DSL;
— микросервисная архитектура модуля экранирования SQL;
— полученные результаты.
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 14:00
Тезисы:
http://www.highload.ru/2017/abstracts/3114.html
ProxySQL aims to be the most powerful proxy in the MySQL ecosystem. It is protocol-aware and able to provide high availability (HA) and high performance with no changes in the application, using several built-in features and integration with clustering software. During this session we will quickly introduce its main features, so to better understand how it works. We will then describe multiple use case scenarios in which ProxySQL empowers large MySQL installations to provide HA with zero downtime, read/write split, query rewrite, sharding, query caching, and multiplexing using SSL across data centers.
MySQL Replication — Advanced Features / Петр Зайцев (Percona)Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 13:00
Тезисы:
http://www.highload.ru/2017/abstracts/2954.html
MySQL Replication is powerful and has added a lot of advanced features through the years. In this presentation we will look into replication technology in MySQL 5.7 and variants focusing on advanced features, what do they mean, when to use them and when not, Including.
When should you use STATEMENT, ROW or MIXED binary log format?
What is GTID in MySQL and MariaDB and why do you want to use them?
What is semi-sync replication and how is it different from lossless semi-sync?
...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 12:00
Тезисы:
http://www.highload.ru/2017/abstracts/3120.html
Количество разработчиков мобильных приложений Сбербанк Онлайн с начала 2016 года выросло на порядок. Для того чтобы продолжать выпускать качественный продукт, мы кардинально перестраиваем процесс разработки.
Количество внутренних заказчиков тех или иных доработок в какой-то момент выросло настолько, что разработчики стали узким местом. Мы внедрили культуру разработки, которую можно условно назвать "внутренним open-source", сохранив за собой контроль над архитектурой и качеством проекта, но позволив разрабатывать новые фичи всем желающим.
...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Ontico
HighLoad++ 2017
Зал «Мумбай», 8 ноября, 18:00
Тезисы:
http://www.highload.ru/2017/abstracts/2836.html
При использовании Eventually Consistent распределенных баз данных нет гарантий, что чтение возвращает результаты последних изменений данных, если чтение и запись производятся на разных узлах. Это ограничивает пропускную способность системы. Поддержка свойства Causal Consistency снимает это ограничение, что позволяет улучшить масштабируемость, не требуя изменений в коде приложения.
...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Ontico
HighLoad++ 2017
Зал «Мумбай», 8 ноября, 16:00
Тезисы:
http://www.highload.ru/2017/abstracts/2858.html
Аудитория Одноклассников превышает 73 миллиона человек в России, СНГ и странах дальнего зарубежья. При этом ОК.ru - первая социальная сеть по просмотрам видео в рунете и крупнейшая сервисная платформа.
Качественный и количественный рост DDoS-атак за последние годы превращает их в одну из первоочередных проблем для крупнейших интернет-ресурсов. В зависимости от вектора атаки “узким” местом становится та или иная часть инфраструктуры. В частности, при SYN-flood первый удар приходится на систему балансировки трафика. От ее производительности зависит успех в противостоянии атаке.
...
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Ontico
HighLoad++ 2017
Зал «Мумбай», 8 ноября, 15:00
Тезисы:
http://www.highload.ru/2017/abstracts/3008.html
Никогда не было и вот снова случилось! Компания Google в результате перенаправления трафика сделала недостпуными в Японии несколько тысяч различных сервисов, большинство из которых никак не связано с самой компанией Google. Однако, подобные инциденты происходят с завидной регулярностью, вот только не всегда попадают в большие СМИ. У таких инцидентов могут быть разные причины, начиная от ошибок сетевых инженеров и заканчивая государственным регулированием.
...
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)Ontico
HighLoad++ 2017
Зал «Мумбай», 8 ноября, 14:00
Тезисы:
http://www.highload.ru/2017/abstracts/2925.html
Облака и виртуализация – современные тренды развития IT-технологий. Операторы связи строят свои TelcoClouds на стандартах NFV (Network Functions Virtualization) и SDN (Software-Defined Networking). В докладе начнем с основ виртуализации, далее разберемся, для чего используются NFV и SDN, потом полетим к облакам и вернемся на землю для решения практических задач!
...
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Ontico
HighLoad++ 2017
Зал «Мумбай», 8 ноября, 10:00
Тезисы:
http://www.highload.ru/2017/abstracts/3045.html
Как мы заставили Druid работать в Одноклассниках.
«Druid is a high-performance, column-oriented, distributed data store» http://druid.io.
Мы расскажем о том, как, внедрив Druid, мы справились с ситуацией, когда MSSQL-based система статистики на 50 терабайт стала:
- медленной: средняя скорость ответа была в разы меньше требуемой (и увеличилась в 20 раз);
- нестабильной: в час пик статистика отставала до получаса (теперь ничего не отстает);
- дорогой: изменилась политика лицензирования Microsoft, расходы на лицензии могли составить миллионы долларов.
...
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Ontico
HighLoad++ 2017
Зал «Рио-де-Жанейро», 8 ноября, 18:00
Тезисы:
http://www.highload.ru/2017/abstracts/2905.html
Прошло более года с того момента, как Microsoft выпустила первую версию своего нового фреймворка для разработки web-приложений ASP.NET Core, и с каждым днем он находит все больше поклонников. ASP.NET Core базируется на платформе .NET Core, кроссплатформенной версии платформы .NET c открытым исходным кодом. Теперь у С#-разработчиков появилась возможность использовать Mac в качестве среды разработки, и запускать приложения на Linux или внутри Docker-контейнеров.
...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...Ontico
HighLoad++ 2017
Зал «Рио-де-Жанейро», 8 ноября, 14:00
Тезисы:
http://www.highload.ru/2017/abstracts/2913.html
Изначально будут раскрыты базовые причины, которые заставили появиться такой части механизма СУБД, как кэш результатов, и почему в ряде СУБД он есть или отсутствует.
Будут рассмотрены различные варианты кэширования результатов как sql-запросов, так и результатов хранимой в БД бизнес-логики. Произведено сравнение способов кэширования (программируемые вручную кэши, стандартный функционал) и даны рекомендации, когда и в каких случаях данные способы оптимальны, а порой опасны.
...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Ontico
HighLoad++ 2017
Зал «Рио-де-Жанейро», 8 ноября, 13:00
Тезисы:
http://www.highload.ru/2017/abstracts/2947.html
Apache Ignite — Open Source платформа для высокопроизводительной распределенной работы с большими данными с применением SQL или Java/.NET/C++ API. Ignite используют в самых разных отраслях. Сбербанк, ING, RingCentral, Microsoft, e-Therapeutics — все эти компании применяют решения на основе Ignite. Размеры кластеров разнятся от всего одного узла до нескольких сотен, узлы могут быть расположены в одном ЦОД-е или в нескольких геораспределенных.
...
HighLoad++ 2017
Зал «Рио-де-Жанейро», 8 ноября, 12:00
Тезисы:
http://www.highload.ru/2017/abstracts/3005.html
Когда мы говорим о нагруженных системах и базах данных с большим числом параллельных коннектов, особый интерес представляет практика эксплуатации и сопровождения таких проектов. В том числе инструменты и механизмы СУБД, которые могут быть использованы DBA и DevOps-инженерами для решения задач мониторинга жизнедеятельности базы данных и ранней диагностики возможных проблем.
...
1. Управляемый code injection:
как мы считаем все
пользовательские отчёты за один проход
в системе интернет-статистики Openstat
Михаил Якшин
http://www.openstat.ru/
myakshin@openstat.ru
2. О чём этот доклад
● Какие бывают отчёты в веб-аналитике?
● Как эти отчёты реализуются традиционно и не
очень традиционно?
● Как посчитать много отчётов в одном потоке?
● Какую пользу из этого можно извлечь?
4. Типы отчётов
● Стандартные отчёты – предоставляются всем
клиентам по умолчанию, не требуют никакой
дополнительной настройки
● Хорошо параллелизуются и считаются на потоке
● Нестандартные отчёты – требуют понимания
специфики задач клиента, дополнительной
настройки или программирования
● Возникает проблема с параллелизацией и
масштабированием
5. Типы отчётов
Стандартные: Нестандартные:
● Популярные страницы ● Разделы сайта
● Точки входа, точки выхода ● Характеристики посетителей
● Источники трафика ● Популярные темы и
комментарии в форуме
● Браузеры
● Продажи интернет-магазина
● Операционные системы
● Каналы привлечения аудитории
● Экранные разрешения
● SEO
● Мобильные устройства
● ...
● География
● ...
6. Тридцатисекундный экскурс
в термины веб-аналитики
● Просмотры (Pageviews) – события загрузки
страницы сайта посетителем
● Визиты/сессии (Visits/Sessions) –
последовательность обращений посетителя к сайту,
интервал между которыми не превышает 30 минут
● Посетители (Visitors) – пользователи, совершившие
обращение к сайту и идентифицируемые некоторым
образом (по IP, cookie и т.д.)
7. Про термины в картинках
Посетитель 1 Не менее 30 минут
Посетитель 2
Посетитель 3
t
P = 14 S=4 V=3
8. Какие отчёты заказывают
потребители веб-аналитики? (1)
Раздел P S V
Новости 4905 490 301
Пресс-релизы 3691 527 301
Магазин 4548 413 391
Техподдержка 2548 509 364
Файлы 4092 511 378
9. Какие отчёты заказывают
потребители веб-аналитики? (2)
Пол → Мужской Женский Всего
Раздел ↓
Новости 80 15 95
Статьи 60 50 110
Магазин 50 100 150
На пересечении – один из показателей,
например, P – число pageviews
10. Какие отчёты заказывают
потребители веб-аналитики? (3)
Группа ↓ Источник → SEO Поисковики Контекст Прямые
Товар ↓ переходы
Кабель
UTP 30 90 60 100
STP 40 20 0 740
Коннекторы
RJ45 80 150 300 30
На пересечении – один из показателей,
например, V – число уникальных посетителей
11. Level 1: сегментация
”Сегменты” – механизм для построения статистики
по характеристикам, которые:
● имеют относительно немного интересующих
значений, например:
● пол: мужской / женский
● география: Москва / остальная Россия / зарубежье
● совершил ли посетитель целевое действие: да / нет
● не изменяются на протяжении визита
12. Пользовательские сегменты
● Сегмент – бинарная характеристика визита; визит
либо относится к сегменту (1), либо не относится к
нему (0)
● Сегмент задается в виде булевой функции,
оперирующих полями лога, например:
● se_name=”Google”
● geo_country=”RU” AND browser=”Firefox”
● Если хотя бы в одном событии визита функция
вернула true, то весь визит относится к сегменту
13. Иллюстрация работы сегмента
Условие: se_name = ”Google”
(”посетители, пришедшие на сайт с Google”)
”Google” ”Bing”
14. Иллюстрация работы сегмента
Условие: se_name = ”Google”
(”посетители, пришедшие на сайт с Google”)
”Google” ”Bing”
15. Иллюстрация работы сегмента
Условие: se_name = ”Google”
(”посетители, пришедшие на сайт с Google”)
”Google” ”Bing”
16. Иллюстрация работы сегмента
Условие: se_name = ”Google”
(”посетители, пришедшие на сайт с Google”)
”Google” ”Bing”
18. Как это выглядит внутри в отчёте
ID счётчика Сегмент Провайдер S
1234567 0 Всего 51352
1234567 0 Ростелеком 5336
1234567 0 Корбина 2270
1234567 0 Билайн 1637
1234567 0 ... ...
1234567 1 Всего 1584
1234567 1 Ростелеком 31
1234567 1 Корбина 33
1234567 1 Билайн 104
1234567 1 ... ...
19. Схема процесса работы с сегментами
Сайт Логи
Вычисление
битмаска сегментов
Отчёты Расчёт
Расчёт
стандартных Битмаски
стандартных
отчётов сегментов
отчётов
20. Level 2: пользовательские отчёты
Сегменты не годятся в том случае, если:
● Нужно посчитать статистику по характеристике,
изменяющейся в течении сессии
● например, посещаемый раздел сайта
● Число интересных значений характеристики
исчисляется сотнями, тысячами, миллионами
● например, ассортимент товаров в интернет-магазине
21. Традиционный отчёт
на базе Apache Hadoop
● Создается код для нескольких job'ов, реализующих
цепочку:
mapper → reducer [→ mapper → reducer → …]
● На вход подаются все логи
● Нужно следить за корректным запуском job'ов в
нужном порядке и передаче промежуточных
результатов от одного job'а к другому
22. Level up: Hadoop + Cascading
Переходим от терминов map-reduce к
использованию готовых примитивов:
● Function – преобразование 1 строчки в 0..N
● Filter – проверяет условие, оставляет или нет 1
строчку
● Aggregator – реализует итератор над группой:
initializer, iterator, finalizer
● Buffer – предоставляет Java Iterator по группе
23. Cascading: пример
// Вычисляем названия разделов из URL
pipe = new Each(pipe, new DeriveSections(), Fields.ALL);
// Задаем группировку
pipe = new GroupBy(
pipe,
new Fields(F_COUNTER_ID, F_SECTION_NAME),
new Fields(F_VIS_ID, F_SESSION_ID, F_ID)
);
// Делаем агрегацию того, что нагруппировали
pipe = new Every(
pipe,
new BuildVPSE()
);
24. Насколько сложно написать такой
отчёт?
● Основной код: 3 строчки (на предыдущем слайде)
● DeriveSections: ~25 строчек
● BuildVPSE: ~200 строчек
● Трудозатраты: порядка часа-два
(50-70% времени – написание тестов)
● BuildVPSE – единожды написанный агрегатор,
применяется во всех отчётах
25. Чем плох такой отчёт?
● Писать отдельную задачу для каждого отчёта
затратно
● Запуск отдельных задач на каждый отчёт - затратен
● Поднимать с диска все данные всех счётчиков для
обработки одного отчёта - затратно
26. Как можно улучшить ситуацию?
● Очевидно – найти у отчётов что-то общее и
попробовать объединить расчёт всех отчётов в один
проход
● На первый взгляд – это кажется сложным
27. Плоское представление двумерных
отчётов
Раздел Пол P
Новости Мужской 80
Пол → Мужской Женский Всего Статьи Мужской 60
Раздел Магазин Мужской 50
↓
Новости Женский 15
Новости 80 15 95
Статьи Женский 50
Статьи 60 50 110 Магазин Женский 100
Магазин 50 100 150 Новости Всего 95
Статьи Всего 110
Магазин Всего 150
28. Плоское представление
трёхмерных отчётов
Группа ↓ Источник → SEO Поис Кон Группа Това Источник V
Товар ↓ кови текст р
ки Кабель UTP SEO 30
Кабель Кабель STP SEO 40
UTP 30 90 60 Коннекторы RJ45 SEO 80
STP 40 20 0 Кабель UTP Поисковики 90
Коннекторы Кабель STP Поисковики 20
RJ45 80 150 300 Коннекторы RJ45 Поисковики 150
Кабель UTP Контекст 60
Кабель STP Контекст 0
Коннекторы RJ45 Контекст 300
... ... ... ...
29. Основная идея
Все подобные отчёты можно уложить в одну общую
схему:
● Некая специфичная для отчёта функция-обработчик
● Группировка
● Агрегация
30. Схематично, в терминах Cascading
// Вычисляем пользовательскую функцию
pipe = new Each(pipe, new UserFunction(), Fields.ALL);
// Задаем группировку В этом коде нужно
изменять только эти
pipe = new GroupBy( 2 вещи!
pipe,
new Fields(F_COUNTER_ID, GROUP_BY_FIELDS),
new Fields(F_VIS_ID, F_SESSION_ID, F_ID)
);
// Делаем агрегацию того, что нагруппировали
pipe = new Every(
pipe,
new BuildVPSE()
);
31. Маленькая проблема №1: разные
размерности набора полей группировки
● Для одномерного отчета:
● (раздел)
● Для двумерного:
● (раздел, пол)
● Для трёхмерного:
● (группа товаров, товар, источник трафика)
32. Решение проблемы разных
размерностей: вложенные Tuple
Конвертируем исходный поток, собирая и все поля
из условия группировки в одно поле с вложенным
Tuple:
Единое поле,
● Было: которому можно
[ счётчик, раздел, … ] присвоить
[ счётчик, раздел, пол, … ] название и
задать это
● Стало: название в
[ счётчик, [раздел], …] условии
[ счётчик, [раздел, пол], … ] группировки
33. Проблема №2: code injection
Нужно дать возможность выполнять на кластере в
рамках первоначального преобразования строчки
(Function в терминах Cascading) произвольный
пользовательский код:
// Вычисляем пользовательскую функцию
pipe = new Each(pipe, new UserFunction(), Fields.ALL);
34. Чем это плохо?
● Функция может быть тяжелой и затратной
● Разумеется, проблемы с безопасностью
● Плохая локальность и много пересчёта: отчёты
считаются, как правило, за большие периоды, а
результат функции зависит только от конкретной
строчки и может быть расчитан прямо при
получении строчки
35. Решение в реальном мире
● Аналогично работе с сегментами, разделим процесс
на 2 этапа:
Вычисление
Сайт Логи пользовательской
функции
Отчёты Расчёт
пользовательских Вычисленные
отчётов значения
36. Этапы расчёта: первый этап
● Производится как можно чаще (например, раз в час)
● Расчёт значений вынесен в отдельный job – легко
контролировать injection, устанавливать лимиты
используемых ресурсов, выделять по JVM каждому
● Пользовательский Java-код по необходимости на
лету компилируется с помощью Janino
37. Этапы расчёта: второй этап
● Производится по необходимости
● Как правило – за отчётный период – раз в сутки, в
неделю, в месяц и т.д.
● Только выбирает и использует нужные заранее
вычисленные значения
● Не имеет никакого code injection
● Имеет гарантированную алгоритмическую
сложность и чётко прогнозируемое время
выполнения
38. Обеспечение безопасности
выполнения чужого кода
● Каждому счётчику – отдельный mapper ⇒
выделенный процесс JVM
● Выполнение кода с максимально урезанными
правами под Java security manager
● Контроль за потребляемыми ресурсами средствами
ОС
● В перспективе – можно реализовать полноценную
виртуализацию отдельных JVM
39. Потенциальные угрозы
● Выполнение ”опасных” действий (открытие сокетов,
локальных файлов, запуск процессов, доступ к
среде)
⇒ SecurityException
● Перерасход ресурсов JVM
⇒ JVM аварийно завершается с OutOfMemoryException
● Перерасход ресурсов процесса ОС (процессорное
время)
⇒ ОС убивает JVM по исчерпании ресурса
40. Пример
пользовательского кода
public class SectionFirstPathComponent extends RST {
@Override
public void process(TupleEntry in, CVMap out) {
String pagePath = in.getString(F_PAGE_PATH);
long flag = in.getLong(F_FLAG);
if (pagePath.length() >= 1
&& ((flag & (FLAG_PAGE_EXTERNAL | FLAG_NOT_PAGE_VIEW)) ==
0L)) {
int p = pagePath.indexOf('/', 1);
if (p == -1) {
out.put("section", pagePath.substring(1));
} else {
out.put("section", pagePath.substring(1, p));
}
}
}
}
41. Настройка
пользовательского отчёта
Настройка самого отчёта, т.е.:
● что группировать
● что агрегировать
● как агрегировать
● как отображать результат в веб-интерфейсе
реализуется в виде простого YAML/JSON файла.
42. Пример описания
пользовательского отчёта
ecommerce.geo.region:
Заказывается GroupBy
gb: по 2 полям
- geo.country
- geo.region Заказывается сумма
поля order.total
sum:
- order.total
Заказывается
cd: COUNT DISTINCT
поля order.id
- order.id
43. Полная схема работы системы
Вычисление Вычисление
Сайт Логи польз. Значения польз. Битмаски
сегментов
функции сегментов
Расчёт Расчёт
Отчёты пользовательских Расчёт
стандартных
стандартных
отчётов отчётов
отчётов
44. Что в итоге получили пользователи?
● Сегменты могут создавать все пользователи из
удобного конструктора в веб-интерфейсе
● Продвинутые пользователи могут сами настраивать
себе отчёты практически произвольной сложности,
написав несколько строчек кода на Java и описав
вид желаемого отчёта
● Менее продвинутым пользователям это поможет
сделать служба внедрения
45. А что получили мы?
Общий объем пользовательских отчётов ежедневно:
● 100 мегабайт
● 1.2 млн строчек
● ~10000 отчётов
46. Наша экономия
● Обычный отчёт за сутки считается за время от ~3
до ~30 машиночасов* в зависимости от сложности
● Все пользовательские отчёты считаются за один
проход длиной 32-35 машиночасов* в сутки
● 10000 x (3..30) = (30000..300000) vs (32..35)
● Итого – экономия на 3-4 порядка
*
корректнее – ядрочасов