Scala 如何使用ApacheLivy和ApacheSpark对REST请求进行排队?

Scala 如何使用ApacheLivy和ApacheSpark对REST请求进行排队?,scala,rest,apache-spark,yarn,Scala,Rest,Apache Spark,Yarn,我有一个远程进程,它向我卑微的Spark独立集群发送数千个请求: 3个工作节点,具有4个内核和8GB 驱动程序运行的相同主节点 它拥有一个用Scala开发的简单数据处理服务。这些请求通过带有一些参数的cUrl命令通过REST接口发送到.jar,如下所示: curl -s -X POST -H "Content-Type: application/json" REMOTE_IP:8998/batches -d '{"file":"file://PATH_TO_JAR/target/MY_JAR

我有一个远程进程,它向我卑微的Spark独立集群发送数千个请求:

  • 3个工作节点,具有4个内核和8GB
  • 驱动程序运行的相同主节点
它拥有一个用Scala开发的简单数据处理服务。这些请求通过带有一些参数的cUrl命令通过REST接口发送到.jar,如下所示:

curl -s -X POST -H "Content-Type: application/json" REMOTE_IP:8998/batches -d '{"file":"file://PATH_TO_JAR/target/MY_JAR-1.0.0-jar-with-dependencies.jar","className":"project.update.MY_JAR","args":["C1:1","C2:2","C3:3"]}'
  • 每次都会触发一个火花作业
  • 集群的资源调度是动态的,因此一次最多可以服务3个请求
  • 当一个工作进程空闲时,将提供另一个排队请求
在某个时间点,即使请求处于等待状态(因为Spark注册要服务的作业),请求也会杀死主节点内存,挂起主节点,工作节点与主节点的连接也会断开

有没有一种方法可以让我对这些请求进行排队,防止它们使用Spark hold RAM?当工作人员空闲时,处理来自该队列的另一个请求


问题是类似的,即Thread.scheduler.capacity.max-applications只允许N个正在运行的应用程序,但我无法确定这是否是我需要的解决方案。Apache Livy没有这个功能,我不知道。

选项:1)尽可能减少每个作业使用的内核/内存以允许更多作业,2)使用第二个队列来保存作业积压,3)运行一个持久的spark作业,同时对其他作业进行排队/运行。请详细说明第三个选项?实际上很有趣,但我不确定一个“永不停歇”的工作会如何看到Livy正在接受请求,可能是一些服务在与Livy相同的端口侦听?第三个选项实际上可以通过Livy进行协调。启动一个spark应用程序(Livy会话),作为作业调度程序。它接收请求,然后将这些请求作为独立的应用程序并发和异步地提交。免责声明,我还没有尝试过这种方法,就我个人而言,我对支持这种不寻常的设计有着令人眩晕的想法。纱线是我常用的工具,但我也会考虑AirBNB或其他一些作业协调器(也许是你自己的轻量级API)的气流。谢谢你的澄清,我也会考虑气流。现在我来谈谈纱线。选项:1)减少每个作业使用的内核/内存(如果可能的话)以允许更多作业,2)使用第二个队列来保存积压的作业,3)运行一个持久的spark作业,同时对其他作业进行排队/运行。您能否详细介绍一下第三个选项?实际上很有趣,但我不确定一个“永不停歇”的工作会如何看到Livy正在接受请求,可能是一些服务在与Livy相同的端口侦听?第三个选项实际上可以通过Livy进行协调。启动一个spark应用程序(Livy会话),作为作业调度程序。它接收请求,然后将这些请求作为独立的应用程序并发和异步地提交。免责声明,我还没有尝试过这种方法,就我个人而言,我对支持这种不寻常的设计有着令人眩晕的想法。纱线是我常用的工具,但我也会考虑AirBNB或其他一些作业协调器(也许是你自己的轻量级API)的气流。谢谢你的澄清,我也会考虑气流。现在我要谈谈纱线。