Análisis en DynamoDB
Los equipos de ingeniería a menudo necesitan ejecutar filtros complejos, agregaciones y búsquedas de texto en datos de DynamoDB. Sin embargo, DynamoDB es una base de datos operativa optimizada para el procesamiento de transacciones y no para análisis en tiempo actual. Como resultado, muchos equipos de ingeniería alcanzan límites en el análisis en DynamoDB y buscan opciones alternativas.
Esto se debe a que las cargas de trabajo operativas tienen patrones de acceso muy diferentes a los de las cargas de trabajo analíticas complejas. DynamoDB solo admite un conjunto limitado de operaciones, lo que dificulta el análisis y, en algunas situaciones, no es posible. Incluso AWS, la empresa detrás de DynamoDB, aconseja a las empresas que consideren descargar el análisis a otras soluciones especialmente diseñadas. Una solución a la que comúnmente se hace referencia es Elasticsearch, en la que nos sumergiremos hoy.
DynamoDB es una de las bases de datos NoSQL más populares y es utilizada por muchas empresas a escala internet en juegos, redes sociales, IoT y servicios financieros. DynamoDB es la base de datos elegida por su escalabilidad y simplicidad, lo que permite un rendimiento de milisegundos de un solo dígito a escalas de 20 millones de solicitudes por segundo. Para lograr esta velocidad a escala, DynamoDB se enfoca con precisión en el rendimiento de las cargas de trabajo operativas: operaciones de alta frecuencia y baja latencia en registros de datos individuales.
Elasticsearch es un motor de búsqueda distribuido de código abierto basado en Lucene y se utiliza para casos de uso de búsqueda de texto y análisis de registros. Elasticsearch es parte de la pila ELK más grande que incluye Kibana, una herramienta de visualización para tableros analíticos. Si bien Elasticsearch es conocido por ser versatile y altamente personalizable, es un sistema distribuido complejo que requiere operaciones y administración de clústeres e índices para mantener el rendimiento. Hay ofertas administradas de Elasticsearch disponibles de Elastic y AWS, por lo que no necesita ejecutarlo usted mismo en instancias EC2.
Enchufe desvergonzado: conjunto de cohetes es una base de datos de análisis en tiempo actual creada para la nube. Tiene un conector integrado para DynamoDB e ingiere e indexa datos para búsquedas, agregaciones y uniones en fracciones de segundo. Pero esta publicación trata de resaltar casos de uso para DynamoDB y Elasticsearch, en caso de que desee explorar esa opción.
Conexión de DynamoDB a Elasticsearch mediante AWS Lambda
Puede usar AWS Lambda para cargar continuamente datos de DynamoDB en Elasticsearch para análisis. Así es como funciona:
- Cree una función lambda para sincronizar cada actualización de un Flujo de DynamoDB en Elasticsearch
- Cree una función lambda para tomar una instantánea de la tabla de DynamoDB existente y enviarla a Elasticsearch. Puedes usar un secuencia de comandos EC2 o un Transmisión de Amazon Kinesis para leer el contenido de la tabla de DynamoDB.
Existe un enfoque alternativo para sincronizar datos con Elasticsearch que implica el Complemento Logstash para DynamoDB, pero actualmente no es suitable y puede ser complejo de configurar.
Búsqueda de texto en datos de DynamoDB mediante Elasticsearch
La búsqueda de texto es la búsqueda de texto dentro de un documento para encontrar los resultados más relevantes. A menudo, querrá buscar una parte de una palabra, un sinónimo o antónimo de palabras o una cadena de palabras juntas para encontrar el mejor resultado. Algunas aplicaciones incluso ponderarán los términos de búsqueda de manera diferente según su importancia.
DynamoDB puede admitir algunos casos de uso de búsqueda de texto limitado simplemente mediante el uso de particiones para ayudar a filtrar los datos. Por ejemplo, si tiene un sitio de comercio electrónico, puede particionar los datos en DynamoDB en función de una categoría de producto y luego ejecutar la búsqueda en la memoria. Aparentemente, así es como División minorista de Amazon.com maneja una gran cantidad de casos de uso de búsqueda de texto. DynamoDB también admite una contiene función que le permite encontrar una cadena que contiene una subcadena specific de datos.
Un sitio de comercio electrónico puede dividir los datos según la categoría del producto. Se pueden mostrar atributos adicionales con los datos que se buscan, como la marca y el coloration.
En escenarios donde la búsqueda de texto completo es elementary para su aplicación, querrá usar un motor de búsqueda como Elasticsearch con una clasificación de relevancia. Así es como funciona la búsqueda de texto a un alto nivel en Elasticsearch:
- Clasificación de relevancia: Elasticsearch tiene una clasificación de relevancia que otorga a los resultados de búsqueda listos para usar o puede personalizar la clasificación para el caso de uso de su aplicación específica. De forma predeterminada, Elasticsearch creará una puntuación de clasificación basada en la frecuencia de términos, la frecuencia de documentos inversa y la norma de longitud de campo.
- Análisis de texto: Elasticsearch divide el texto en tokens para indexar los datos, lo que se denomina tokenización. Luego se aplican analizadores a los términos normalizados para mejorar los resultados de búsqueda. El analizador estándar predeterminado divide el texto de acuerdo con el Consorcio Unicode para brindar soporte normal en varios idiomas.
Elasticsearch también tiene conceptos como búsqueda aproximada, búsqueda de autocompletar e incluso se puede configurar una relevancia más avanzada para cumplir con las especificaciones de su aplicación.
Filtros complejos en datos de DynamoDB mediante Elasticsearch
Se utilizan filtros complejos para reducir el conjunto de resultados, recuperando así los datos de forma más rápida y eficiente. En muchos escenarios de búsqueda, querrá combinar varios filtros o filtrar en un rango de datos, como durante un período de tiempo.
DynamoDB particiona los datos y elegir una buena clave de partición puede ayudar a que el filtrado de datos sea más eficiente. DynamoDB también admite índices secundarios para que pueda replicar sus datos y usar una clave principal diferente para admitir filtros adicionales. índices secundarios puede ser útil cuando existen múltiples patrones de acceso a sus datos.
Por ejemplo, se podría diseñar una aplicación de logística para filtrar artículos en función de su estado de entrega. Para modelar este escenario en DynamoDB, crearemos una tabla base para logística con una clave de partición de Item_ID
una clave de clasificación de Standing
y atributos comprador, ETA
y SLA
.
También necesitamos admitir un patrón de acceso adicional en DynamoDB para cuando los retrasos en la entrega excedan el SLA. Los índices secundarios en DynamoDB se pueden aprovechar para filtrar solo las entregas que superan el SLA.
Se creará un índice en el campo. ETADelayedBeyondSLA
que es una réplica del atributo ETA que ya está en la tabla base. Estos datos solo se incluyen en ETADelayedBeyondSLA
cuando la ETA excede el SLA. El índice secundario es un índice disperso, lo que scale back la cantidad de datos que deben analizarse en la consulta. Él purchaser
es la clave de partición y la clave de clasificación es ETADelayedBeyondSLA
.
Los índices secundarios se pueden usar para admitir múltiples patrones de acceso en la aplicación, incluidos los patrones de acceso que involucran filtros complejos.
DynamoDB tiene un expresión de filtro operación en su API de consulta y exploración para filtrar los resultados que no coinciden con una expresión. Él filterexpression
se aplica solo después de una operación de tabla de consulta o exploración, por lo que aún está sujeto al límite de 1 MB de datos para una consulta. Dicho esto, el filterexpression
es útil para simplificar la lógica de la aplicación, reducir el tamaño de la carga útil de la respuesta y validar el vencimiento del tiempo de vida. En resumen, aún necesitará particionar sus datos de acuerdo con los patrones de acceso de su aplicación o usar índices secundarios para filtrar datos en DynamoDB.
DynamoDB organiza los datos en claves y valores para una recuperación rápida de datos y no es splendid para filtrado complejo. Cuando necesite filtros complejos, es posible que desee pasar a un motor de búsqueda como Elasticsearch, ya que estos sistemas son ideales para consultas de aguja en el pajar.
En Elasticsearch, los datos se almacenan en un índice de búsqueda, es decir, la lista de documentos para los que el valor de la columna se almacena como una lista de publicación. Cualquier consulta que tenga un predicado (es decir: WHERE
person=A) puede obtener rápidamente la lista de documentos que satisfacen el predicado. A medida que se ordenan las listas de publicación, se pueden combinar rápidamente en el momento de la consulta para que se cumplan todos los criterios de filtrado. Elasticsearch también utiliza almacenamiento en caché easy para acelerar el proceso de recuperación de consultas de filtro complejas a las que se accede con frecuencia.
Consultas de filtro, comúnmente conocidas como consultas sin puntuación en Elasticsearch, puede recuperar datos de manera más rápida y eficiente que las consultas de búsqueda de texto. Eso es porque la relevancia no es necesaria para estas consultas. Además, Elasticsearch también admite consultas de rango, lo que permite recuperar datos rápidamente entre un límite superior e inferior (es decir: age
entre 0-5).
Agregaciones en datos de DynamoDB mediante Elasticsearch
Las agregaciones son cuando los datos se recopilan y se expresan en forma de resumen para la inteligencia comercial o el análisis de tendencias. Por ejemplo, es posible que desee mostrar las métricas de uso de su aplicación en tiempo actual.
DynamoDB no admite funciones agregadas. La solución alternativa recomendada por AWS es utilizar DynamoDB y Lambda para mantener una vista agregada de los datos en una tabla de DynamoDB.
usemos agregando me gusta en un sitio de redes sociales como Twitter como ejemplo. haremos el tweet_ID
la clave principal y luego la clave de clasificación la ventana de tiempo por la cual estamos agregando Me gusta. En este caso, habilitaremos las transmisiones de DynamoDB y adjuntaremos una función Lambda para que, a medida que los tweets gustan (o no gustan), se tabulan en like_count
con una marca de tiempo (es decir: last_ up to date
).
En este escenario, las transmisiones de DynamoDB y las funciones de Lambda se utilizan para tabular like_count como un atributo en la tabla.
Otra opción es descargar las agregaciones a otra base de datos, como Elasticsearch. Elasticsearch es un índice de búsqueda en esencia y ha agregado extensiones para admitir funciones de agregación. Una de esas extensiones es valores de documento, una estructura construida en tiempo de indexación para almacenar valores de documentos en una forma orientada a columnas. La estructura se aplica de forma predeterminada a los campos que admiten valores de documentos y hay un exceso de almacenamiento que viene con los valores de documentos. Si solo necesita soporte para agregaciones en datos de DynamoDB, puede ser más rentable usar un almacén de datos que pueda comprimir datos de manera eficiente para consultas analíticas en conjuntos de datos amplios.
- Aquí hay una descripción normal de alto nivel de Agregación de Elasticsearch estructura:
- Agregaciones de depósitos: puede pensar en la creación de depósitos como algo related a
GROUP BY
en el mundo de las bases de datos SQL. Puede agrupar documentos según valores de campo o rangos. Las agregaciones de depósitos de Elasticsearch también incluyen la agregación anidada y la agregación principal-secundario, que son soluciones alternativas comunes a la falta de compatibilidad con las uniones. - Agregaciones de métricas: las métricas le permiten realizar cálculos como
SUM
,COUNT
,AVG
,MIN
,MAX
, and so forth. en un conjunto de documentos. Las métricas también se pueden usar para calcular valores para una agregación de depósitos. - Agregaciones de canalización: las entradas en las agregaciones de canalización son otras agregaciones en lugar de documentos. Los usos comunes incluyen promedios y clasificación basada en una métrica.
Puede haber implicaciones de rendimiento al usar agregaciones, especialmente cuando escala Elasticsearch.
Alternativa a Elasticsearch para búsqueda, agregaciones y uniones en DynamoDB
Si bien Elasticsearch es una solución para realizar búsquedas complejas y agregaciones de datos de DynamoDB, muchos defensores sin servidor se han hecho eco de las preocupaciones con esta elección. Los equipos de ingeniería eligen DynamoDB porque no requiere servidores y se puede usar a escala con muy poca sobrecarga operativa. Hemos evaluado algunas otras opciones para análisis en DynamoDBincluidos Athena, Spark y Rockset, sobre la facilidad de configuración, el mantenimiento, la capacidad de consulta y la latencia en otro weblog.
Rockset es una alternativa a Elasticsearch y Alex DeBrie se ha paseado por ahí filtrar y agregar consultas utilizando SQL en Rockset. Rockset es una base de datos nativa de la nube con un conector integrado a DynamoDB, lo que facilita comenzar y escalar casos de uso analíticos, incluidos los casos de uso que involucran uniones complejas. Puede explorar Rockset como una alternativa a Elasticsearch en nuestro prueba free of charge con $300 en créditos.