2015-09-17 5 views
5

私はSparkの新機能で、ワーカーノードに渡す必要のあるSpringコンテキスト(ClassPathXmlApplicationContextを使用してアプリケーションコンテキストにXMLをロードする)を持っています。私はSparkのコンテキストを作成し、私のflatMapとnullで同じものを使用しようとしています。とにかくこれをFlatmap関数に渡すことができますか?私は、この春の文脈の必要性を喚起する別のフレームワークを呼びたいと思っています。ここでSpringコンテキストをSparkワーカーノードに渡す方法

は、私はそのヌルFlatMapFunction内でコンテキストを使用しようとしていますいくつかのコード

ApplicationContext context = new ClassPathXmlApplicationContext("spring/rules-engine-spring.xml"); 

JavaRDD<Row> partitions = r.mapPartitions(
    new FlatMapFunction<Iterator<Row>, Row>() { 
     public Iterable<Row> call(Iterator<Row> rowIterator) throws Exception { 

      List<Data> factList = new ArrayList<Data>(); 
      while (rowIterator.hasNext()) { 
       Row rw = rowIterator.next(); 
       Data fact = new Data(); 
       fact.setGrain(rw.getString(0)); 
       fact.setRoute(rw.getString(1)); 
       factList.add(fact); 
      } 
      Iterable itr = new Iterable() { 
        List l = new ArrayList<Integer>(); 

        public Iterator iterator() { 
         return l.iterator(); 
        } 
       }; 
      return itr; 
     } 

    }); 
List result=partitions.collect(); 

です。このメソッドの外部には、コンテキストに値があります。どんな助けもありがとう。

+0

例外はありますか?フラットマップ内でコンテキストを作成してみることができますか? – Reactormonk

+0

私が言及したように、私は文脈を2回以上作成することはできません。それはFlatMapの外になければなりません。関数内でコンテキストを作成しようとしましたが、コンテキストオブジェクトのいくつかがすでに存在していたというエラーが出ました。フラットマップ関数の外側にコンテキストを作成して関数にアクセスする方法はありますか? –

+0

オブジェクトがflatMapの外側でヌルでないことは確かですか?それが内部でnullの場合、おそらくシリアル化ロジックが正しくフェッチしていない可能性があります。それとも何とか一時的なものとしてマークされています。 – Reactormonk

答えて

3

変数を一時的にすると、シリアル化されず、ワーカーで利用できなくなります。これは、flatMap内のnullを説明します。シリアライザがクラスをピックアップして(そしてトランジェントを削除する)ことを確認する必要があります。 Serializableではないにもかかわらず、クラスを直列化するためにkryoを使用できるかもしれません。

経由http://apache-spark-user-list.1001560.n3.nabble.com/Un-serializable-3rd-party-classes-Spark-Java-td7815.html:いくつかのオプションがあります

  • がKryoは、それらの内部で何によっては、箱から出して、これらのオブジェクトをシリアル化することができるかもしれません。詳しくは、http://spark.apache.org/docs/latest/tuning.htmlの説明に従ってオンにしてください。
  • これでうまくいかない場合は、Serializable、またはFlexCompRowMatrixのサブクラスを実装する独自の「ラッパー」オブジェクトを作成できます。元のライブラリを変更する必要はありません。
  • ライブラリに独自のシリアル化関数がある場合は、ラッパーオブジェクト内の関数を使用することもできます。 HadoopのWritablesをシリアライズ可能にする例については、https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/SerializableWritable.scalaを参照してください。
+0

ありがとうございました。それは助けた –

関連する問題