我可以在同一工作人员的执行者之间拥有共享对象吗?
例如,我在文件中有一些数据。在我可以使用之前,应该编译这些数据。编译后,它是不可序列化的Java对象。 但不幸的是,编译需要花费很多时间。我想在每个worker上编译一次,并在worker的所有任务中使用该对象。
你能给我一些建议吗?
感谢。
答案 0 :(得分:0)
广播变量可能是一个潜在的答案,尽管不可序列化的部分仍然是一个问题。另一个可能的想法是使用mapPartitions。这将在分区上应用一个函数,而不是每个记录。
val rdd = sc.textFile(...)
rdd.repartition(numExecutors).mapPartitions( iter => {
val yourObject = new ExpensiveObject()
iter.map(records => yourFunction(records, yourObject))
})
这将为每个执行程序创建一次对象,然后您可以使用它。不幸的是,如果您的应用程序需要多次通过,则您必须为每次通过重建它。