我有一个相当重的金属库,可以通过Java / JNI连接器访问,我希望通过集群中的Spark使用它。但是,库需要在首次使用之前进行初始化,这需要大约30秒。 所以我的问题是Spark是否有一些机制在作业开始时预先初始化这些库,以便实际使用时不需要这个初始化开销?
答案 0 :(得分:1)
问题 是Spark是否有一些预先初始化的机制 作业开始时的库,这样就不会产生初始化开销 实际使用需要吗?
AFAIK&截至目前...... Spark没有提供这样的设施,请看SPARK-650像sc.init ......
但是,如果您想要使用RDD
转换进行预初始化,那么在运行作业之前需要空RDD
,并且您可以重置和/或初始化群集...
map-reduce有setup
和clean
方法来初始化和清理......
您可以使用相同的方法将map-reduce样式代码转换为spark,例如:
注意:可以重新分区空RDD。所以我想下面是 如果您正在使用动作进行转换,则可以使用
foreachPartition
mapPartitions
示例:
val rdd = sc.emptyRDD.repartition(sc.defaultParallelism)
rdd.mapPartitions(partition ->
setup() //library initialization like map-reduce setup method
partition.map( item =>
val output = process(item) // your logic here.
if (!partition.hasNext) {
// cleanup here
}
)
)
foreachPartition
示例:
if (rdd.isEmpty) {
rdd.repartition(sc.defaultParallelism).foreachPartition(_ => yourUtils.initOnce())
}
mapartitions
(转换)和foreachPartition
(动作)在上述示例方式中可能很有用。请检查一下...... http://blog.cloudera.com/blog/2014/09/how-to-translate-from-mapreduce-to-apache-spark/
另请参阅我的回答,并详细解释mappartitions
Apache Spark: map vs mapPartitions& spark-foreach-vs-foreachpartitions