Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[JBreak] Блеск и Нищета Распределенных Стримов

[JBreak] Блеск и Нищета Распределенных Стримов

Вы из тех, кто гонится за производительностью, запихивая в любой цикл Collection.parallelStream()? Задумываетесь, как обойтись без глобальной переделки кода и решить все проблемы с помощью большего количества серверов? Как получить распределённую обработку с линейным ростом производительности? Если подобные вопросы звучат у вас в голове, тогда этот доклад для вас. Оказывается, лишь немногие могут запускать Streams в распределенном режиме — Oracle Coherence, Infinispan, Hazelcast Jet — кто-то за деньги, кто-то бесплатно. На примере Hazelcast Jet Виктор расскажет обо всех деталях распределённой обработки. Кроме того, познакомит слушателей со своим другом Ориентированным Ациклическим Графом и покажет, как с его помощью организована обработка информации поверх API Java 8 Stream. Распределенная! Высокопроизводительная! «В памяти»!

Viktor Gamov

April 04, 2017
Tweet

More Decks by Viktor Gamov

Other Decks in Technology

Transcript

  1. @gAmUssA @hazelcast #jbreak #hazelcastjet Solutions Architect Developer Advocate @gamussa в

    интернетах А ты зафоловил меня в Twitter? © > Кто?
  2. @gAmUssA @hazelcast #jbreak #hazelcastjet О чем поговорим? Стримы в Java

    8 Распределяй и властвуй Распределенные стримы Как? Зачем?
  3. @gAmUssA @hazelcast #jbreak #hazelcastjet Пример: Считаем слова Map<Integer, String>, где

    ключ - номер строки, а значение – строка из файла. Сколько раз каждое слово встречается? найти Top X слов *
  4. @gAmUssA @hazelcast #jbreak #hazelcastjet Что для этого надо? Проходим по

    всем строкам в файле Разбиваем строки на слова Обновляем значение счетчика по каждому слову
  5. 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 ); } }
  6. Проходим по всем строкам в файле 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 ); } }
  7. Разбиваем строки на слова 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 ); } }
  8. Обновляем значение счетчика по каждому слову 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 ); } }
  9. @gAmUssA @hazelcast #jbreak #hazelcastjet Стримы в Java 8… Абстракция для

    представления последовательности элементов Не является самостоятельной структурой «проводят» элемент через конвейер преобразований Не меняют источника данных
  10. @gAmUssA @hazelcast #jbreak #hazelcastjet java.util.stream map(), flatMap(), filter() reduce(), collect()

    sorted(), distinct() Intermediate operation Terminal operation Stateful Intermediate (Blocking) operation
  11. @gAmUssA @hazelcast #jbreak #hazelcastjet Нельзя просто так взять… © Параллельное

    выполнение возможно только внутри одного процесса JVM (читай parallelStream) Дизайн подразумевает локальные данные Несериализуемые лямбды используются API Результаты выполнения так же несериализуемые
  12. @gAmUssA @hazelcast #jbreak #hazelcastjet А что если… © Параллельное выполнение

    межу JVM процессами Иметь распределенные данные Поддержка сериализации лямбд Сериализуемые результаты и распределенные данные
  13. @gAmUssA @hazelcast #jbreak #hazelcastjet Что нам стоит распределенный стрим построить

    Stream extends DistributedStream DistributedStream extends Stream Что-то еще?
  14. @gAmUssA @hazelcast #jbreak #hazelcastjet Oracle Coherence Map<String, Integer> collect =

    source.stream() .flatMap(m -> Stream.of(PATTERN.split(m.getValue()))) .map(String::toLowerCase) .map(WordUtil::cleanWord) .filter(m -> m.length() >= 5) .collect(RemoteCollectors.toMap(ve1, ve2, Integer::sum));
  15. @gAmUssA @hazelcast #jbreak #hazelcastjet Для тех кто в танке -

    Hazelcast IMDG In-memory Data Grid Бесплатно Apache v2 Распределенные Кэши (IMap, JCache) Java коллекции (IList, ISet, IQueue) Обмен сообщениями (Topic, RingBuffer) Вычисления (ExecutorService, M-R)
  16. @gAmUssA @hazelcast #jbreak #hazelcastjet Ну и в чем же проблема?

    IMap.values().stream() ? или IMap.entrySet().stream() ? 4 6
  17. @gAmUssA @hazelcast #jbreak #hazelcastjet Что такое Jet? Библиотека для распределенных

    вычислений Основана на описании модели с помощью графа Основана на Hazelcast IMDG Будем сравнивать Spark or Flink 5 1
  18. @gAmUssA @hazelcast #jbreak #hazelcastjet Исполнение графа Каждая нода кластера исполняет

    граф целиком Каждая вершина графа исполняется набором tasklet-ов Ограниченное число «настоящих» потоком ~ кол-во процессоров Work-stealing между потоками Back pressure между вершинами
  19. @gAmUssA @hazelcast #jbreak #hazelcastjet Надо брать пока горячо!!! jet.hazelcast.org hazelcast/hazelcast-jet

    http://bit.ly/streams_jbreak2017 документация Код на github Материалы презентации
  20. @gAmUssA @hazelcast #jbreak #hazelcastjet Распределенные стримы Параллелизация на кластере Запись

    данных на кластер Стабильные результаты даже при падениях нод
  21. 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:
  22. 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...