Clojure/Java 的分布式计算框架

我正在开发一个应用程序,我需要在一个可能非常大的不同计算机集群中分配一组任务。

理想情况下,我想要一种非常简单的惯用方式在Clojure中执行此操作,例如:

; create a clustered set of machines
(def my-cluster (new-cluster list-of-ip-addresses))

; define a task to be executed
(deftask my-task (my-function arg1 arg2))

; run a task 10000 times on the cluster
(def my-job (run-task my-cluster my-task {:repeat 10000})

; do something with the results:
(some-function (get-results my-job))

如果它也可以在集群上做类似Map-Reduce的事情,那就太好了.....

实现此类目标的最佳方法是什么?也许我可以包装一个合适的Java库?

更新:

感谢Apache Hadoop的所有建议 - 看起来它可能符合要求,但是它似乎有点过分,因为我不需要像Hadoop那样的分布式数据存储系统(即我不需要处理数十亿条记录)...如果存在更轻量级且仅专注于计算任务的东西将更可取。


答案 1

Hadoop是当今Clojure世界中几乎所有大规模大数据兴奋的基础,尽管有比直接使用Hadoop更好的方法。

Cascalog是一个非常流行的前端:

    Cascalog is a tool for processing data on Hadoop with Clojure in a concise and
    expressive manner. Cascalog combines two cutting edge technologies in Clojure 
    and Hadoop and resurrects an old one in Datalog. Cascalog is high performance, 
    flexible, and robust.

另请查看 Amit Rathor 在 RabbitMQ 之上构建的 swarmiji 分布式工作线程框架。它不太关注数据处理,而是更多地关注将固定数量的任务分配到可用计算能力池上。(附言这是在他的书中,Clojure in Action。)


答案 2

虽然我还没有使用它,但我认为Storm是你可能会发现有用的探索:

Storm是一个分布式实时计算系统。类似于Hadoop提供一组用于进行批处理的通用基元,Storm提供了一组用于执行实时计算的通用基元。Storm很简单,可以与任何编程语言一起使用,并且使用起来很有趣!


推荐