Spark - можно ли транслировать функцию? - PullRequest
0 голосов
/ 07 октября 2018

Это, вероятно, глупый вопрос, но я хотел быть уверен, можно ли транслировать функцию в Spark, а не только данные.

Я знаю, что могу транслировать данные, например,

scala> val myList=List(1,2,3)
myList: List[Int] = List(1, 2, 3)

scala> sc.broadcast(myList)
res112: org.apache.spark.broadcast.Broadcast[List[Int]] = Broadcast(7)

, но как насчет функции?Например,

scala> def sum(a:Int):Int={
     | val b=a+1
     | b
     | }
sum: (a: Int)Int

scala> sc.broadcast(sum(_))
res113: org.apache.spark.broadcast.Broadcast[Int => Int] = Broadcast(8)

Это действительно мой метод вещания sum?Каким-то образом это означает, что у каждого узла теперь есть «копия» метода sum, и, возможно, я мог бы распараллелить некоторые задания, в которых используется метод sum, возможно, путем трансляции некоторых данных.Это правильно?

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

Да! Можно передать всю функцию в переменную широковещания.
Если ваш алгоритм (функция) изменяется в зависимости от действия / события / времени, вы можете использовать этот подход.Новая функция будет выполнена с остальными данными.

def doubleFunction(a: Int):Int={a*2} // function returns the double of input data
val broadcastFunction = sc.broadcast(doubleFunction(_))


val data = sc.parallelize(1 to 10000,4) // sample data

val output1 = data.map(x=>{
    val localDoubleFunction = broadcastFunction.value
    localDoubleFunction(x) // using function passed in broadcast variable
}).reduce(_+_)
//output1: Int = 100010000
**// Runtime: 78ms**


val output2 = data.map(x=>{
    doubleFunction(x) //local broadcast function
}).reduce(_+_)
//output2: Int = 100010000
**//Runtime: 200 ms**

Spark Web UI

0 голосов
/ 07 октября 2018

Широковещательные рассылки обычно используются для небольших объемов данных, которые могут легко храниться в памяти исполнителя.Это сделано для кэширования копии данных, чтобы при выполнении реальных задач эти небольшие данные не приходилось перемещать между исполнителями.Вы можете прочитать больше здесь: https://spark.apache.org/docs/1.6.0/api/java/org/apache/spark/broadcast/Broadcast.html

Теперь, если вы хотите написать свою собственную функцию и использовать эту функцию для некоторых параллельных вычислений, вы должны смотреть на UDF (https://medium.com/@mrpowers/spark-user-defined-functions-udfs-6c849e39443b).)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...