Я унаследовал код Java, который использует Spark для обработки XML. Он не делает с этим ничего особенного, он просто загружает XML и создает набор данных из тегов, необходимых для обработки.
Проблема в том, что код, который запускает сеанс Spark, загружает файл и создает набор данных, работает в потоке очереди потребителя Spring RabbitMQ. Каждый раз, когда очередь получает сообщение, она воссоздает сеанс spark, процесс, который несколько отнимает много времени.
Код выглядит примерно так:
FileProcessing fileProcessing = fileProcessingRepo.findById(id).get();
SparkSession sparkSession = SparkSession.builder().master("local").config("spark.executor.memory", "1g")
.config("spark.driver.memory", "1g").config("spark.memory.offHeap.enabled", true)
.config("spark.memory.offHeap.size", "3g").appName("xmlProcessing").getOrCreate();
HashMap<String, String> params = new HashMap<String, String>();
params.put("rowTag", SOME_TAG);
Dataset<Row> dfXML = sparkSession.read().format("com.databricks.spark.xml").options(params)
.load(fileProcessing.getFileFormS3());
doPartOneOfTheProcessing(dfXML);
params.put("rowTag", SOME_OTHER_TAG);
dfXML = sparkSession.read().format("com.databricks.spark.xml").options(params)
.load(fileProcessing.getFileFormS3());
dfXML.show(10000);
doPartTwoOfTheProcessing(dfXML);
sparkSession.close();
Это выполняется внутриКомпонент, управляемый Spring, вызываемый из потребителя очереди Spring RabbitMQ.
Мой вопрос, кроме удаления загрузки дублирующихся XML-файлов из Spark, каков наилучший способ обработки сеанса Spark в среде Spring / RabbitMQ? Должен ли я позволить Spring управлять созданием SparkSession? Какая часть процесса создания SparkSession является поточно-ориентированной и потенциально может быть оптимизирована в многопоточной среде?