paint-brush
Usando Elasticsearch para descarregar pesquisas e análises do DynamoDB: prós e contraspor@rocksetcloud
231 leituras

Usando Elasticsearch para descarregar pesquisas e análises do DynamoDB: prós e contras

por Rockset8m2024/05/10
Read on Terminal Reader

Muito longo; Para ler

Embora o Elasticsearch seja conhecido por ser flexível e altamente personalizável, é um sistema distribuído complexo que requer operações e gerenciamento de cluster e índice para manter o desempenho.
featured image - Usando Elasticsearch para descarregar pesquisas e análises do DynamoDB: prós e contras
Rockset HackerNoon profile picture


Análise no DynamoDB

As equipes de engenharia geralmente precisam executar filtros complexos, agregações e pesquisas de texto em dados do DynamoDB. No entanto, o DynamoDB é um banco de dados operacional otimizado para processamento de transações e não para análises em tempo real. Como resultado, muitas equipes de engenharia atingiram limites nas análises no DynamoDB e buscaram opções alternativas.


Isso ocorre porque as cargas de trabalho operacionais têm padrões de acesso muito diferentes das cargas de trabalho analíticas complexas. O DynamoDB oferece suporte apenas a um conjunto limitado de operações, tornando a análise desafiadora e, em algumas situações, impossível. Até mesmo a AWS , a empresa por trás do DynamoDB, aconselha as empresas a considerarem a transferência de análises para outras soluções específicas. Uma solução comumente referenciada é o Elasticsearch, na qual iremos nos aprofundar hoje.


DynamoDB é um dos bancos de dados NoSQL mais populares e é usado por muitas empresas de escala web em jogos, mídias sociais, IoT e serviços financeiros. O DynamoDB é o banco de dados preferido por sua escalabilidade e simplicidade, permitindo desempenho de milissegundos de um dígito em escalas de 20 milhões de solicitações por segundo. Para atingir essa velocidade em escala, o DynamoDB está focado em atingir o desempenho para cargas de trabalho operacionais – operações de alta frequência e baixa latência em registros individuais de dados.


Elasticsearch é um mecanismo de pesquisa distribuído de código aberto desenvolvido em Lucene e usado para pesquisa de texto e casos de uso de análise de log. Elasticsearch faz parte da pilha ELK maior que inclui Kibana, uma ferramenta de visualização para painéis analíticos. Embora o Elasticsearch seja conhecido por ser flexível e altamente personalizável, é um sistema distribuído complexo que requer operações e gerenciamento de cluster e índice para manter o desempenho. Existem ofertas gerenciadas do Elasticsearch disponíveis na Elastic e na AWS, portanto, você não precisa executá-lo sozinho em instâncias do EC2.


Shameless Plug: Rockset é um banco de dados analítico em tempo real criado para a nuvem. Ele tem um conector integrado para DynamoDB e ingere e indexa dados para pesquisas, agregações e junções em menos de um segundo. Mas este post é para destacar casos de uso de DynamoDB e Elasticsearch, caso você queira explorar essa opção.

Conectando DynamoDB ao Elasticsearch usando AWS Lambda

Você pode usar o AWS Lambda para carregar continuamente dados do DynamoDB no Elasticsearch para análise. Veja como funciona:


  • Crie uma função lambda para sincronizar todas as atualizações de um stream do DynamoDB no Elasticsearch
  • Crie uma função lambda para obter um snapshot da tabela existente do DynamoDB e enviá-lo ao Elasticsearch. Você pode usar um script EC2 ou um stream do Amazon Kinesis para ler o conteúdo da tabela do DynamoDB.



Há uma abordagem alternativa para sincronizar dados com o Elasticsearch envolvendo o plug-in Logstash para DynamoDB, mas ela não é suportada atualmente e pode ser complexa de configurar.

Pesquisa de texto em dados do DynamoDB usando Elasticsearch

A pesquisa de texto é a pesquisa de texto dentro de um documento para encontrar os resultados mais relevantes. Muitas vezes, você desejará pesquisar parte de uma palavra, um sinônimo ou antônimos de palavras ou uma sequência de palavras juntas para encontrar o melhor resultado. Alguns aplicativos até ponderam os termos de pesquisa de maneira diferente com base em sua importância.


O DynamoDB pode oferecer suporte a alguns casos de uso limitados de pesquisa de texto apenas usando particionamento para ajudar a filtrar os dados. Por exemplo, se você tiver um site de comércio eletrônico, poderá particionar dados no DynamoDB com base em uma categoria de produto e, em seguida, executar a pesquisa na memória. Aparentemente, é assim que a divisão de varejo da Amazon.com lida com muitos casos de uso de pesquisa de texto. O DynamoDB também oferece suporte a uma função contains que permite encontrar uma string que contém uma substring específica de dados.



Um site de comércio eletrônico pode particionar dados com base na categoria do produto. Atributos adicionais podem ser mostrados com os dados pesquisados, como marca e cor.


Em cenários em que a pesquisa de texto completo é fundamental para seu aplicativo, você desejará usar um mecanismo de pesquisa como o Elasticsearch com uma classificação de relevância. Veja como a pesquisa de texto funciona em alto nível no Elasticsearch:


  • Classificação de relevância : o Elasticsearch tem uma classificação de relevância que fornece aos resultados da pesquisa prontos para uso ou você pode personalizar a classificação para o caso de uso de seu aplicativo específico. Por padrão, o Elasticsearch criará uma pontuação de classificação com base na frequência do termo, na frequência inversa do documento e na norma de comprimento do campo.


  • Análise de texto : o Elasticsearch divide o texto em tokens para indexar os dados, chamado tokenização. Os analisadores são então aplicados aos termos normalizados para aprimorar os resultados da pesquisa. O analisador padrão padrão divide o texto de acordo com o Unicode Consortium para fornecer suporte geral multilíngue.


O Elasticsearch também possui conceitos como pesquisa difusa, pesquisa de preenchimento automático e relevância ainda mais avançada que pode ser configurada para atender às especificidades da sua aplicação.

Filtros complexos em dados do DynamoDB usando Elasticsearch

Filtros complexos são usados para restringir o conjunto de resultados, recuperando dados de forma mais rápida e eficiente. Em muitos cenários de pesquisa, você desejará combinar vários filtros ou filtrar um intervalo de dados, como durante um período de tempo.


Os dados de partições do DynamoDB e a escolha de uma boa chave de partição podem ajudar a tornar a filtragem de dados mais eficiente. O DynamoDB também oferece suporte a índices secundários para que você possa replicar seus dados e usar uma chave primária diferente para oferecer suporte a filtros adicionais. Os índices secundários podem ser úteis quando há vários padrões de acesso aos seus dados.


Por exemplo, um aplicativo de logística poderia ser projetado para filtrar itens com base no status de entrega. Para modelar esse cenário no DynamoDB, criaremos uma tabela base para logística com uma chave de partição Item_ID , uma chave de classificação Status e atributos comprador, ETA e SLA .


Também precisamos oferecer suporte a um padrão de acesso adicional no DynamoDB para quando os atrasos na entrega excederem o SLA. Os índices secundários no DynamoDB podem ser aproveitados para filtrar apenas as entregas que excedem o SLA.


Será criado um índice no campo ETADelayedBeyondSLA que é uma réplica do atributo ETA já existente na tabela base. Esses dados só são incluídos no ETADelayedBeyondSLA quando o ETA excede o SLA. O índice secundário é um índice esparso, reduzindo a quantidade de dados que precisam ser verificados na consulta. O buyer é a chave de partição e a chave de classificação é ETADelayedBeyondSLA .




Os índices secundários podem ser usados para suportar vários padrões de acesso na aplicação, incluindo padrões de acesso que envolvem filtros complexos.


O DynamoDB possui uma operação filterexpression em sua API Query and Scan para filtrar resultados que não correspondem a uma expressão. A filterexpression é aplicada somente após uma operação de consulta ou verificação de tabela, portanto você ainda está vinculado ao limite de 1 MB de dados para uma consulta. Dito isso, a filterexpression é útil para simplificar a lógica do aplicativo, reduzindo o tamanho da carga útil da resposta e validando a expiração do tempo de vida. Em resumo, você ainda precisará particionar seus dados de acordo com os padrões de acesso da sua aplicação ou usar índices secundários para filtrar dados no DynamoDB.


O DynamoDB organiza dados em chaves e valores para recuperação rápida de dados e não é ideal para filtragem complexa. Quando você precisar de filtros complexos, você pode querer migrar para um mecanismo de pesquisa como o Elasticsearch, pois esses sistemas são ideais para consultas no palheiro.


No Elasticsearch, os dados são armazenados em um índice de pesquisa, ou seja, a lista de documentos para os quais o valor da coluna é armazenado como uma lista de postagens. Qualquer consulta que possua um predicado (ou seja: WHERE user=A) pode buscar rapidamente a lista de documentos que satisfazem o predicado. À medida que as listas de postagem são classificadas, elas podem ser mescladas rapidamente no momento da consulta para que todos os critérios de filtragem sejam atendidos. O Elasticsearch também usacache simples para acelerar o processo de recuperação de consultas de filtro complexas acessadas com frequência.


Consultas de filtro, comumente chamadas de consultas sem pontuação no Elasticsearch, podem recuperar dados de forma mais rápida e eficiente do que consultas de pesquisa de texto. Isso ocorre porque a relevância não é necessária para essas consultas. Além disso, o Elasticsearch também oferece suporte a consultas de intervalo, possibilitando a recuperação rápida de dados entre um limite superior e inferior (ou seja: age entre 0-5).

Agregações em dados do DynamoDB usando Elasticsearch

Agregações ocorrem quando os dados são coletados e expressos em forma de resumo para inteligência de negócios ou análise de tendências. Por exemplo, você pode querer mostrar métricas de uso do seu aplicativo em tempo real.


O DynamoDB não oferece suporte a funções agregadas. A solução alternativa recomendada pela AWS é usar DynamoDB e Lambda para manter uma visão agregada dos dados em uma tabela DynamoDB.


Vamos usar a agregação de curtidas em um site de mídia social como o Twitter como exemplo. Faremos do tweet_ID a chave primária e, em seguida, a chave de classificação a janela de tempo pela qual agregaremos curtidas. Nesse caso, habilitaremos streams do DynamoDB e anexaremos uma função Lambda para que, à medida que os tweets são curtidos (ou não), eles sejam tabulados em like_count com um carimbo de data/hora (ou seja: last_ updated ).



Nesse cenário, os streams do DynamoDB e as funções do Lambda são usados para tabular um like_count como um atributo na tabela.


Outra opção é descarregar agregações para outro banco de dados, como o Elasticsearch. Elasticsearch é um índice de pesquisa em sua essência e adicionou extensões para oferecer suporte a funções de agregação. Uma dessas extensões é docvalues , uma estrutura construída no momento do índice para armazenar valores de documentos de forma orientada a colunas. A estrutura é aplicada por padrão a campos que suportam valores de documento e há algum excesso de armazenamento que acompanha valores de documento. Se você precisar apenas de suporte para agregações em dados do DynamoDB, pode ser mais econômico usar um data warehouse que possa compactar dados de maneira eficiente para consultas analíticas em conjuntos de dados amplos.


Aqui está uma visão geral de alto nível da estrutura de agregação do Elasticsearch :


  • Agregações de buckets : você pode pensar em buckets como algo semelhante a GROUP BY no mundo dos bancos de dados SQL. Você pode agrupar documentos com base em valores ou intervalos de campo. As agregações de bucket do Elasticsearch também incluem agregação aninhada e agregação pai-filho, que são soluções alternativas comuns para a falta de suporte de junção.

  • Agregações de métricas: as métricas permitem realizar cálculos como SUM , COUNT , AVG , MIN , MAX , etc. As métricas também podem ser usadas para calcular valores para uma agregação de bucket.

  • Agregações de pipeline : as entradas nas agregações de pipeline são outras agregações, e não documentos. Os usos comuns incluem médias e classificação com base em uma métrica.


Pode haver implicações de desempenho ao usar agregações, especialmente à medida que você dimensiona o Elasticsearch .

Alternativa ao Elasticsearch para pesquisa, agregações e junções no DynamoDB

Embora o Elasticsearch seja uma solução para fazer pesquisas e agregações complexas em dados do DynamoDB, muitos proponentes da tecnologia sem servidor expressaram preocupações com essa escolha. As equipes de engenharia escolhem o DynamoDB porque ele é sem servidores e pode ser usado em escala com muito pouca sobrecarga operacional. Avaliamos algumas outras opções de análise no DynamoDB , incluindo Athena, Spark e Rockset em termos de facilidade de configuração, manutenção, capacidade de consulta e latência em outro blog.


Rockset é uma alternativa ao Elasticsearch e Alex DeBrie percorreu a filtragem e agregação de consultas usando SQL no Rockset. Rockset é um banco de dados nativo da nuvem com um conector integrado para DynamoDB , facilitando o início e a escalabilidade de casos de uso analíticos, incluindo casos de uso que envolvem junções complexas. Você pode explorar o Rockset como uma alternativa ao Elasticsearch em nosso teste gratuito com US$ 300 em créditos.