调度多个结构化流作业与调度异步

时间:2020-03-08 23:53:19

标签: apache-spark spark-streaming

我的问题是我有多个FAIR计划的池(总共3个),这些池由100多个Spark结构化流作业组成,每个池中总共有300多个Spark结构化流作业。这些作业由spark应用程序动态创建,并根据配置自动分配给3个池之一。池正确显示,我可以看到每个作业也正确地正确分配给了关联的池。问题在于,启动所有结构化流作业的启动时间要花相当多的时间来安排(安排所有结构化流作业的时间通常为几小时)。在启动它们时,它们可以在FAIR预定模式下正确运行,但是启动时间是导致问题的原因。我想知道我的实现是否不正确,或者是否有可能异步启动多个结构化流作业而又不会产生如此高的启动成本。

现在,我循环浏览所有配置(同步)并运行通用的for循环,以基于所有计划的定义配置运行所有结构化流作业。每个结构化的流媒体计划至少运行一次后,需要花费几个小时才能从SPARKUI启动(最终获得安排)。我想知道我是否可以异步调用同一火花会话的job.run()并让它立即安排作业,即使作业排队。

现在,我的集群中有3000多个内核,大约有700个Spark结构化的流作业,每个作业都具有与下面类似的实现。

for(Plan plan : plans) {
            // This line sets each Plan to the appropriate scheduler pool (one of the three above)
            sparkSession.sparkContext().setLocalProperty("spark.scheduler.pool", plan.name());
            for(OptimizationPlan op : plan.createOptimization()){
                for(BaseStreamingJob job : baseStreamingJobs){
                    // This executes the code below
                    job.run(op);
                }
            }
        }

            sparkSession.streams().awaitAnyTermination();


  @Override
    public void run(OptimizationPlan op) {
        Dataset<Row> ds = sparkSession.readStream()
                .option("maxFilesPerTrigger", ac.getMaxFilesPerTrigger())
                .option("latestFirst", "false")
                .option("header", "true")
                .option("sep", ",")
                .option("ignoreLeadingWhiteSpace", "true")
                .option("ignoreTrailingWhiteSpace", "true")
                .option("inferSchema", "false")
                .schema(op.getSchema())
                .csv(ac.getSourceDirPath().concat(op.getPath()))
                .withColumn("filename", callUDF("getFileName", input_file_name()))
                .withColumn("spark_processed_time", current_timestamp())
                .coalesce(op.getNumberOfPartitions());

        ds
                .writeStream()
                .queryName(op.getQueryname())
                .format("com.sample.libs.PulsarSinkProvider")
                .outputMode(OutputMode.Append())
                .option("topic", op.getTopic())
                .option("broker", pc.getPulsar_service())
                .option("tlscert", pc.getPulsar_tlscert())
                .option("tlskey", pc.getPulsar_tlskey())
                .option("tlscacert", pc.getPulsar_cacert())
                .option("checkpointLocation", ac.getCheckpointDirPath().concat("/" + op.getQueryname()))
                .option("CryptoKeyReader_public", pc.getPulsar_pubkey())
                .option("CryptoKeyReader_private", pc.getPulsar_privkey())
                .start();
    }

泳池配置

<?xml version="1.0"?>
<allocations>
  <pool name="Pool1">
    <schedulingMode>FAIR</schedulingMode>
    <weight>1</weight>
  </pool>
  <pool name="Pool2">
    <schedulingMode>FAIR</schedulingMode>
    <weight>1</weight>
  </pool>
    <pool name="Pool3">
    <schedulingMode>FAIR</schedulingMode>
    <weight>1</weight>
  </pool>
</allocations>

0 个答案:

没有答案