Pesquisa refinada em um grande conjunto de dados

8

Eu tenho cerca de 4 milhões de registros por dia e preciso manter 7 anos online, por isso estamos analisando 10,2 bilhões de registros que eu preciso pesquisar. Os usuários esperam que a pesquisa seja rápida o suficiente para uma interface do usuário, resultando em 3-5s

Devido à política fora do meu controle, não posso usar uma solução de banco de dados pronta para uso, pois significa que terei que fornecer o banco de dados a outra equipe para gerenciar (não pergunte), o que significa que perco a capacidade de otimizar hardware e software, pois eles têm um serviço único para bancos de dados e cobram (internamente) pelo GB. Tenho certeza de que vou receber comentários sugerindo que eu entendo o ponto, eu já tenho e a gerência entende que o que eles estão me pedindo para fazer é ridículo.

Eu tenho olhado para usar o Lucene como o cerne da minha solução. Armazenando os dados reais particionados por tipo e por dia em arquivos simples. Em seguida, use um documento Lucene para indexar alguns dos campos pesquisados, sendo o único campo "Armazenado" o ID do registro (para que eu possa lê-lo no arquivo simples)

Não sou exatamente informado sobre o Lucene ou os discos rígidos, mas, de acordo com o meu entendimento, haverá IO inicial / tempo de busca para pesquisar o índice; quando tiver todos os IDs de documento do Lucene, leio os documentos que terão mais IO / procurando tempo, então leio o registro real do flat flat ... Não consigo imaginar, dado o tamanho do conjunto de dados, que isso será muito rápido, com o qual estou um pouco preocupado?

O Lucene tem um tamanho máximo de documento de 2,1 bilhões por índice, por isso vou exigir várias indicações aqui.

Essa abordagem, aparentemente, parece que poderia funcionar?


Os dados que estou armazenando são dados de ação de evento. A maioria das consultas agrupa por ID do evento e obtém os últimos detalhes da ação do evento para um evento específico. Algumas das consultas analisarão eventos de conjuntos grandes e suas ações de eventos individuais.

guepardo
fonte
Muito aproximadamente isso poderia funcionar. Se você olhar para o Elasticsearch, isso é algo semelhante. Você não fala muito sobre o que exatamente deseja fazer com esses dados. Dependendo do tipo de consulta, você organizaria os dados em índices com base em meses. Se suas consultas forem algo da linha de estatística, você também poderá adicionar tabelas de agregação que fazem alguns cálculos por mês, semana ou trimestre e otimizar seu código para que ele possa usar essas agregações. Além disso, você pode compartilhar dados em várias máquinas e dividir consultas. Dói escrever isso se o Elastic o fizer fora da caixa.
226156 Thorsten
PS: Eu pelo menos faria o protótipo com o Elasticsearch ou o Apache Solr. Ambos usam Lucene e isso lhe dará uma idéia e estimativa de como Lucene se comporta.
226156 Thorith Müller
É no ES que eu estou obtendo a maioria das minhas ideias fundadoras ... é ridículo que eu não possa simplesmente colar os dados no ES ou no Hadoop e acabar com isso. @ thorstenmüller - Eu editei o OP com detalhes
Cheetah
Isso soa um pouco semelhante ao blog.parsely.com/post/1633/mage
Doug T.
Quando você diz "Não posso usar uma solução de banco de dados pronta para uso", você quer dizer, especificamente, que não pode usar uma solução pronta para uso que exigiria um pedido de compra ? Suponho que um pedido de compra acionaria o que quer que tira as coisas do seu controle em sua organização.
David

Respostas:

3

Você não disse o tamanho dos dados, o tamanho dos campos individuais ou o orçamento que possui.

Independentemente do sistema de indexação que você escolher, considere jogar o hardware no problema. Você não precisa procurar nada nos discos. Indexe todos os dados, usando um esquema que é muito rápido de percorrer (talvez uma lista ou árvore classificada). Armazene o índice no disco, mas depois armazene em cache todo o índice na RAM. Você pode precisar de dezenas ou mesmo centenas de gigabytes de RAM para fazer isso.

Se os campos individuais forem grandes ou de tamanho variável, considere indexar hashes deles.

O preço para o servidor fazer isso pode ser assustador.

Simon B
fonte
2

Ignorando todos os detalhes técnicos, esse é um problema organizacional / de gerenciamento e precisa ser resolvido pelo gerenciamento da sua organização.

Seu gerente deve estar disposto a lançar o problema no andar de cima e / ou fazer com que seus usuários aumentem o problema em um nível alto.

No seu nível, monte ou solicite uma estimativa para fazer isso com o Oracle e o hardware Oracle. Em seguida, monte uma estimativa realista para um cluster do Hadoop.

Apesar do hype, esses clusters não são baratos (você provavelmente precisa de algo como 18 nós de processador com 64 GB de memória e discos de 4 x 2 TB espalhados por três racks, depois outros 4 nós para o catálogo etc.). Não subestime ; se você vencer, terá que implementá-lo.

James Anderson
fonte
2

Então, primeiro vamos reexpor claramente o problema em termos de seus requisitos:

  1. O sistema deve armazenar um mínimo de 4 milhões de registros por dia.
  2. O sistema deve fornecer uma interface de pesquisa para o usuário
    2.1. A capacidade de pesquisa deve retornar resultados em no máximo 3s
  3. O sistema deve ser capaz de pesquisar no mínimo 10,2 bilhões de registros
  4. O sistema deve usar um banco de dados personalizado
    4.1. O sistema deve ter hardware e software otimizados para o banco de dados a ser desenvolvido.

Provavelmente, existem requisitos não funcionais adicionais, além de detalhes sobre o tamanho dos registros individuais, que são provavelmente relevantes para a sua situação.

A resposta curta é que você tem um problema de requisitos. Se você observar esses requisitos, três deles (os três primeiros) se aplicam corretamente ao sistema para definir sua função e comportamento. O último requisito não é um requisito válido de uma perspectiva purista, mas vi esses tipos de requisitos serem colocados em declarações de trabalho.

Portanto, a maneira como esse problema é resolvido é estimar o custo do quarto requisito, considerando os outros três. Depois de fazer isso, apresente isso como seu custo de solução. A gerência entrará em pânico e imediatamente perguntará por que o problema não pode ser resolvido por um preço razoável. Esse é o ponto de entrada para a sua discussão sobre o que precisa acontecer. Tenha uma alternativa acessível disponível e pronta para apresentar.

Isso contrasta com o que você está fazendo agora, que assume que os outros três não podem ser cumpridos, dado o último. A gerência não entende, porque tudo o que vêem são cifrões.

theMayer
fonte
2

Se eu estivesse no seu lugar, começaria com uma implementação bastante razoável, usando apenas um RDBMS regular, incorporado ao aplicativo, para que eles não sintam que precisam dar suporte a alguma coisa. O SQLite, H2 ou qualquer banco de dados incorporado alternativo deve fazer: Sem arquivos simples, sem índices exóticos, sem nada: apenas uma aplicação direta de práticas padrão para resolver o problema em questão, desconsiderando a imensidão dos dados. (Obviamente, eu escolheria um número inteiro grande o suficiente como chave, e isso é tudo, basicamente.)

Enquanto trabalhava nisso, provavelmente me ocorreria mais algumas idéias, sobre como fazê-lo funcionar mais rápido sem recorrer a nada exótico.

Então, eu testaria isso para ver como ele funciona e demonstraria os resultados, juntamente com a solução de trabalho, para os "poderes do ser" em sua organização.

  1. Há uma chance de que sua implementação direta seja executada dentro das restrições necessárias; portanto, você estará bem, sem necessidade de fazer mais nada, sem desperdício de recursos.

  2. Se o desempenho da implementação direta estiver fora, mas não muito longe, das restrições necessárias, os "poderes do ser" podem dizer "bem, isso é próximo o suficiente, não queremos fazer mais nada sobre isso, então é assim que será. " Novamente, nenhum recurso foi desperdiçado.

  3. Se o desempenho da implementação direta estiver fora, mas dentro da mesma ordem de magnitude, das restrições necessárias, eu diria a eles para comprarem hardware melhor, maior e mais rápido. O mais provável é que eles façam isso e o caso seja encerrado.

  4. Se eles não quiserem comprar hardware melhor, maior e mais rápido, recomendo que eles repensem seu requisito de não usar um RDBMS grande e escalável. Se eles são razoáveis, e você demonstrou que também é razoável, é provável que eles repensem isso.

  5. Se os poderes do ser não querem seguir nenhuma das vias razoáveis ​​e, em vez disso, querem que você faça o papel de mágico, então, e só então, eu começaria a me preocupar com soluções exóticas. Muitas chances são de que as coisas não chegarão a esse ponto. Mas, mesmo se o fizerem, a quantidade de trabalho que você terá realizado em vão até esse momento será relativamente pequena e valerá a pena a aposta de que seja suficiente.

Mike Nakis
fonte
1

Pensando no front end ...

Se você separar seus tipos de pesquisa na interface do usuário, poderá ter restrições mais razoáveis.

Parece que um tipo de pesquisa são dados recentes de ação de evento em um evento, o que permite isolar o tempo na pesquisa de dados. Talvez isso ofereça um conjunto de dados muito menor, com a provável expectativa de que um usuário seja recuperado em breve.

Outros tipos de pesquisa, nos quais é necessário realizar grandes pesquisas em conjuntos de dados ou em períodos antigos, podem receber uma interface do usuário diferente (ou várias UIs), com um bom botão para indicar ... pensando agora. Como isso pode ser entendido pelo usuário como um conjunto de requisitos mais trabalhoso, pode-se esperar razoavelmente paciência. E, claro, realisticamente necessário.

Não sei se você tem alguma capacidade de impactar o design de tendência, mas se você pode transmitir as restrições com as quais está trabalhando, espero que aqueles que lidam com a interação do usuário respondam com compreensão (pelo menos alguns).

tealdev
fonte