Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从Spring RESTful服务运行Spark作业_Java_Spring_Scala_Rest_Apache Spark - Fatal编程技术网

Java 从Spring RESTful服务运行Spark作业

Java 从Spring RESTful服务运行Spark作业,java,spring,scala,rest,apache-spark,Java,Spring,Scala,Rest,Apache Spark,我想通过restapi运行Spark作业,我想将Scala用于Spark。我有一个混合了Java和Scala的Spring框架项目。我可以调用一个Scala方法来创建SparkContext,并通过RESTAPI完成一些工作。设置主远程而非本地时会出现问题 val conf = new SparkConf().setAppName("App").setMaster("local") val sc = new SparkContext(conf) 很好,但是 val conf = new Spa

我想通过restapi运行Spark作业,我想将Scala用于Spark。我有一个混合了Java和Scala的Spring框架项目。我可以调用一个Scala方法来创建SparkContext,并通过RESTAPI完成一些工作。设置主远程而非本地时会出现问题

val conf = new SparkConf().setAppName("App").setMaster("local")
val sc = new SparkContext(conf)
很好,但是

val conf = new SparkConf().setAppName("App").setMaster(" spark://10.122.221.164:7077")
val sc = new SparkContext(conf)
导致
java.lang.ClassNotFoundException

到目前为止,我能找到的解决方案是创建一个胖jar并执行
conf.setJars(…)
,或者通过类似
ProcessBuilder
的方式使用
spark submit
脚本


在我当前的设置中,我只有一个Spring项目,包括sparkscala代码,它打包到
war
文件中,在Tomcat下运行,所以我没有一个胖jar。我不想有一个Spring项目和几个单独的Scala应用程序,每个都打包成一个胖罐子。如何设计出一个简单但合理的体系结构?

哪个类给出了ClassNotFoundException?由此可以清楚地看出,Spark应用程序依赖于该类,需要与Spark应用程序一起打包

它在本地工作,因为它有所有可用的JAR,但对于远程,依赖JAR需要传输到驱动程序/执行器

如果运行spark submit,您可以看到使用--jars被传输指定的依赖项jar

您可以使用SparkConf.setJars创建uber jar或指定依赖项jar

Maven Shade插件可用于创建uber jar,并仅指定需要捆绑的jar

还有,为什么不使用启动Spark应用程序

@Bean
    public  SparkSession sparkSession() {

        SparkSession sparkSession = SparkSession.builder()
                .master(getWorkerThreadCount())
                .appName("SparkApp"+System.currentTimeMillis())
                /*  Spark UI Config */
                .config("spark.ui.enabled", true)
                .config("spark.ui.killEnabled", true)
                .config("spark.ui.retainedJobs", 100)
                .config("spark.ui.retainedStages", 100)
                .config("spark.ui.retainedTasks", 1000)
                .config("spark.cleaner.periodicGC.interval","3min")
                /* Spark performance configs */
//                .config("spark.driver.memory", driveryMemory)
//                .config("spark.sql.shuffle.partitions",shuffleParitions)
                .config("spark.sql.crossJoin.enabled",true)
                .config("spark.cleaner.referenceTracking.blocking","false")

//                .config("spark.cleaner.periodicGC.interval", "10min")
                .getOrCreate()
                .newSession();

        sparkSession.sparkContext().setLogLevel("DEBUG");
        LOGGER.info("Started Spark App ::: UI at : " + sparkSession.sparkContext().uiWebUrl().get());

        return sparkSession;
    }
我们目前正在使用此代码在Spring boot内运行Spark

 Dataset<Row> dremioDataSet = sparkSession.read()
                .format("jdbc")
                .option("url", dbConfigurations.getUrl().toString())
                .option("driver", dbConfigurations.getDriver().toString())
                .option("user", dbConfigurations.getUsername().toString())
                .option("password", dbConfigurations.getPassword().toString())
                .option("dbtable", "(" + finalQuery + ") ")
                .load();
Dataset-dremioDataSet=sparkSession.read()
.格式(“jdbc”)
.option(“url”,dbConfigurations.getUrl().toString())
.option(“驱动程序”,dbConfigurations.getDriver().toString())
.option(“用户”,dbConfigurations.getUsername().toString())
.option(“密码”,dbConfigurations.getPassword().toString())
.option(“dbtable”,“finalQuery+”)
.load();

为什么不使用Maven并在pom.xml中添加依赖项?我用过弹簧和火花。试试看,让我知道。@Dip我已经在用Maven了。我可以使用
mvn包
来构建一个胖jar,但我不明白为什么我必须将这些Spring项目和Spark驱动程序应用程序分开。因此,除非不是在本地配置,否则没有办法在Spring web应用程序中使用SparkContext作为方法调用Spark应用程序吗?即使我使用SparkLauncher,我也需要为Spark应用程序创建一个胖罐子,所以我需要有两个不同的项目。我使用Maven组装插件,我认为它类似于Maven Shade。提交spark应用程序的唯一方法是通过spark submit或SparkLauncher。您将初始化SparkConf/SparkContext作为spark应用程序的一部分,而不是启动spark应用程序。是的,您需要创建fat jar或指定依赖项jar。但是并发请求面临许多延迟问题。任何人都有办法解决这个问题。