Utilオブジェクトをシリアル化してスパーク作業者に送信する方法はありますか。 毎回または1回だけ送信するマネージャが作成されますか?どのくらい 時間マネージャのインスタンスがスパーク作業員に送信されますか?
Util.process
は、それをシリアル化する内容であるapply
方法、だ実装し、コンパイル時にAbstractFunction1
内にラップされます。あなたは、このコードをコンパイルするときは、(これはJVMバイトコードから再構築された)、これを見ることができます:
par.map(new AbstractFunction1() {
public static final long serialVersionUID = 0L;
public final void apply(String data)
{
Util..MODULE$.process(data);
}
}, ClassTag..MODULE$.Unit());
}
を我々が見たいもう一つがどのようにUtil
オブジェクトの取得のバイトコードにコンパイル:
public final class Util$
{
public static final MODULE$;
private final Manager someManager;
public Manager someManager()
{
return this.someManager;
}
private Util$()
{
MODULE$ = this;
this.someManager = new Manager();
}
public void process(String data)
{
someManager().manage(data);
}
}
つまり、まだManager
のインスタンスフィールドがあります。何が起きるかは、それが必要ではないので、ClosureCleaner
をUtil
のインスタンスを削除するために使用しますが、インスタンスをワーカーにシリアル化する必要があります。毎回map
を呼び出す必要があります。これは、Manager
の複数のインスタンスが存在することを意味するものではなく、単一のインスタンスをシリアル化してワイヤを介して送信する必要があることを意味します。メカニズムが実際に始まるの閉鎖によって を使用されていない道に沿ってすべての参照を囲むクロージャの階層とヌルを横断するある
- 、しかし:私たちは、
ClosureCleaner
のドキュメントで詳細を確認することができますそれにもかかわらず、コンパイルされた匿名クラス に含まれています。他のコードパスが に依存する可能性があるので、 が囲みクロージャを所定位置に変更するのは安全ではないことに注意してください。代わりに、それぞれの囲みクロージャをクローンし、それに応じて 親ポインタを設定します。
私にとって、これは3つの質問に対する答えです。 – geoalgo
私は投票した人ではありませんが、これは正しく聞こえません。__Utilはシリアル化可能である必要があります。 –
Managerがシリアライズ可能でない場合、Utilはシリアライズ可能ではなく、Sparkはマップ内でクロージャを使用することはできません。 – geoalgo