我们有一个应用程序,它构建在java/jax-rs上,在一个端口上侦听rest调用,我们使用tomcat来部署我们的应用程序,api侦听这个post调用,在一些名义上的过滤之后将数据转储到mysql中,然后一个定时器(java.util.Timer)线程每秒查询数据并处理它,并将其存储到另一个数据库中。现在,由于传入数据的频率/数据量非常大,mysql有时会阻塞。我们正在考虑采用主主复制(因为加载是在插入时进行的,所以主从复制不会有任何帮助),这可能会工作一段时间,但运行的算法也非常占用cpu。
因此,我们正在考虑一种永久的替代方案,它将spark引入到场景中,我们已经有了一个正在运行的hotonworks,它正在运行hadoop和hbase。
所以我想知道,如果我们有一个spark集群(比如在GCP上运行),并且可以设置spark这样一种方式,它将侦听相同的端口(我们不想在客户端产生任何影响),而不是在tomcat上运行java应用程序,spark将在1秒的间隔内运行小批处理作业,并完成其余过程。我知道spark能够与kafka、jdbc或从文件等几个spout连接。但它能取代rest api吗??
谢谢
发布于 2019-02-01 04:21:47
正如您可能知道的那样,Spark有自己的REST端点( Spark -jobserver),它提供了使用HTTP请求触发Spark作业并检索结果的能力。
但是,由于spark-j观察者的API级别较低,我认为这不是完全用它替换您的应用程序的最佳决定。
使用您自己的端点和特定于域的REST抽象,您将获得更好的结果。而不是发出低级别的post请求:
POST/jars/appName
POST/context/appCtx
POST/data/jobParams
POST/jobs/myJob您仍将发出特定于域的请求:
POST/add-user
{
email: 123@gmail.com
name: Alex
}在您的应用程序中,您只需启动您的小批量spark作业(例如在SparkLauncher的帮助下)。
因此您的代码可能如下所示(为简单起见,我将使用spring-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();
}https://stackoverflow.com/questions/54467121
复制相似问题