Есть ли способ заставить конец процесса Java завершиться в Scala или Spark? - PullRequest
0 голосов
/ 13 мая 2019

В приложении Scala, развернутом через Spark, у меня есть строка кода, которая вызывает функцию Java, выполняющую собственный код C ++ через JNI. Этот вызов требует времени, и если он не единственный в своем роде, возникает конфликт использования ресурса с *** 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.

Так что я хотел бы знать, есть ли способ заставить ждать до конца этого процесса, прежде чем вызывать его через agin, используя функциональность Scala, Java или Spark.

1 Ответ

1 голос
/ 13 мая 2019

Вы можете использовать sys.process._. Вы передадите сценарий shell в следующую функцию процесса с путем к сценарию. Кроме того, вам нужно обработать скрипт оболочки, чтобы иметь код возврата. Например, If 0 success else failed. Пожалуйста, позаботьтесь о ! в конце строки. Вы также можете проверить более подробную информацию для запуска быстрых командных строк из этого учебника

import scala.sys.process.Process
val externalShellScript = Process("sh", Seq(scriptPath)).!    
  if (externalShellScript != 0) {
    throw new Exception(
      "Error in executing external shell script from " + scriptPath)
  }

Задание Spark не будет продолжено, пока этот процесс не завершится. Ниже приведен простой сценарий оболочки и вывод.

touch test.txt
echo "any massage"

вывод в консоль будет

any massage
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...