如何将Spring上下文传递给Spark工作节点

时间:2015-09-17 02:16:21

标签: apache-spark

我是Spark的新手,我有弹簧上下文(使用ClassPathXmlApplicationContext将xml加载到应用程序上下文中),需要传递给worker节点。我能够创建Spark上下文并尝试在我的flatMap和null中使用它。无论如何我可以将它传递给Flatmap函数吗?我正在调用另一个需要这个Spring环境的spark中的框架。

这是一些代码

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();

当我尝试在FlatMapFunction中使用上下文时,它为null。在这种方法之外,上下文具有价值。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

当你创建一个变量瞬态时,它没有被序列化并且在工人身上不可用。这将解释flatMap中的null。您必须确保序列化程序选择类(并删除瞬态)。您可以使用kryo序列化该类,即使它不是Serializable

通过http://apache-spark-user-list.1001560.n3.nabble.com/Un-serializable-3rd-party-classes-Spark-Java-td7815.html

  

有几个选择: