繁体   English   中英

Spark-从Java执行Scala脚本并获取结果

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM