可以使用Spark Cluster代替Java Rest应用程序

时间:2019-01-31 18:32:57

标签: rest apache-spark jax-rs

我们有一个应用程序,它构建于Java / JAX-RS,它会监听端口上休息电话,而我们使用Tomcat来部署我们的应用程序,该API监听到这个帖子的呼叫,数据转储到MySQL后,进行一些名义上的过滤,然后一个timer(java.util.Timer)线程每秒查询一次数据并对其进行处理,并将其存储到另一个数据库中。现在随着频率/输入数据的量是相当庞大的MySQL是某个弄僵了。我们正在考虑去一个法师的复制(如负载是插入,所以主从不会有任何帮助),可工作一段时间,但运行算法也非常CPU密集型。

因此,我们正在考虑一种永久替代方案,它会给场景带来火花,我们已经有一个运行中的hotonworks,它正在为hadoop和hbase运行。

所以,我想知道,如果我们有一个火花集群(说对GCP运行),并可以设置火花这样一种方式,它会被监听相同的端口(我们不希望在客户端有任何影响),而是Tomcat上运行的Java应用程序的,火花将在1秒的时间间隔运行小批作业,并执行过程的其余部分。我知道spark可以与kafka,jdbc或来自文件等的多个接口连接。但是它可以代替rest api吗?

谢谢

1 个答案:

答案 0 :(得分:1)

您可能知道Spark有其自己的REST端点(spark-jobserver),该端点可通过HTTP请求触发Spark作业并检索结果。
但是由于spark-jobserver的API级别较低,我认为这不是用它完全替换您的应用程序的最佳决定。
您将使用自己的终端与特定领域的REST抽象得到更好的结果。而不是发出低级别的帖子请求:

POST/jars/appName
POST/context/appCtx
POST/data/jobParams
POST/jobs/myJob

您仍将发出针对特定域的请求:

POST/add-user 
{
     email: 123@gmail.com
     name: Alex
}

而在你的应用程序,你会刚开始你的小批量火花职位(SparkLauncher的帮助,作为一个例子)。

所以,你的代码可能是这样的(我会用弹簧的MVC简单):

@RequestMapping(value = "/add-user", method = RequestMethod.POST)
public String addUser(@RequestBody User user) {
    new SparkLauncher()
              .setAppResource(<path to jar>)
              .setMaster("yarn-cluster") 
              .setDeployMode("client")
              .setVerbose(true)
              .setMainClass("com.test.Main")               
              .startApplication();
}