Оптимизация Apache Spark Streaming с помощью rdd.cache и настройки сериализации данных.
Одним из эффективных способов существенного ускорения вашего Spark Streaming приложения, являвляется применения кеширования RDD а также конфигурация способа кеширования ваших данных.
При использовании rdd.cache первая операция по rdd будет занимать тоже время что и без применения кешированя, но все последующие операции будут занимать значительно меньше времени. Это может быть удивительно, ведь Spark стараеться делать все операции с данными в памяти. Это сложно понять, но приминение rdd.cache имеет значимый эффект..
Тесты показывают, что если DStream или RDD используется несколько раз, то их кеширование значительно увеличивает скорость их обработки. Возможно это будет являться тем изменением, что принесёт вам наибольшее улучшнеием производительности.
Пример применения rdd.cache:
Ещё одним интересным изменением может стать изменение StorageLevel для RDD или для KafkaUtils.createStream. Суть в том, что режим StorageLevel.MEMORY_ONLY позволяет избежать применения функций сериализации к данным. Это позволяет значительно повысить скорость обработки данных, но это также увеличивает выделяемое место(примерно раза в 2-3) в памяти под хранение данных, так как данные сохраняются в "сыром" виде.
На следующем графике наглядно видно как зависит время обработки данных в зависимости от режима сохранения данных(MEMORY_ONLY или MEMORY_ONLY_SER):
Как видно по графику, попробовать стоит, но только нужно помнить, что при очень больших размерах данных всё-таки лучше использовать сериализацию, так как это позволит существенно улучшить использование памяти а также снимит нагрузку на garbage collector вашей JVM.
Режим сериализации использует немного больше памяти чем занимает RDD. Сохранения данных в сыром виде(MEMORY_ONLY) использует в разы больше памяти на кеширование, чем весит RDD.
Способ применение сериализации:
Способ хранения в сыром виде:
При использовании rdd.cache первая операция по rdd будет занимать тоже время что и без применения кешированя, но все последующие операции будут занимать значительно меньше времени. Это может быть удивительно, ведь Spark стараеться делать все операции с данными в памяти. Это сложно понять, но приминение rdd.cache имеет значимый эффект..
Тесты показывают, что если DStream или RDD используется несколько раз, то их кеширование значительно увеличивает скорость их обработки. Возможно это будет являться тем изменением, что принесёт вам наибольшее улучшнеием производительности.
Пример применения rdd.cache:
dstream.foreachRDD{rdd =>
rdd.cache() // cache the RDD before iterating!
rdd.foreach{ key =>
rdd.filter(elem=> key(elem) == key).saveAsFooBar(...)
}
rdd.unpersist()
}
Ещё одним интересным изменением может стать изменение StorageLevel для RDD или для KafkaUtils.createStream. Суть в том, что режим StorageLevel.MEMORY_ONLY позволяет избежать применения функций сериализации к данным. Это позволяет значительно повысить скорость обработки данных, но это также увеличивает выделяемое место(примерно раза в 2-3) в памяти под хранение данных, так как данные сохраняются в "сыром" виде.
На следующем графике наглядно видно как зависит время обработки данных в зависимости от режима сохранения данных(MEMORY_ONLY или MEMORY_ONLY_SER):
Как видно по графику, попробовать стоит, но только нужно помнить, что при очень больших размерах данных всё-таки лучше использовать сериализацию, так как это позволит существенно улучшить использование памяти а также снимит нагрузку на garbage collector вашей JVM.
Режим сериализации использует немного больше памяти чем занимает RDD. Сохранения данных в сыром виде(MEMORY_ONLY) использует в разы больше памяти на кеширование, чем весит RDD.
Способ применение сериализации:
rdd.persist(StorageLevel.MEMORY_ONLY_SER)
Способ хранения в сыром виде:
rdd.persist(StorageLevel.MEMORY_ONLY) или rdd.cache()
Способ применения режима хранения для работы с Kafka:
val lines = KafkaUtils.createStream[String, String, StringDecoder, StringDecoder](ssc, kafkaParams, topicMap, StorageLevel.MEMORY_ONLY).map(_._2)

Коментарі
Дописати коментар