YCSB es una gran herramienta de benchmarking construida para ser fácilmente extendida por cualquier driver que soporte e implemente operaciones básicas como: insertar, leer, actualizar, borrar y escanear. Los datos sintéticos simples introducidos por YCSB se ajustan perfectamente a este paradigma.

Pero cuando se trata de trabajar con bases de datos JSON como Couchbase y MongoDB, YCSB es útil porque las consultas se vuelven mucho más sofisticadas: consulta de matrices y objetos anidados, ejecución de uniones y agregaciones.

Por un lado, la extensión YCSB-JSON debería ser capaz de utilizar todas las operaciones JSON posibles soportadas por una base de datos.
Por otra parte, la aplicación de este enfoque debe ser lo suficientemente genérico como para ser fácilmente extendido de YCSB y MongoDB, Couchbase, o cualquier otro controlador de base de datos, independientemente del nivel de consulta JSON que admita.

La conexión YCSB-JSON está diseñada para emular mejor los escenarios realistas del usuario final. Está diseñada para funcionar con cualquier dato JSON, ya sean conjuntos de datos reales, pseudorrealistas o totalmente sintéticos. Y uno de los requisitos de la herramienta es que no haya valores codificados en los predicados de consulta. Los usuarios sólo pueden controlar la cardinalidad de los datos durante el proceso de generación del conjunto de datos. 

 Fig. 1. Un vistazo a la implementación de YCSB-JSON

Modelo de datos

El modelo de datos que elegimos para esta comparativa está bien descrito en este artículo: https://dzone.com/articles/ycsb-json-benchmarking-json-databases-by-extending
El conjunto de datos se genera utilizando una herramienta fakeit y se carga en una base de datos (Couchbase, MongoDB) mediante scripts externos. Mientras que el modelo está definido y los valores fijos se generan aleatoriamente, estos datos se generan aleatoriamente pero no son sintéticos.

 

Gestión de datos

Para cada operación de la carga de trabajo, las consultas son fijas, pero los valores límite de cada predicado parametrizado son no deterministas. Por lo tanto, se eligió el siguiente flujo de gestión de datos:

  1. Generar documentos por fakeit. 
  2. Carga los datos generados en una base de datos mediante cualquier script externo.
  3. Ejecuta la fase de carga. Durante esta fase el YCSB leerá un subconjunto aleatorio de los documentos generados, almacenará todos sus valores en su caché interna.
  4. Durante la fase de ejecución, el YCSB utilizará los valores de su caché mientras vincula y ejecuta consultas contra la base de datos.

 

Generador de predicados

El YCSB utiliza generadores cuando opera con datos. El conector introduce su propio generador mapeado a un modelo de datos particular. La asignación y el modelo sólo existen dentro del espacio de nombres del generador. La salida del generador es un conjunto de predicados genéricos (pares campo-valor) para consultas concretas. Esto permite a los usuarios modificar los modelos y ampliar la herramienta con otras consultas sin modificar el resto del código central.

Generador de predicados: Generador.java 

 

Ejemplo #1:  Consulta de paginación

Una de las operaciones YCSB-JSON, la consulta de paginación, puede representarse mediante la siguiente sentencia:

SELECT * FROM WHERE address.zip = OFFSET LIMIT

El predicado de la consulta es un campo dentro de un objeto. Cuando se usa Couchbase N1QL el campo puede ser simplemente accedido como "direccion.zip". Pero otras bases de datos pueden no ser tan flexibles por lo que el generador YCSB-JSON crea 2 predicados: el predicado padre (dirección) y el predicado hijo/anidado (zip).

Y el predicado hijo tiene un valor elegido aleatoriamente de la lista de valores de muestra para este campo en particular. 

La siguiente función genera el Objeto SoeQueryPredicate
Dónde nombre es "dirección"
Y predicado anidado es otro objeto SoeQueryPredicate con el nombre "zip"y valor  :

 

Ejemplo #2  Consulta del informe

Los predicados para consultas más complejas se generan de la misma manera. La única diferencia es que cuando la consulta introduce varios predicados, la secuencia de predicados (matriz de predicados) se genera en lugar de un único predicado. A continuación se muestra la consulta Informe:

SELECT o2.mes, c2.dirección.zip, SUMA(o2.precio_venta) FROM c2
INNER JOIN pedidos o2 ON KEYS c2.lista_pedidos
WHERE c2.dirección.zip = "valor" AND o2.mes = "valor"
GROUP BY o2.mes, c2.dirección.zip ORDER BY SUM(o2.precio_venta)

Función a continuación genera secuencia de:
Predicado "mes", predicado "dirección" con predicado anidado "zip", predicado "precio_venta", etc:

Aquí encontrará otros generadores de consultas:
https://github.com/couchbaselabs/YCSB/blob/soe/core/src/main/java/com/yahoo/ycsb/generator/soe/Generator.java

 

Nuevas operaciones

Es necesario actualizar el código con nuevas operaciones.

Firmas en clase DB: 
https://github.com/couchbaselabs/YCSB/blob/soe/core/src/main/java/com/yahoo/ycsb/DB.java#L140:

Implementaciones en DBWrapper: 
https://github.com/couchbaselabs/YCSB/blob/soe/core/src/main/java/com/yahoo/ycsb/DBWrapper.java#L346:

Ampliación de CoreWorkload con nuevas operaciones: SoeWorkload.java

 

Implementación de operaciones YCSB-JSON para Couchbase y MongoDB

La función DB driver de una operación YCSB-JSON toma un parámetro adicional que es un objeto generador. Es pasado por la clase Workload y tiene una secuencia de predicado particular pre-construida.

Dado que la estructura y las secuencias de los predicados están bien definidas por el generador, un controlador de BD puede acceder directamente a los nombres y valores y construir la consulta utilizando su lenguaje de consulta nativo u otros métodos de acceso. A continuación se muestran ejemplos de implementación de consultas de Página e Informe.

Consulta de página, generando una sentencia de consulta para Couchbase:

para MongoDB:

Consulta del informeCouchbase:

MongoDB:

Todas las implementaciones de Couchbase: Couchbase2Client.java

Todas las implementaciones de MongoDB: MongoDbClient.java

Referencias

Artículo parte 1:
 https://www.couchbase.com/blog/ycsb-json-benchmarking-json-databases-by-extending-ycsb/

Implementación de YCSB-JSON:
https://github.com/couchbaselabs/YCSB/tree/soe

FakeIt:
 https://github.com/bentonam/fakeit

Próximos pasos

Implementar un generador tipo fakeit para simplificar la generación de datos y predicados de consulta.

Autor

Publicado por Alex Gyryk

Alex Gyryk es Ingeniero de Software Principal, Rendimiento en Couchbase. Antes de unirse a Couchbase, pasó unos años en Forte Group como Analista Senior de Rendimiento.

Dejar una respuesta