我的团队正在研究将sparkjava用于RESTful Web服务,但我对反序列化请求的选项不满意。
似乎有两种选择:
-
使用其默认的反序列化,它只提供嵌套的映射结构,这与使用Java 等OO语言的目的背道而驰
-
将每个路径定义封装在一堆样板文件中,以便反序列化/序列化请求和响应对象并调用处理程序方法。
我写了一些东西来减少样板的数量,所以你可以写这样的东西:
public void Routes() {
post("/happy/birthday", (request, response) -> {
return callJson(getHandler("birthday"), request, response);
});
}
这还不错,但它需要反射来查找生日方法,因此没有编译时验证生日处理程序方法的存在。但感觉应该有更好的方法。
可能有误解,但Spark Java只是Java,因此您可以使用任何Java序列化库。我把Gson和Spark一起用过。
Gson gson = new Gson();
post("/employee", (request, response) -> {
ValidateNewEmployeeCommand command = new ValidateNewEmployeeCommand();
Employee emp = gson.fromJson(request.body(), Employee.class);
return command.validateEmployee(emp);
}, gson::toJson);
Livy(Apache许可证)是一项服务,使远程应用程序能够通过REST API轻松地与Spark集群交互。它可以通过简单的REST接口或RPC客户端库轻松提交Spark作业或Spark代码片段、同步或异步结果检索以及SparkContext管理。Livy还简化了Spark和应用程序服务器之间的交互,简化了交互式web/移动应用程序所需的体系结构。
有了Livy,您还可以:
由多个客户端为多个Spark作业使用长时间运行的SparkContexts
同时管理多个SparkContext,并在集群(YARN/Mesos)上运行它们,而不是在Livy服务器上运行,以实现良好的容错和并发
以预编译的jar、代码片段或通过Java/Scala客户端API 提交作业
通过安全认证通信(正在进行的工作)确保安全
要使用Livy,必须在服务器上安装Spark(1.4或更高版本;Scala 2.10版本)。要开始,请从这里下载/安装软件包,然后只需执行以下操作:
https://blog.cloudera.com/blog/2016/07/livy-the-open-source-rest-service-for-apache-spark-joins-cloudera-labs/
看起来没有办法实现我的目标,但我们已经制定了一些实用程序,可以为我们完成任务,并允许我们以Dropwizard中定义的方式定义路由。我们会看看是否可以开源。