web-dev-qa-db-ja.com

@transientの有無にかかわらずレイジーvalをシリアル化する場合の違い

Sparkで作業しているときに、シリアル化できないオブジェクトを各タスクで送信する必要がある場合があります。

一般的なパターンは@transient lazy valです。たとえば、

class A(val a: Int)

def compute(rdd: RDD[Int]) = {
  // lazy val instance = {
  @transient lazy val instance = {
    println("in lazy object")
    new A(1)
  }
  val res = rdd.map(instance.a + _).count()
  println(res)
}

compute(sc.makeRDD(1 to 100, 8))

ここでは@transientは不要であることがわかりました。 lazy valは、各タスクの実行時に非シリアライズ可能を作成できます。しかし、人々は@transientの使用を提案しています。

  1. シリアル化するときに初期化されていない@transientlazy valを設定すると、どのような利点がありますか?

  2. 上記の例のように、何もシリアル化されないことを知って、シリアル化のために初期化されていないvalを一時的にすることには意味がありますか?

  3. @transient lazy valはどのようにシリアル化されますか?それはメソッドとして扱われるのか、それとも他の何かとして扱われるのですか?

@transient lazy valのシリアライズに関する詳細とコンパイルされたJavaバイトコードは素晴らしいです。

19
Hao Ren

ここを参照してください- http://fdahms.com/2015/10/14/scala-and-the-transient-lazy-val-pattern/

Scala= lazy valは、最初にアクセスされたときにのみ計算され、その後の参照のために保存されるフィールドを示します。@ transientを使用すると、シリアル化されません。

7
David Ahern