Java 从Spring RESTful服务运行Spark作业
我想通过restapi运行Spark作业,我想将Scala用于Spark。我有一个混合了Java和Scala的Spring框架项目。我可以调用一个Scala方法来创建SparkContext,并通过RESTAPI完成一些工作。设置主远程而非本地时会出现问题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
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。但是并发请求面临许多延迟问题。任何人都有办法解决这个问题。