2016-11-23 47 views
5

Zastanawiam się, co różni się za pomocą iskier mapPartitions funkcjonalność vs przejściowy leniwy val.
Ponieważ każda partycja działa w zasadzie na innym węźle, każda instancja przejściowego leniwego val zostanie utworzona dla każdego węzła (zakładając, że jest w obiekcie).Spark mapPartitions vs transient lazy val

Na przykład:

class NotSerializable(v: Int) { 
    def foo(a: Int) = ??? 
} 

object OnePerPartition { 
    @transient lazy val obj: NotSerializable = new NotSerializable(10) 
} 

object Test extends App{ 
    val conf = new SparkConf().setMaster("local[2]").setAppName("test") 
    val sc = new SparkContext(conf) 

    val rdd: RDD[Int] = sc.parallelize(1 to 100000) 

    rdd.map(OnePerPartition.obj.foo) 

    // ---------- VS ---------- 

    rdd.mapPartitions(itr => { 
     val obj = new NotSerializable(10) 
     itr.map(obj.foo) 
    }) 
} 

Można by zapytać, dlaczego byś nawet chcą go ...
Chciałbym stworzyć ogólne pojęcie pojemnik na moją logikę działa na dowolnym rodzajowy realizacji zbiórki (RDD, List , scalding pipe, itp.)
Wszystkie z nich mają pojęcie "mapy", ale mapPartition jest unikalny dla spark.

Odpowiedz

2

Przede wszystkim nie potrzebujesz tutaj transient tutaj. Korzystanie object opakowanie wystarczy, aby tę pracę i rzeczywiście można napisać to jako:

object OnePerExecutor { 
    val obj: NotSerializable = new NotSerializable(10) 
} 

Istnieje zasadnicza różnica między opakowaniu obiektu i inicjowanie NotSerializable wewnątrz mapPartitions. To:

rdd.mapPartitions(iter => { 
    val ns = NotSerializable(1) 
    ??? 
}) 

tworzy pojedynczą instancję NotSerializable na partycję.

Otoczka obiektu z drugiej strony tworzy pojedynczą instancję NotSerializable dla każdej maszyny wykonawczej JVM. W rezultacie ten przykład:

  • Może być używany do przetwarzania wielu partycji.
  • Można uzyskać dostęp jednocześnie przez wiele wątków executora.
  • Żywotność wykracza poza funkcję, w której jest używana.

Oznacza to, że powinien być bezpieczny dla wątków, a wszelkie wywołania metod powinny być efektami ubocznymi.