Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 如何将Spring上下文传递给Spark worker节点_Apache Spark - Fatal编程技术网

Apache spark 如何将Spring上下文传递给Spark worker节点

Apache spark 如何将Spring上下文传递给Spark worker节点,apache-spark,Apache Spark,我是Spark的新手,我有spring上下文(使用ClassPathXmlApplicationContext将xml加载到应用程序上下文中),需要将其传递到worker节点。我能够创建Spark上下文,并尝试在flatMap及其null中使用相同的。我是否可以将其传递给Flatmap函数?我正在调用另一个带有in-spark的框架,它需要这个spring上下文 这里有一些代码 ApplicationContext context = new ClassPathXmlApplicationCon

我是Spark的新手,我有spring上下文(使用ClassPathXmlApplicationContext将xml加载到应用程序上下文中),需要将其传递到worker节点。我能够创建Spark上下文,并尝试在flatMap及其null中使用相同的。我是否可以将其传递给Flatmap函数?我正在调用另一个带有in-spark的框架,它需要这个spring上下文

这里有一些代码

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();
ApplicationContext context=new ClassPathXmlApplicationContext(“spring/rules-engine-spring.xml”);
JavaRDD分区=r.mapPartitions(
新FlatMapFunction(){
公共Iterable调用(迭代器rowIterator)引发异常{
List factList=new ArrayList();
while(roweiterator.hasNext()){
Row rw=rowIterator.next();
数据事实=新数据();
setGrain(rw.getString(0));
fact.setRoute(rw.getString(1));
事实清单。添加(事实);
}
Iterable itr=新的Iterable(){
列表l=新的ArrayList();
公共迭代器迭代器(){
返回l.iterator();
}
};
返回itr;
}
});
List result=partitions.collect();

当我试图在FlatMapFunction中使用其null的上下文时。在这个方法之外,上下文是有价值的。任何帮助都将不胜感激。

当您创建变量瞬态时,它不会被序列化,也不会在workers上可用。这可以解释平面图中的空值。您必须确保序列化程序拾取该类(并删除瞬态)。您可能能够使用kryo序列化该类,即使它不可
序列化

通过:

有几种选择:

  • Kryo可能能够即时序列化这些对象,这取决于它们内部的内容。尝试按中所述将其打开
  • 如果这不起作用,您可以创建自己的“包装器”对象来实现Serializable,甚至是FlexCompRowMatrix的子类。无需更改原始库
  • 如果库有自己的序列化函数,也可以在包装器对象中使用这些函数。看一个例子,我们将Hadoop的可写可序列化

有例外吗?你能试着在平面图中创建上下文吗?正如我提到的,我不能多次创建上下文。它必须在平面图之外。我尝试在函数内部创建上下文,但出现错误,说一些上下文对象已经存在,等等。是否有方法可以在flatmap函数外部创建上下文并使用函数访问相同的上下文?是否确定flatmap之外的对象不为null?如果内部为null,则可能是序列化逻辑没有正确获取它。或者它以某种方式被标记为瞬态。@Reactormonk感谢您的快速响应。Spark正在抱怨,并收到一个错误ClassPathXmlApplicationContext不可序列化,我将上下文设置为瞬态。ClassPathXmlApplicationContext不可序列化。在这种情况下,如何使ClassPathXmlApplicationContext可序列化?非常感谢。这有帮助