Нужно ли транслировать объект-член в Spark? - PullRequest
0 голосов
/ 26 марта 2019

Скажем, у меня есть объект, и мне нужно сделать некоторые операции с участником этого объекта: arr.

object A {
  val arr = (0 to 1000000).toList
  def main(args: Array[String]): Unit = {
    //...init spark context
    val rdd: RDD[Int] = ...
    rdd.map(arr.contains(_)).saveAsTextFile...
  }
}

В чем разница между вещаемым arr и не вещаемым?т.е.

val arrBr = sc.broadcast(arr)
rdd.map(arrBr.value.contains(_))

и

rdd.map(arr.contains(_))

По моему мнению, объект A является одноэлементным объектом, поэтому он будет передаваться через узлы в Spark.

Нужно ли использовать трансляцию в этом сценарии?

Ответы [ 2 ]

2 голосов
/ 26 марта 2019

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

4B x 1000000 = 4000000B ~ 4GB

, которое уже превышает значение по умолчанию 4 МБ и может управляться путем изменения значения на spark.broadcast.blockSize.

Еще один фактор для принятия решенияиспользовать или нет трансляцию, когда у вас есть объединений и вы хотите избежать перетасовки.Посредством широковещательной передачи кадра данных ключи будут сразу же доступны в узле, что позволит избежать извлечения данных из разных узлов (тасование).

2 голосов
/ 26 марта 2019

В случае

rdd.map(arr.contains(_))

arr серийно поставляется для каждой задачи

в то время как

val arrBr = sc.broadcast(arr)
rdd.map(arrBr.value.contains(_))

это делается только один раз для каждого исполнителя.

Поэтому вы должны использовать трансляцию при работе с большими структурами данных.

...