Neh*_*eha 26 scala partitioning weka apache-spark
我有一个存储在S3中的weka模型,大小约为400MB.现在,我有一些记录,我想在其中运行模型并执行预测.
为了进行预测,我试过的是,
在驱动程序上下载并加载模型作为静态对象,将其广播给所有执行程序.对预测RDD执行映射操作.---->不工作,如在Weka中执行预测,需要修改模型对象,并且广播需要只读副本.
在驱动程序上下载并加载模型作为静态对象,并在每个映射操作中将其发送到执行程序.----->工作(效率不高,如在每个地图操作中,我传递400MB对象)
在驱动程序上下载模型并将其加载到每个执行程序上并将其缓存在那里.(不知道该怎么做)
有人知道如何在每个执行程序上加载模型一次并将其缓存,以便其他记录我不再加载它?
Dia*_*rat 27
您有两种选择:
object WekaModel {
lazy val data = {
// initialize data here. This will only happen once per JVM process
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以在map
函数中使用lazy val .在lazy val
每个工人JVM初始化自己的数据的情况下保证了.不会执行序列化或广播data
.
elementsRDD.map { element =>
// use WekaModel.data here
}
Run Code Online (Sandbox Code Playgroud)
好处
缺点
mapPartition
(或foreachPartition
)方法而不是仅使用map
.这允许您初始化整个分区所需的任何内容.
elementsRDD.mapPartition { elements =>
val model = new WekaModel()
elements.map { element =>
// use model and element. there is a single instance of model per partition.
}
}
Run Code Online (Sandbox Code Playgroud)
优点:
缺点
归档时间: |
|
查看次数: |
6991 次 |
最近记录: |