spring boot+apachespark并发请求性能问题

wn9m85ua  于 2021-05-29  发布在  Spark
关注(0)|答案(0)|浏览(261)

我试图在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的专用节点中。任何关于如何调试的建议都会很有帮助。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题