
[英]how to execute a shell script and get back his result from a windows station with java?
[英]Spark - Execute Scala script from Java and get the result
我的应用程序要求使用Spark计算一系列值,而我正在尝试使其由元数据驱动。
[
{
key : "myKeyName",
logic : "scala script"
}
...
]
我有一个类似于上面的json,它将与“ app.jar”一起提交给Spark。 在spark作业的main()中,我希望加载此json并在spark中执行“逻辑”脚本,并获取键的值。 我认为SparkContext.submitJob()是我想要的,但是我不确定。 仍在网上寻找解决方案。 感谢您的任何帮助,在此先感谢。
捆绑的jar通过SparkLauncher提交给spark:
final SparkLauncher launcher = new SparkLauncher()
.setAppResource("path/to/app.jar")
.setMainClass("the.main.class")
.setMaster("spark.master")
.setConf(SparkLauncher.DRIVER_MEMORY, "3g");
//add the other dependent jar files
launcher.startApplication();
PS:Spark应用程序在Docker中作为服务实现。
我自己弄清楚了。
//...
import scala.tools.nsc.interpreter.IMain;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
//...
private void scalaJob(SparkSession sparkSession, Dataset<Row> someData){
ScriptEngine e = new ScriptEngineManager().getEngineByName("scala");
//tell scala to use the classpath same as java
((IMain)e).settings().classpath().append(System.getProperty("java.class.path"));
//passing on some foo and bar
e.getContext().setAttribute("sparkSession",sparkSession, ScriptContext.ENGINE_SCOPE);
e.getContext().setAttribute("someData",someData, ScriptContext.ENGINE_SCOPE);
try {
//hello world
String script = "object HelloWorld {\n";
script += "def main(args: Array[String]): Unit = {\n";
script += "println(\"Hello, world!\")\n";
script += "}\n";
script += "}\n";
script += "HelloWorld.main(Array())";
e.eval(script);
//some serious work
script = "import org.apache.spark.sql.SparkSession\n";
script += "import org.apache.spark.sql.Dataset\n"
script += "import org.apache.spark.sql.Row\n";
script += "val processedData = someData.asInstanceOf[Dataset[Row]]\n";
script += "processedData.show(false)\n"
script += "processedData\n";
//getting back the result of serious work
Dataset<Row> ds = (Dataset<Row>) e.eval(script);
ds.show();
} catch (ScriptException ex) {
ex.printStackTrace();
System.exit(1);
}
}
该script
是从json元数据加载的。
PS:这只是一个示例,而不是生产代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.