java进程通过REST端点从Spark应用程序中接收请求
我有一个场景,需要在20节点集群上处理Spark作业中用户的输入请求。Spark应用程序使用深度学习,并对存储在HDFS上的用户数据进行一些预测。其想法是提供一个类似REST Web服务的环境,用户可以向该环境发送请求,并应使用Spark在Thread上以分布式模式处理这些请求。以下是问题:
- 当我构建带有依赖项的
jar
文件时,它的大小更大 超过1gb。深度CNN模型不嵌入jar
文件中李> - 通过
spark-submit
为每个输入请求运行应用程序似乎不切实际,因为:spark-submit
有自己的开销。资源分配、jvm应用程序容器分配等都需要时间- 该应用程序在启动时加载经过CNN深度训练的模型,一个模型的大小约为700mb,加载也需要时间
我的想法是使用spark-submit
作为无限运行的作业提交一次应用程序,将spark上下文和模型保留在内存中,并公开一个REST端点,用户可以向其发送请求。收到请求后,从正在运行的作业中触发映射操作,获取结果,并以Json
格式将其返回给用户。这样一来,它们将立即得到处理,不会有任何延迟。这可能吗
我研究了很多文章,也研究了一些问题,比如Using Spark to process requests、Best Practice to launch Spark Applications via Web Application?、run spark as java web application、how to deploy war file in spark-submit command (spark)和Creating a standalone on-demand Apache Spark web service,但是,这些都不符合我描述的场景
从文章和stackoverflow问题中,我了解到Spark REST API和Apache Livy可以用来提交Spark作业,然而,在这两种情况下,每一个请求都会提交一个Spark作业,这与我前面描述的问题相同(1+gb jar文件大小加上starup上的加载模型)。另外,在多个并发输入请求中会发生什么?我说得对吗
我读到Uber使用Spark进行路由计算(article,article,article),但它的源代码是封闭的,我不知道他们如何在每次输入用户请求时动态地进行计算
简而言之,是否可以使用轻量级框架(如Spark Java)在Spark作业中嵌入REST微服务?Spark streaming在这种情况下也不适用,因为没有流数据源
我已经寻找了很长时间,但我从未找到一个切实可行的解决方案。如果我对Spark REST Api和Livy的理解有误,请纠正我的错误?如果我的想法是错误的,你能告诉我还有什么其他方法可以完成这项工作吗?我们将非常感谢您的任何帮助或建议
共 (0) 个答案