2011-02-26 15 views
15

Estoy desarrollando una aplicación en la que necesito distribuir un conjunto de tareas en un grupo potencialmente grande de máquinas diferentes.Marco informático distribuido para Clojure/Java

Idealmente, me gustaría una forma muy simple e idiomática de hacer esto en Clojure, p. algo así como:

; 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)) 

bonificación si se puede hacer algo como Map-Reduce en el clúster, así .....

Cuál es la mejor manera de lograr algo como esto? ¿Tal vez podría envolver una biblioteca Java adecuada?

ACTUALIZACIÓN:

Gracias por toda la sugerencia de Apache Hadoop - parece que podría caber la cuenta, sin embargo, parece un poco como una exageración, ya que no estoy necesitando un sistema de almacenamiento de datos distribuidos como utiliza Hadoop (es decir, no necesito procesar miles de millones de registros) ... algo más ligero y enfocado en tareas de cómputo solo sería preferible si existiera.

+0

en el grupo google de clojure, ha habido discusiones acerca de los estándares de terracota, GridGain y Java (JMS, JXTA/shoal, JINI), puede buscarlos en google. –

Respuesta

7

Hadoop es la base de casi todos los grandes de datos grandes entusiasmo en el mundo Clojure estos días, aunque hay mejores maneras de que el uso de Hadoop directamente.

Cascalog es una interfaz muy popular:

 
    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. 

también echa un vistazo marco swarmiji trabajador distribuido de Amit Rathor construir en la parte superior de RabbitMQ. está menos enfocado en el procesamiento de datos y más en la distribución de un número fijo de tareas a un grupo de potencia informática disponible. (PS Está en su libro, Clojure in Action)

+0

gracias, se ven muy interesantes. aunque estoy más interesado en el procesamiento distribuido que en el big data, ¿parece que hadoop está más centrado en este último? – mikera

+2

En mi experiencia Hadoop es bastante incómodo; es mucho trabajo configurar un clúster y es complicado depurarlo.Si no necesita HDFS, es mucho más simple simplemente usar un sistema de colas como RabbitMQ para enviar alrededor de s-expressions. Hay algunas bibliotecas existentes para hacer esto, pero envolver el cliente Java RabbitMQ en un par de páginas del código Clojure es bastante fácil de estar en el territorio "dejado como un ejercicio para el lector". – technomancy

7

pesar de que no han llegado a usarlo sin embargo, creo que Storm es algo que le puede resultar útil para explorar:

Storm es un cálculo en tiempo real distribuido sistema. De forma similar a como Hadoop proporciona un conjunto de primitivas generales para realizar el procesamiento por lotes, Storm proporciona un conjunto de primitivas generales para realizar cálculos en tiempo real. Storm es simple, se puede usar con cualquier lenguaje de programación y es muy divertido de usar.

2

Storm podría satisfacer mejor sus necesidades que Hadoop, ya que no tiene almacenamiento de datos distribuidos y tiene baja latencia. Es posible dividir y procesar datos, similar a MapReduce, la api Trident hace que esto sea muy simple.

Está parcialmente escrito en Clojure, así que supongo que la interoperabilidad de Clojure es más fácil.

Otra opción es Onyx que ofrece una funcionalidad similar, pero es un proyecto puro basado en Clojure.

Cuestiones relacionadas