Spark和巨大的共享对象

时间:2016-09-05 19:31:13

标签: java apache-spark

我可以在同一工作人员的执行者之间拥有共享对象吗?

例如,我在文件中有一些数据。在我可以使用之前,应该编译这些数据。编译后,它是不可序列化的Java对象。 但不幸的是,编译需要花费很多时间。我想在每个worker上编译一次,并在worker的所有任务中使用该对象。

你能给我一些建议吗?

感谢。

1 个答案:

答案 0 :(得分:0)

广播变量可能是一个潜在的答案,尽管不可序列化的部分仍然是一个问题。另一个可能的想法是使用mapPartitions。这将在分区上应用一个函数,而不是每个记录。

val rdd = sc.textFile(...)
rdd.repartition(numExecutors).mapPartitions( iter => {
    val yourObject = new ExpensiveObject()
    iter.map(records => yourFunction(records, yourObject))
    })

这将为每个执行程序创建一次对象,然后您可以使用它。不幸的是,如果您的应用程序需要多次通过,则您必须为每次通过重建它。