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

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

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

0680be1c881abcf19219f09f1e8cf140?s=128

Viktor Gamov

April 04, 2017
Tweet

Transcript

  1. Этот слайд пустой… Так надо…

  2. Áëåñê è íèùåòà ðàñïðåäåëåííûõ ñòðèìîâ @gAmUssA @hazelcast #jbreak #hazelcastjet http://bit.ly/streams_jbreak2017

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

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

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

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

    всем строкам в файле Разбиваем строки на слова Обновляем значение счетчика по каждому слову
  9. @gAmUssA @hazelcast #jbreak #hazelcastjet Что будем считать?

  10. None
  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 ); } }
  14. Обновляем значение счетчика по каждому слову 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. java.util.stream

  16. @gAmUssA @hazelcast #jbreak #hazelcastjet Стримы в Java 8… Абстракция для

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

    sorted(), distinct() Intermediate operation Terminal operation Stateful Intermediate (Blocking) operation
  19. None
  20. None
  21. None
  22. None
  23. None
  24. None
  25. @gAmUssA @hazelcast #jbreak #hazelcastjet Нельзя просто так взять… © Параллельное

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

    межу JVM процессами Иметь распределенные данные Поддержка сериализации лямбд Сериализуемые результаты и распределенные данные
  27. http://cs.yale.edu/homes/xs45/pdf/ssgos-vldb2014.pdf

  28. @gAmUssA @hazelcast #jbreak #hazelcastjet Что нам стоит распределенный стрим построить

    Stream extends DistributedStream DistributedStream extends Stream Что-то еще?
  29. None
  30. None
  31. None
  32. @gAmUssA @hazelcast #jbreak #hazelcastjet Why would one need a cluster?

  33. @gAmUssA @hazelcast #jbreak #hazelcastjet Problem Data doesn’t fit just one

    machine
  34. Данных слишком много, чтобы они поместились на одной машине

  35. @gAmUssA @hazelcast #jbreak #hazelcastjet Данные слишком важны, чтобы хранить их

    на одной машине
  36. @gAmUssA @hazelcast #jbreak #hazelcastjet Oracle Coherence In-memory data grid Распределенные

    кэши RemoteStreams Коммерческий продукт
  37. @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));
  38. @gAmUssA @hazelcast #jbreak #hazelcastjet Infinispan In-memory data grid распределённые кэши

    Куча всяких интеграций Лицензия Apache v2
  39. @gAmUssA @hazelcast #jbreak #hazelcastjet Еще хотелки… Простота знакомый API встраиваемость

    Cloud Native
  40. @gAmUssA @hazelcast #jbreak #hazelcastjet Для тех кто в танке -

    Hazelcast IMDG In-memory Data Grid Бесплатно Apache v2 Распределенные Кэши (IMap, JCache) Java коллекции (IList, ISet, IQueue) Обмен сообщениями (Topic, RingBuffer) Вычисления (ExecutorService, M-R)
  41. 1 900 звездочек GitHub 100% Open Source 134 контрибьютера

  42. None
  43. None
  44. None
  45. @gAmUssA @hazelcast #jbreak #hazelcastjet Green Primary Green Backup Green Shard

  46. @gAmUssA @hazelcast #jbreak #hazelcastjet Ну и в чем же проблема?

    IMap.values().stream() ? или IMap.entrySet().stream() ? 4 6
  47. @gAmUssA @hazelcast #jbreak #hazelcastjet А ты не лопнешь, деточка ©?

    OutOfMemoryError
  48. None
  49. 4 9 Jet Streams

  50. jet.hazelcast.org

  51. @gAmUssA @hazelcast #jbreak #hazelcastjet Что такое Jet? Библиотека для распределенных

    вычислений Основана на описании модели с помощью графа Основана на Hazelcast IMDG Будем сравнивать Spark or Flink 5 1
  52. @gAmUssA @hazelcast #jbreak #hazelcastjet DAG vertex vertex vertex vertex SOURCE

    SINK
  53. @gAmUssA @hazelcast #jbreak #hazelcastjet Исполнение графа Каждая нода кластера исполняет

    граф целиком
  54. None
  55. @gAmUssA @hazelcast #jbreak #hazelcastjet Исполнение графа Каждая нода кластера исполняет

    граф целиком Каждая вершина графа исполняется набором tasklet-ов Ограниченное число «настоящих» потоком ~ кол-во процессоров Work-stealing между потоками Back pressure между вершинами
  56. Áåí÷ìàðêè Сравниваем Spark, Flink, Hadoop используя WordCount Кластер: 9 нод,

    40 ядер на каждой
  57. https://github.com/hazelcast/big-data-benchmark

  58. @gAmUssA @hazelcast #jbreak #hazelcastjet Сравним с обычными стримами

  59. @gAmUssA @hazelcast #jbreak #hazelcastjet Надо брать пока горячо!!! jet.hazelcast.org hazelcast/hazelcast-jet

    http://bit.ly/streams_jbreak2017 документация Код на github Материалы презентации
  60. @gAmUssA @hazelcast #jbreak #hazelcastjet В качестве заключения Стримы предоставляют функциональный

    API для запросов и агрегаций
  61. @gAmUssA @hazelcast #jbreak #hazelcastjet Распределенные стримы Параллелизация на кластере Запись

    данных на кластер Стабильные результаты даже при падениях нод
  62. None
  63. 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:
  64. 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...
  65. @gAmUssA @hazelcast #jbreak #hazelcastjet Extra graphics