2016-07-13 16 views
0

私はいくつかのオブジェクトをapache sparkのパーティション間で共有します。以下は、私が直面しているコードスニペットと問題です。SparkでJavaRDDパーティション間でデータを共有する方法は?

private static void processDataWithResult() throws IOException { 

     JavaRDD<Long> idRDD = createIdRDDUsingDb(); 
     final MeasureReportingData measureReporingData = getMeasureReportingData(jobConfiguration); 

     resultRDD = idRDD.mapPartitions(new FlatMapFunction<Iterator<Long>, Boolean>() { 
      @Override 
      public Iterable<Boolean> call(Iterator<Long> idIterator) throws Exception { 

       MeasureReportingData mrd = measureReporingData; 

       final List<Boolean> dummyList = new ArrayList<>(); 

       long minId = idIterator.next(); 

       engine.processInBatch(minId, minId + BATCH_SIZE - 1); 
       return (Iterable<Boolean>) dummyList; 
      } 
     }); 

     resultRDD.count(); 

    } 

measureReportingDataオブジェクトをすべてのパーティションに配布したいですか?

MeasureReportingDataにはSerializableではないインスタンスメンバーが含まれているため、シリアル化エラーが発生します。問題のシミュレーションは、次の質問で指定します。How to serialize a Predicate<T> from Nashorn engine in java 8

measureReportingDataをパーティション間で共有する別の方法はありますか?

答えて

1

マシン間でデータを共有するには、データをソースでシリアル化し、ネットワーク経由で転送し、宛先でデシリアライズする必要があります。したがって、直列化できないオブジェクトは転送できません。

MeasureReportingDataがシリアライズ可能でない場合は、シリアライズ可能なオブジェクトに変換し、そのオブジェクトを共有してから、関数内のMeasureReportingDataに変換する必要があります。

+0

これは、シリアル化の方法です。私は、MeasureReportingDataがSerializableであればうまくいくことを知っています。私が直面している問題は、Nashornの述語をシリアライズするのリンクに記載されています。 – Ajeetkumar

+0

シリアライズ不可能なオブジェクトを共有することはできません。その周りに方法はありません。 – Dikei

+0

@Dikeiあなたはいつも共有することはできませんが、その場で初期化することはできます。 – zero323

関連する問題