我是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。在这种方法之外,上下文具有价值。任何帮助将不胜感激。
答案 0 :(得分:3)
当你创建一个变量瞬态时,它没有被序列化并且在工人身上不可用。这将解释flatMap中的null。您必须确保序列化程序选择类(并删除瞬态)。您可以使用kryo序列化该类,即使它不是Serializable
。
有几个选择:
- Kryo可能会将这些对象开箱即用,具体取决于它们内部的内容。尝试按照http://spark.apache.org/docs/latest/tuning.html中的说明启用它。
- 如果这不起作用,您可以创建自己的“包装器”对象来实现Serializable,甚至是FlexCompRowMatrix的子类。无需更改原始库。
- 如果库有自己的序列化函数,您也可以在包装器对象中使用它们。看一下https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/SerializableWritable.scala我们将Hadoop的Writables序列化的例子。