【发布时间】:2019-05-13 08:15:59
【问题描述】:
在一个通过 Spark 部署的 Scala 应用程序中,我有一个代码行,它调用一个通过 JNI 执行本机 C++ 代码的 Java 函数。此调用需要时间,如果它不是唯一的同类调用,则会出现资源使用冲突,并带有 *** stack smashing detected ***: <unknown> terminated。
这是电话,它的范围:
[spark RDD].mapPartitionsWithIndex(f = (index: Int, it: Iterator[Row]) => {
val sourceData: String = it.mkString()
val result: List[List[String]] = new WrapperClass(sourceData, [misc parameters).getResult
[wrinting result to a file]
}).take(1)
我的WrapperClass.getResult,很简单,长这样:
[java call related variables initialization]
UnitexJni.execUnitexTool("UnitexTool {InstallLingResourcePackage -p " + appliedPkg + " -x " + resDir + "} " + "{" + runScriptCmd + "} " + "{InstallLingResourcePackage -p " + appliedPkg + " -x " + resDir + " --uninstall}")
[retrieving, formatting and returning result]
UnitexJni.execUnitexTool() 是 java 调用。
所以我想知道是否有办法强制等到这个过程结束,然后再使用 Scala、Java 或 Spark 功能调用它。
【问题讨论】:
-
请在您的问题中添加代码 sn-p,显示您如何使用 JNI 运行此脚本命令。
-
我第一次没有包含它,因为调用JNI的行非常具体,所以我将它放在这里:
UnitexJni.execUnitexTool("UnitexTool {InstallLingResourcePackage -p " + appliedPkg + " -x " + resDir + "} " + "{" + runScriptCmd + "} " + "{InstallLingResourcePackage -p " + appliedPkg + " -x " + resDir + " --uninstall}")RunScript 命令也是要发送到的特定字符串JNI。虽然,据我测试,这个调用做了它应该做的。导致任务冲突的是 Spark Ordonancement。 -
假设您从 Scala 运行一个 shell 脚本,那么您需要强制 Scala 在此脚本完成之前不要执行任何其他操作以避免冲突。对吗?
-
@MoustafaMahmoud 正确。
-
@OlivierGRACIANNE 请在下面查看我的答案
标签: java scala apache-spark