2011-01-26 14 views
6

Vengo de un fondo de Java y tengo un problema de límite de CPU que estoy tratando de paralelizar para mejorar el rendimiento. He dividido mi código para que funcione de forma modular, de modo que pueda distribuirse y ejecutarse de forma paralela (con suerte).Paralelización/Opciones de clúster para la ejecución de código

@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW) 
public void runMyJob(List<String> some params){ 
    doComplexEnoughStuffAndWriteToMysqlDB(); 
} 

Ahora, he estado pensando de las siguientes opciones para la paralelización de este problema y me gustaría pensamientos de la gente/experiencia en esta área.

Opciones momento que estoy pensando:

1) El uso de Java EE (por ejemplo, JBoss) clustering y MessageDrivenBeans. Los MDB están en los nodos esclavos del clúster. Cada MDB puede recoger un evento que da inicio a un trabajo como el anterior. Los servidores AFAIK Java EE MDB son multiproceso por el servidor de aplicaciones, por lo que es de esperar que también puedan aprovechar las multinúcleas. Por lo tanto, debe ser vertical y horizontalmente escalable.

2) Podría usar algo como Hadoop y Map Reduce. Las preocupaciones que tengo aquí es que mi lógica de procesamiento de trabajo es bastante alto, así que no estoy seguro de qué tan traducible sea Map Reduce. Además, soy un novato total para MR.

3) Podría ver algo así como Scala, que creo que hace que la programación de concurrencia sea mucho más simple. Sin embargo, aunque es escalable verticalmente, no es una solución de clúster/escalable horizontalmente.

De todos modos, espero que todo eso tenga sentido y muchas gracias por la ayuda brindada.

+1

Akka proporciona una robusta capacidad de actor remoto para Scala, por lo que no estoy seguro de que sea justo decir que Scala no es escalable horizontalmente. (De hecho, incluso la biblioteca principal de Scala proporciona algo de apoyo para los actores remotos.) –

+0

Hola Rex, gracias, ese es exactamente el tipo de cosas que supongo que no sé mucho sobre. Entonces, ¿es fácil distribuir trabajos entre nodos con Scala y Akka? ¿Lo recomendaría sobre decir usando un cluster JBoss? – Brian

+0

Me temo que no sé lo suficiente para recomendar tampoco; Solo sé que es una posibilidad. –

Respuesta

0

la solución que está buscando es Akka. La agrupación es una característica en fase de desarrollo, y normalmente se incluye en Akka 2,1

  • Excelente Scala y Java Api, muy completa
  • puramente orientado a mensajes patrón, sin estado compartido
  • Falla resistente y escalable
  • extremadamente fácil de distribuir los trabajos

favor de deshacerse de J2EE si todavía está a tiempo. Le invitamos a unirse a la lista de correo de Akka para hacer sus preguntas.

0

Debería echar un vistazo a spark. Es un marco de cálculo de clústeres escrito en Scala con el objetivo de ser una alternativa viable a Hadoop. Tiene una serie de buenas hazañas:

  • en memoria Cálculos: Se puede controlar el grado de almacenamiento en caché
  • Hadoop de entrada/interoperabilidad de salida: Spark puede leer/escribir datos de todas las fuentes de entrada de Hadoop como HDFS, EC2, etc.
  • El concepto de "Resilient Conjuntos de datos distribuidas" (RDD), que le permite ejecutar directamente la mayoría de las cargas de trabajo de estilo MR en paralelo en un clúster como lo haría localmente
  • API primario = Scala, opcional python y Java API
  • Hace uso de Akka :)

Si entiendo su pregunta correctamente, Spark combinaría sus opciones 2) y 3).

Cuestiones relacionadas