Вы из тех, кто гонится за производительностью, запихивая в любой цикл Collection.parallelStream()? Задумываетесь, как обойтись без глобальной переделки кода и решить все проблемы с помощью большего количества серверов? Как получить распределённую обработку с линейным ростом производительности? Если подобные вопросы звучат у вас в голове, тогда этот доклад для вас. Оказывается, лишь немногие могут запускать Streams в распределенном режиме — Oracle Coherence, Infinispan, Hazelcast Jet — кто-то за деньги, кто-то бесплатно. На примере Hazelcast Jet Виктор расскажет обо всех деталях распределённой обработки. Кроме того, познакомит слушателей со своим другом Ориентированным Ациклическим Графом и покажет, как с его помощью организована обработка информации поверх API Java 8 Stream. Распределенная! Высокопроизводительная! «В памяти»!
3. @gAmUssA @hazelcast #jbreak #hazelcastjet
О чем поговорим?
Стримы в Java 8
Распределяй и властвуй
Распределенные стримы
Как? Зачем?
4.
5. @gAmUssA @hazelcast #jbreak #hazelcastjet
Пример: Считаем слова
Map<Integer, String>, где
ключ - номер строки, а
значение – строка из файла.
Сколько раз каждое слово встречается?
найти Top X слов *
6.
7. @gAmUssA @hazelcast #jbreak #hazelcastjet
Что для этого надо?
Проходим по всем строкам в файле
Разбиваем строки на слова
Обновляем значение счетчика по
каждому слову
10. fillMapWithData("pestni.txt", source);
for (String line : source.values()) {
for (String word : PATTERN.split(line)) {
if (word.length() >= 5)
counts.compute(
cleanWord(word).toLowerCase(),
(w, c) -> c == null ? 1L : c + 1
);
}
}
11. Проходим по всем строкам в файле
fillMapWithData("pestni.txt", source);
for (String line : source.values()) {
for (String word : PATTERN.split(line)) {
if (word.length() >= 5)
counts.compute(
cleanWord(word).toLowerCase(),
(w, c) -> c == null ? 1L : c + 1
);
}
}
12. Разбиваем строки на слова
fillMapWithData("pestni.txt", source);
for (String line : source.values()) {
for (String word : PATTERN.split(line)) {
if (word.length() >= 5)
counts.compute(
cleanWord(word).toLowerCase(),
(w, c) -> c == null ? 1L : c + 1
);
}
}
13. Обновляем значение счетчика по каждому слову
fillMapWithData("pestni.txt", source);
for (String line : source.values()) {
for (String word : PATTERN.split(line)) {
if (word.length() >= 5)
counts.compute(
cleanWord(word).toLowerCase(),
(w, c) -> c == null ? 1L : c + 1
);
}
}
15. @gAmUssA @hazelcast #jbreak #hazelcastjet
Стримы в Java 8…
Абстракция для представления
последовательности элементов
Не является самостоятельной структурой
«проводят» элемент через конвейер
преобразований
Не меняют источника данных
27. @gAmUssA @hazelcast #jbreak #hazelcastjet
Что нам стоит распределенный стрим
построить
Stream extends DistributedStream
DistributedStream extends Stream
Что-то еще?
39. @gAmUssA @hazelcast #jbreak #hazelcastjet
Для тех кто в танке - Hazelcast IMDG
In-memory Data Grid
Бесплатно Apache v2
Распределенные
Кэши (IMap, JCache)
Java коллекции (IList, ISet, IQueue)
Обмен сообщениями (Topic, RingBuffer)
Вычисления (ExecutorService, M-R)
50. @gAmUssA @hazelcast #jbreak #hazelcastjet
Что такое Jet?
Библиотека для распределенных
вычислений
Основана на описании модели с помощью
графа
Основана на Hazelcast IMDG
Будем сравнивать Spark or Flink
5
0
54. @gAmUssA @hazelcast #jbreak #hazelcastjet
Исполнение графа
Каждая нода кластера исполняет граф целиком
Каждая вершина графа исполняется набором
tasklet-ов
Ограниченное число «настоящих» потоком
~ кол-во процессоров
Work-stealing между потоками
Back pressure между вершинами
58. @gAmUssA @hazelcast #jbreak #hazelcastjet
Надо брать пока горячо!!!
jet.hazelcast.org
hazelcast/hazelcast-jet
http://bit.ly/streams_jbreak2017
документация
Код на github
Материалы презентации
59. @gAmUssA @hazelcast #jbreak #hazelcastjet
В качестве заключения
Стримы предоставляют
функциональный API для запросов и
агрегаций
60. @gAmUssA @hazelcast #jbreak #hazelcastjet
Распределенные стримы
Параллелизация на кластере
Запись данных на кластер
Стабильные результаты даже при
падениях нод
61.
62. SlidesCarnival icons are editable
shapes.
This means that you can:
● Resize them without losing quality.
● Change fill color and opacity.
Isn’t that nice? :)
Examples:
63. Now you can use any emoji as an icon!
And of course it resizes without losing quality and you can change the color.
How? Follow Google instructions
https://twitter.com/googledocs/status/730087240156643328
✋👆👉👍👤👦👧👨👩👪💃🏃💑❤😂
😉😋😒😭👶😸🐟🍒🍔💣📌📖🔨🎃🎈
🎨🏈🏰🌏🔌🔑and many more...
😉