2011-07-26 15 views
7

Tengo una solución que se puede paralelizar, pero aún no tengo experiencia con hadoop/nosql, y no estoy seguro de cuál es la mejor solución para mis necesidades. En teoría, si tuviera CPU ilimitadas, mis resultados deberían regresar instantáneamente. Por lo que cualquier ayuda se agradece. ¡Gracias!consultar en tiempo real/agregar millones de registros - hadoop? hbase? ¿Casandra?

Esto es lo que tengo:

  • 1000s de conjuntos de datos
  • llaves de conjuntos de datos:
    • todos los conjuntos de datos tienen las mismas claves
    • 1 millón de claves (esto puede posteriormente ser de 10 o 20 millones)
  • columnas del conjunto de datos:
    • cada conjunto de datos tiene las mismas columnas
    • 10 a 20 columnas
    • mayoría de las columnas son los valores numéricos para los que tenemos que agregar el (promedio, STDDEV, y el uso de R para calcular las estadísticas)
    • algunas columnas son "TYPE_ID" columnas, ya que en una consulta en particular que pueden sólo quieren incluir ciertos type_ids
  • aplicación web
    • usuario puede elegir qué Datas ets que están interesados ​​en (entre 15 a 1000) necesita
    • aplicación para presentar: llave, y los resultados agregados (avg, STDDEV) de cada columna
  • actualizaciones de datos:
    • todo un conjunto de datos se puede agregar, soltar o reemplazar/actualizar
    • sería genial poder agregar columnas. Pero, si es necesario, puede simplemente reemplazar todo el conjunto de datos.
    • nunca añada filas/llaves de un conjunto de datos - lo que no necesitan un sistema con una gran cantidad de escrituras rápidas
  • infraestructura:
    • actualmente dos máquinas con 24 núcleos cada
    • finalmente, quiero capacidad de ejecutar también esta en Amazon

no puedo calcular previamente mis valores agregados, pero ya que cada tecla i s independiente, esto debería ser fácilmente escalable. Actualmente, tengo estos datos en una base de datos postgres, donde cada conjunto de datos está en su propia partición.

  • particiones son agradables, ya que se pueden agregar fácilmente de inserción/extracción/reemplazo particiones
  • base de datos es agradable para el filtrado basado en TYPE_ID
  • bases de datos no son fáciles para escribir consultas paralelas
  • bases de datos son buenos para estructurada datos y mis datos no está estructurado

Como una prueba de concepto que probé hadoop:

  • creado un archivo separado pestaña por cada conjunto de datos para un determinado TYPE_ID
  • subido a hdfs
  • mapa: recuperan un valor/columna para cada
  • reducir clave: calculado promedio y desviación estándar

De mi tosca prueba de concepto, puedo ver que esto se escalará muy bien, pero puedo ver que hadoop/hdfs tiene latencia. He leído que generalmente no se utiliza para consultar en tiempo real (aunque estoy de acuerdo en devolver los resultados). a los usuarios en 5 segundos).

¿Alguna sugerencia sobre cómo debo abordar esto? Estaba pensando en probar HBase para sentir eso. ¿Debo mirar a Hive? Cassandra? Voldemort?

gracias!

Respuesta

6

Colmena o cerdo no parece que lo ayuden. Esencialmente, cada uno de ellos se compila para una o más tareas de asignación/reducción, por lo que la respuesta no puede ser dentro de 5 segundos

HBase puede funcionar, aunque su infraestructura es un poco pequeña para un rendimiento óptimo. No entiendo por qué no puede precomputar estadísticas de resumen para cada columna. Debería buscar los promedios corrientes de la informática para que no tenga que hacer reducciones de peso.

la salida http://en.wikipedia.org/wiki/Standard_deviation

STDDEV (X) = sqrt (E [x^2] - (E [X])^2)

esto implica que se puede obtener el STDDEV de AB haciendo

sqrt (E [AB^2] - (E [AB])^2). E [AB^2] es (suma (A^2) + suma (B^2))/(| A | + | B |)

+0

Gracias por la ayuda. Probablemente no tenía claro por qué no puedo hacer cálculos previos. Estoy buscando el valor promedio para una clave en particular y una columna en particular sobre un conjunto de conjuntos de datos arbitrarios (especificados por el usuario). Por ejemplo, un usuario puede elegir 500 conjuntos de datos, pero un usuario diferente puede elegir 500 conjuntos de datos diferentes. Aunque calculamos las estadísticas para todas las mismas claves y para todas las mismas columnas, los conjuntos de datos (archivos en hadoop o particiones en mi base de datos) son los que varian. Gracias. – anish

+0

@anish Para el stddev y el promedio, puede precalcular y almacenar suficiente información para combinar conjuntos rápidamente: simplemente haga un seguimiento de la suma de los valores, la suma de los cuadrados y el recuento total. – cftarnas

+0

OK, me siento un poco denso aquí, y me falta totalmente la forma de precalcular fácilmente los datos. Soy humilde ... ¿puedo obtener un poco de ayuda? Si tengo 3 datasets (A, B, C), mis posibles combos son: A, B, C, ABC, AB, BC. ¿No necesitaría precomputar todas las permutaciones? Con miles de datasets, esto sería una gran cantidad de datos. Alternativamente, iba a tratar de mejorar el rendimiento de recuperar los valores para conjuntos de datos específicos de todas las claves mediante: consultas paralelas, y tal vez un enfoque orientado a columnas (columnas = conjuntos de datos y valores correspondientes). David, gracias por decirme que pruebe HBase. ¡Gracias! – anish

2

Es un problema grave sin una buena solución en el espacio de código abierto. En el espacio comercial las bases de datos MPP como greenplum/netezza deberían hacer. Lo ideal sería que necesitaras Dremel de Google (motor detrás de BigQuery). Estamos desarrollando un clon de código abierto, pero llevará algo de tiempo ... Independientemente del motor utilizado, creo que la solución debe incluir mantener todo el conjunto de datos en la memoria, debería dar una idea del tamaño del clúster que necesita.

2

Si he entendido bien y sólo tendrá que agregar en columnas individuales en un momento Se pueden almacenar los datos de manera diferente para obtener mejores resultados en HBase que sería algo como tabla por la columna de datos en la configuración actual y otro single tabla para los campos de filtrado (type_ids) fila para cada clave en la configuración de hoy; es posible que desee pensar cómo incorporar sus campos de filtro en la clave para un filtrado eficiente; de ​​lo contrario, tendría que hacer una lectura en dos fases ( columna para cada tabla en la configuración de hoy (es decir, algunos miles de columnas) HBase no le importa si agrega columnas nuevas y es escasa en el sentido de que no almacena datos para columnas que no existen. Cuando lea una fila obtendrá todo el valor relevante que puede hacer avg. etc. bastante fácilmente

+0

Esta debería ser la respuesta correcta. – Suman

4

Dado que sus datos parecen ser bastante homogéneos, definitivamente echaré un vistazo a Google BigQuery - Puede ingerir y analizar los datos sin un paso MapReduce (de su parte), y la API RESTful ayudará usted crea una aplicación web basada en sus consultas. De hecho, dependiendo de cómo quiera diseñar su aplicación, podría crear una aplicación bastante 'en tiempo real'.

0

Es posible que desee utilizar una base de datos antigua simple para esto. No parece que tengas un sistema transaccional. Como resultado, probablemente pueda usar solo una o dos tablas grandes. SQL tiene problemas cuando necesita unirse a datos de gran tamaño. Pero dado que su conjunto de datos no suena como si necesitara unirse, debería estar bien. Puede configurar los índices para encontrar el conjunto de datos y hacerlo en SQL o en aplicaciones matemáticas.

Cuestiones relacionadas