我是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();
Run Code Online (Sandbox Code Playgroud)
当我试图在FlatMapFunction中使用上下文时,它为null.在这种方法之外,上下文具有价值.任何帮助,将不胜感激.
当您将变量设置为瞬态时,它不会被序列化并且对工作人员不可用。这可以解释 flatMap 中的 null 。您必须确保序列化器选择该类(并删除瞬态)。您也许可以使用 kryo 来序列化该类,即使它不是Serializable.
\n\n有以下几种选择:
\n\n
\n- Kryo 或许能够开箱即用地序列化这些对象,具体取决于它们内部的\xe2\x80\x99。尝试按照http://spark.apache.org/docs/latest/tuning.html中的描述打开它。
\n- 如果这不起作用,您可以创建自己的实现 Serialized 的 \xe2\x80\x9cwrapper\xe2\x80\x9d 对象,甚至是 FlexCompRowMatrix 的子类。不需要改变原来的库。
\n- 如果库有自己的序列化函数,您也可以在包装对象内使用这些函数。看一下https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/SerializedWritable.scala的示例,其中我们制作 Hadoop\xe2\x80\x99s可写序列化。
\n
| 归档时间: |
|
| 查看次数: |
992 次 |
| 最近记录: |