Java Apache Spark和不可序列化的应用程序上下文

Java Apache Spark和不可序列化的应用程序上下文,java,serialization,apache-spark,mapreduce,Java,Serialization,Apache Spark,Mapreduce,我是新来的 我想使用Spark和map reduce方法并行计算。 但是,我在Map阶段的PairFunction实现中进行的计算需要初始化一些上下文。这个上下文包括来自第三方jar的几个单例对象,并且这些对象是不可序列化的,所以我不能将它们分布在工作节点上,也不能在我的PairFunction中使用它们 所以我的问题是:我能用ApacheSpark以某种方式并行化需要非序列化上下文的作业吗?还有其他解决办法吗?也许我可以告诉Spark在每个工作节点上初始化所需的上下文?您可以尝试使用mapPa

我是新来的

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


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

您可以尝试使用
mapPartition
foreachPartition
在executor中初始化您的第三方jar

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

你的问题对我来说有点模棱两可。我会根据我对它的理解来回答。Spark有两个主要的执行环境:驱动程序,代码将以正常(非分布式)方式运行。在这里,您可以初始化上下文并打开spark上下文。分布式代码将在worker上执行。我的问题是关于应该在worker上执行的分布式代码。问题是此代码必须使用不可序列化的第三方对象。因此,我不能在主机上实例化它们一次,然后通过网络传递给工人。我想知道是否有任何解决办法。如果你的代码将被发送给工人,它应该被序列化。没有解决办法。如果你在worker中不需要这些对象,你可以将它们声明为transient。谢谢。请你解释一下,这些rdd方法到底在做什么?我打开了spark javadocs,没有太多细节:“foreachPartition-将函数f应用于此RDD的每个分区。”就是这样。
foreachPartition
为每个分区执行一个函数。通过迭代器参数提供对分区中包含的数据项的访问。Spark将尝试初始化驱动程序(主程序)上的变量,然后序列化对象以将其发送给工作程序,如果对象不可序列化,则将失败。