2016-01-25 39 views
2

我是Spark中的新成员。Apache Spark和不可序列化的应用程序上下文

我想使用Spark和map-reduce方法并行化我的计算。 但是,我将这个计算放到Map阶段的PairFunction实现中,需要一些要初始化的上下文。这个上下文包含来自第三方jar的多个单例对象,并且这些对象不是可序列化的,所以我不能在工作节点上传播它们,并且不能在我的PairFunction中使用它们。

所以我的问题是:我可以以某种方式并行化需要使用Apache Spark不可序列化的上下文的作业吗?还有其他解决方案吗?也许我可以告诉Spark在每个工作节点上初始化所需的上下文?

+0

你的问题对我来说有点含糊。我会试着根据我对它的理解来回答。 Spark有两个主要的执行环境:代码以正常(非分布式)方式运行的驱动程序。这是您可以初始化上下文并打开spark上下文的地方。分布式代码将在工作人员上执行。 –

+0

我的问题是关于应该通过工作人员执行的分布式代码。问题是这段代码必须使用不可序列化的第三方对象。所以我不能在主服务器上实例化它们,然后通过网络传递给工作人员。我想知道是否有任何解决方法。 – Doob

+0

如果您的代码将被运送给工人,它应该被序列化。没有解决办法。如果你不需要这些对象在工人内部,你可以声明它们是暂时的。 –

回答

1

您可以尝试使用mapPartitionforeachPartition初始化执行程序中的第三方jar。

rdd.foreachPartition { iter => 
    //initialize here 
    val object = new XXX() 
    iter.foreach { p => 
    //then you can use object here 
    } 
} 
+0

谢谢。你能否解释一下,这些rdd方法到底在做什么?我打开了spark javadoc,并且没有太多细节:“foreachPartition - 将函数f应用于此RDD的每个分区。”就是这样。 – Doob

+0

'foreachPartition'为每个分区执行一个函数。通过迭代器参数提供对分区中包含的数据项的访问。 Spark将尝试初始化驱动程序(主)上的变量,然后序列化该对象以将其发送给工作人员,如果该对象不可序列化,则该操作将失败。 –

相关问题