是否可以(并且明智地)在 JavaRDD 中执行 other "spark-submit" ?

Is it possible (and wise) to execute other "spark-submit" inside a JavaRDD?

我正在尝试使用 spark-submit 执行一个 Spark 程序(特别是 GATK Spark 工具,所以命令不是 spark-submit,而是类似的东西):这个程序接受唯一的输入,所以我正在尝试编写一些 Java 代码以接受更多输入。

特别是我试图通过 JavaRDD 的 pipe 函数为每个输入执行 spark-submit

JavaRDD<String> bashExec = ubams.map(ubam -> par1 + "|" + par2)
            .pipe("/path/script.sh");

其中 par1par2 是将传递给 script.sh 的参数,后者将处理(由“|”分隔) ) 并使用它们执行类似于 spark-submit.

的操作

现在,与单个输入的执行相比,我不希望获得加速,因为我正在调用其他 Spark 函数,但只是为了将更多输入的工作负载分配到不同的节点上并具有线性执行时间输入的数量。

例如,GATK Spark 工具在只有一个输入的情况下持续了大约 108 分钟,对于我的代码,我预计在两个类似的输入情况下它会持续大约 216 分钟。

我注意到代码 "works",或者更确切地说,我在终端上获得了通常的输出。但是至少过了15个小时,任务还没有完成,还在执行中。

所以我想问一下这种方法(使用管道函数执行spark-submit)是否愚蠢或者可能还有其他错误?

我希望能清楚地解释我的问题。

P.S。我在 Azure 上使用具有 28GB 内存和 4 个执行线程的 VM。

Is it possible

是的,技术上是可行的。小心一点,甚至可以在工作线程中创建一个新的 SparkContext,但是

Is it (...) wise

没有。你不应该永远做这样的事情。 Spark 首先禁止嵌套并行化是有充分理由的。任务内部发生的任何事情都是黑盒,因此在 DAG 计算和资源分配期间无法计算在内。在最坏的情况下,作业将死锁,主作业等待任务完成,任务等待主作业释放所需资源。

如何解决这个问题。问题的描述相当粗略,所以很难给你一个准确的建议,但你可以:

  • 使用驱动程序本地循环从单个应用程序按顺序提交多个作业。
  • 使用线程和应用程序内调度从单个应用程序同时提交多个作业。
  • 使用独立编排工具提交多个独立的应用程序,每个应用程序处理一组参数。