gpt4 book ai didi

scala - 使用 spark 加载由 --files 参数分发的共享库 (.so)

转载 作者:行者123 更新时间:2023-12-04 11:30:16 24 4
gpt4 key购买 nike

我正在尝试在运行 Spark 作业时使用外部 native 库(.so 文件)。首先,我使用 --files 提交文件争论。

加载我正在使用的库 System.load(SparkFiles.get(libname))创建 SparkContext 后(以确保 SparkFiles 已填充)。
问题是该库仅由驱动程序节点加载,当任务尝试访问我正在获取的 native 方法时

WARN TaskSetManager: Lost task 0.0 in stage 2.0 (TID 2, 13.0.0.206, executor 0): java.lang.UnsatisfiedLinkError

唯一对我有用的是复制 .so在运行 spark 应用程序之前将文件发送给所有工作人员,并创建一个 Scala 对象,该对象将在每个任务之前加载库(可以使用 mapPartitions 进行优化)。

我尝试使用
--conf "spark.executor.extraLibraryPath=/local/path/to/so" \
--conf "spark.driver.extraLibraryPath=/local/path/to/so"

试图避免这种情况,但没有成功。

现在因为我使用 EMR 来运行 spark 作业,而不是一致的集群,
我想避免在运行作业之前将文件复制到所有节点。

有什么建议?

最佳答案

解决方案比我想象的要简单 - 我只需要为每个 JVM 加载一次库

所以基本上我需要的是使用 --files 添加库文件并创建一个 Loader 对象:

object LibraryLoader {
lazy val load = System.load(SparkFiles.get("libname"))
}

并在每个任务之前使用它( mapfilter 等)

例如
rdd.map { x =>
LibraryLoader.load
// do some stuff with x
}

懒惰将确保在填充 SparkFiles 之后创建对象,并且每个 JVM 也会进行一次评估。

关于scala - 使用 spark 加载由 --files 参数分发的共享库 (.so),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45741082/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com