$30 off During Our Annual Pro Sale. View Details »

[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. Этот слайд пустой… Так надо…

    View Slide

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

    View Slide

  3. @gAmUssA @hazelcast #jbreak #hazelcastjet
    Solutions Architect
    Developer Advocate
    @gamussa в интернетах
    А ты зафоловил меня в Twitter? ©
    > Кто?

    View Slide

  4. @gAmUssA @hazelcast #jbreak #hazelcastjet
    О чем поговорим?
    Стримы в Java 8
    Распределяй и властвуй
    Распределенные стримы
    Как? Зачем?

    View Slide

  5. View Slide

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

    View Slide

  7. View Slide

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

    View Slide

  9. @gAmUssA @hazelcast #jbreak #hazelcastjet
    Что будем считать?

    View Slide

  10. View Slide

  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
    );
    }
    }

    View Slide

  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
    );
    }
    }

    View Slide

  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
    );
    }
    }

    View Slide

  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
    );
    }
    }

    View Slide

  15. java.util.stream

    View Slide

  16. @gAmUssA @hazelcast #jbreak #hazelcastjet
    Стримы в Java 8…
    Абстракция для представления
    последовательности элементов
    Не является самостоятельной структурой
    «проводят» элемент через конвейер
    преобразований
    Не меняют источника данных

    View Slide

  17. View Slide

  18. @gAmUssA @hazelcast #jbreak #hazelcastjet
    java.util.stream
    map(), flatMap(), filter()
    reduce(), collect()
    sorted(), distinct()
    Intermediate operation
    Terminal operation
    Stateful Intermediate (Blocking) operation

    View Slide

  19. View Slide

  20. View Slide

  21. View Slide

  22. View Slide

  23. View Slide

  24. View Slide

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

    View Slide

  26. @gAmUssA @hazelcast #jbreak #hazelcastjet
    А что если… ©
    Параллельное выполнение межу
    JVM процессами
    Иметь распределенные данные
    Поддержка сериализации лямбд
    Сериализуемые результаты и
    распределенные данные

    View Slide

  27. http://cs.yale.edu/homes/xs45/pdf/ssgos-vldb2014.pdf

    View Slide

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

    View Slide

  29. View Slide

  30. View Slide

  31. View Slide

  32. @gAmUssA @hazelcast #jbreak #hazelcastjet
    Why would one need a cluster?

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  37. @gAmUssA @hazelcast #jbreak #hazelcastjet
    Oracle Coherence
    Map 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));

    View Slide

  38. @gAmUssA @hazelcast #jbreak #hazelcastjet
    Infinispan
    In-memory data grid
    распределённые кэши
    Куча всяких интеграций
    Лицензия Apache v2

    View Slide

  39. @gAmUssA @hazelcast #jbreak #hazelcastjet
    Еще хотелки…
    Простота
    знакомый API
    встраиваемость
    Cloud Native

    View Slide

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

    View Slide

  41. 1 900 звездочек
    GitHub
    100%
    Open Source
    134 контрибьютера

    View Slide

  42. View Slide

  43. View Slide

  44. View Slide

  45. @gAmUssA @hazelcast #jbreak #hazelcastjet
    Green
    Primary
    Green
    Backup
    Green
    Shard

    View Slide

  46. @gAmUssA @hazelcast #jbreak #hazelcastjet
    Ну и в чем же проблема?
    IMap.values().stream() ?
    или
    IMap.entrySet().stream() ?
    4
    6

    View Slide

  47. @gAmUssA @hazelcast #jbreak #hazelcastjet
    А ты не лопнешь, деточка ©?
    OutOfMemoryError

    View Slide

  48. View Slide

  49. 4
    9
    Jet Streams

    View Slide

  50. jet.hazelcast.org

    View Slide

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

    View Slide

  52. @gAmUssA @hazelcast #jbreak #hazelcastjet
    DAG
    vertex vertex
    vertex vertex
    SOURCE
    SINK

    View Slide

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

    View Slide

  54. View Slide

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

    View Slide

  56. Áåí÷ìàðêè
    Сравниваем Spark, Flink, Hadoop используя WordCount
    Кластер: 9 нод, 40 ядер на каждой

    View Slide

  57. https://github.com/hazelcast/big-data-benchmark

    View Slide

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

    View Slide

  59. @gAmUssA @hazelcast #jbreak #hazelcastjet
    Надо брать пока горячо!!!
    jet.hazelcast.org
    hazelcast/hazelcast-jet
    http://bit.ly/streams_jbreak2017
    документация
    Код на github
    Материалы презентации

    View Slide

  60. @gAmUssA @hazelcast #jbreak #hazelcastjet
    В качестве заключения
    Стримы предоставляют
    функциональный API для запросов и
    агрегаций

    View Slide

  61. @gAmUssA @hazelcast #jbreak #hazelcastjet
    Распределенные стримы
    Параллелизация на кластере
    Запись данных на кластер
    Стабильные результаты даже при
    падениях нод

    View Slide

  62. View Slide

  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:

    View Slide

  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...

    View Slide

  65. @gAmUssA @hazelcast #jbreak #hazelcastjet
    Extra graphics

    View Slide