Демистификация разбиения на разделы в Spark



В этом блоге рассказывается все, что вам нужно знать о разбиении на разделы в Spark, типах разделов и о том, как это улучшает скорость выполнения преобразований на основе ключей.

Предоставлено Притхвираджем Босом

Spark’s Устойчивые распределенные наборы данных (программная абстракция) вычисляются лениво, а преобразования сохраняются в виде ориентированных ациклических графов (DAG). Таким образом, каждое действие в RDD заставит Spark пересчитывать DAG. Таким образом достигается отказоустойчивость в Spark, потому что в случае отказа любого рабочего узла DAG просто необходимо пересчитать.





как установить php на windows 7

Это также обязательно кешировать (сохранить с соответствующим уровнем хранения) RDD, чтобы частые действия с RDD не заставляли Spark повторно вычислять DAG.Темы, затронутые в этом блоге, по существу необходимы для сертификации Apache Spark и Scala. Темы, затронутые в этом блоге, необходимы для .

Зачем использовать разделитель?

В кластерных вычислениях главная задача - минимизировать сетевой трафик. Когда данные ориентированы на ключ-значение, разделение становится обязательным, потому что для последующих преобразований в RDD происходит изрядное перемешивание данных по сети. Если похожие ключи или диапазон ключей хранятся в одном разделе, то тасование сводится к минимуму, и обработка становится существенно быстрой.



Преобразования, требующие перетасовки данных между рабочими узлами, значительно выигрывают от разделения. Такие преобразования cogroup, groupWith, join, leftOuterJoin, rightOuterJoin, groupByKey, reduceByKey ,commonByKey и искать .

Разделы можно настраивать при условии, что RDD основан на ключ-значении.

Свойства раздела

  1. Кортежи в одном разделе гарантированно находятся на одной машине.
  2. Каждый узел в кластере может содержать более одного раздела.
  3. Общее количество разделов настраивается, по умолчанию оно равно общему количеству ядер на всех узлах исполнителя.

Типы разбиения в Spark

Spark поддерживает два типа разделения:

  • Разбиение хэша : Использует Java Object.hashCode метод определения раздела как partition = key.hashCode ()% numPartitions.

hash-partitioning-demystifying-partitioning-in-spark



  • Разделение диапазона : Использует диапазон для распределения по соответствующим разделам ключей, попадающих в этот диапазон. Этот метод подходит для случаев, когда ключи упорядочены естественным образом, а ключи неотрицательны. В приведенном ниже фрагменте кода показано использование разделителя диапазонов.

Пример кода

Давайте посмотрим на пример того, как разделить данные по рабочим узлам. Доступен полный код Scala Вот .

Вот некоторые тестовые данные 12 координат (в виде кортежей),

Создать org.apache.spark.HashPartitioner размером 2, где ключи будут разделены по этим двум разделам на основе хэш-кода ключей.

Затем мы можем проверить пары и выполнить различные преобразования на основе ключей, такие как foldByKey и reduceByKey.

Подводя итог, разбиение на разделы значительно увеличивает скорость выполнения преобразований на основе ключей.

Есть вопрос к нам? Пожалуйста, отметьте это в разделе комментариев, и мы свяжемся с вами.

Похожие сообщения:

Почему вы должны изучить Spark после освоения Hadoop

разница между интерфейсом и классом

Apache Spark против Hadoop MapReduce