stream dataflow control-flow-graph

stream - Procesamiento de flujo de datos



dataflow control-flow-graph (1)

Apache Storm: Procesamiento Stream en tiempo real y confiable en hardware distribuido

Esto parece un problema para el cual Apache Storm (código abierto) sería perfecto: http://storm.apache.org/

Apache Storm se trata de computación en tiempo real, que procesa tuplas únicas (puntos de datos) de a una por vez. Storm garantiza que cada tupla se procesa al menos una vez. Con Storm Trident puedes abstraer Storm más y obtener exactamente una vez la semántica.

Apache Storm es un sistema de computación en tiempo real distribuido de fuente abierta y gratuita. Storm facilita el procesamiento confiable de flujos ilimitados de datos, haciendo para el procesamiento en tiempo real lo que Hadoop hizo para el procesamiento por lotes.

Mi compañía y yo hemos trabajado con Apache Storm durante varios años y es una de las tecnologías de Big Data más maduras. La tecnología de Big Data es una tecnología que se ejecuta de forma distribuida horizontalmente (en hardware básico barato).

API y documentación

La API principal es para Java, pero hay adaptadores para Ruby, Python, Javascript, Perl. Sin embargo, en realidad puede usar cualquier idioma: http://storm.apache.org/about/multi-language.html

La documentación es buena (aunque JavaDoc podría usar algunos detalles más): http://storm.apache.org/documentation.html

Idea básica: surtidos y pernos (= nodos de gráfico)

Storm tiene Spouts desde el que puede leer datos en su llamada topología. La topología es este gráfico que describiste. Cuando aparecen nuevas tuplas en los vertidos, se envían a través de la topología. Cada uno de los nodos es uno de los Pernos de tormenta.

Casos de uso

Storm tiene muchos casos de uso: análisis en tiempo real, aprendizaje automático en línea, computación continua, RPC distribuido, ETL y más. Storm es rápido: un punto de referencia registró más de un millón de tuplas procesadas por segundo por nodo. Es escalable, tolerante a fallas, garantiza que sus datos serán procesados, y es fácil de configurar y operar.

Tengo una clase de cálculos que parece tomar naturalmente una estructura de gráfico. El gráfico está lejos de ser lineal, ya que hay múltiples entradas y nodos que se abren en abanico y nodos que requieren el resultado de varios otros nodos. En todos estos cálculos, posiblemente también haya varios sumideros. Sin embargo, ningún ciclo está presente. Los nodos de entrada se actualizan (no necesariamente de uno en uno) y sus valores fluyen a través del gráfico (en este punto puramente conceptual). Los nodos conservan el estado a medida que cambian las entradas, y los cálculos tienen que ejecutarse secuencialmente con respecto a las entradas.

Como tengo que escribir tales cálculos con bastante frecuencia y soy reacio a escribir un código ad-hoc cada vez, he intentado escribir una pequeña biblioteca para facilitar la compilación de dichos cálculos escribiendo clases para los distintos vértices. Mi código, sin embargo, es bastante poco elegante y no aprovecha ninguna ventaja de la estructura paralela de estos cálculos. Si bien cada vértice suele ser liviano, los cálculos pueden volverse bastante complejos y "anchos". Para hacer que el problema sea aún más complicado, las entradas para estos cálculos se actualizan con mucha frecuencia en un bucle. Afortunadamente, los problemas son de una escala lo suficientemente pequeña como para poder manejarlos en un solo nodo.

¿Alguien ha tratado alguna vez con algo similar? ¿Qué ideas / enfoques / herramientas recomendarías?