我试图在spring启动应用程序中运行apachespark。我创造了一个sparksession豆子。
@Bean
public SparkSession sparkSession() {
Logger.getLogger("org").setLevel(Level.OFF);
Logger.getLogger("akka").setLevel(Level.OFF);
SparkSession sparkSession = SparkSession.builder()
.master(getWorkerThreadCount())
.appName("Spark-"+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.sql.crossJoin.enabled",true)
.config("spark.cleaner.referenceTracking.blocking","false")
.config("spark.local.dir","/tmp/d1,/tmp/d2,/tmp/d3,/tmp/d4")
.config("spark.cores.max","6")
.config("spark.default.parallelism","6")
.config("spark.scheduler.mode","FAIR")
.config("spark.sql.shuffle.partitions","4")
.getOrCreate()
.newSession();
sparkSession.sparkContext().setLogLevel("DEBUG");
int defaultParallelism = sparkSession.sparkContext().defaultParallelism();
LOGGER.info("defaultParallelism "+defaultParallelism);
LOGGER.info("Started Spark App ::: UI at : " + sparkSession.sparkContext().uiWebUrl().get());
return sparkSession;
}
使用bean,我试图使用下面的代码在远程数据库上启动查询
private Dataset<Row> retrieveDataFromDB(String finalQuery) {
long start = System.currentTimeMillis();
logger.info(" ###Query : "+finalQuery+" ###");
Dataset<Row> dremioDataSet = sparkSession.read()
.format("jdbc")
.option("url", dbConfig.getUrl().toString())
.option("driver", dbConfig.getDriver().toString())
.option("user", dbConfig.getUsername().toString())
.option("password", dbConfig.getPassword().toString())
.option("query",finalQuery)
.load();
logger.info(SQL response in "+getTimetaken(start) +" secs");
return dbDataSet;
}
当我发出一个或两个请求时,延迟是1秒。但当我增加并行请求的数量时,延迟会增加到20秒,spark ui显示大部分时间都花在执行器计算上。sql的结果只是一个数字。无法理解正在发生什么阻塞操作。
应用程序作为docker容器部署在4CPU的专用节点中。任何关于如何调试的建议都会很有帮助。
暂无答案!
目前还没有任何答案,快来回答吧!