Apache spark 如何将Spring上下文传递给Spark worker节点
我是Spark的新手,我有spring上下文(使用ClassPathXmlApplicationContext将xml加载到应用程序上下文中),需要将其传递到worker节点。我能够创建Spark上下文,并尝试在flatMap及其null中使用相同的。我是否可以将其传递给Flatmap函数?我正在调用另一个带有in-spark的框架,它需要这个spring上下文 这里有一些代码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
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可序列化?非常感谢。这有帮助