Bem, não tenho certeza se é o MapReduce que resolve o problema, mas certamente não seria o MapReduce sozinho para resolver todas essas questões que você levantou. Mas aqui estão algumas coisas importantes a serem levadas em consideração e que tornam possível ter uma latência tão baixa nas consultas de todos esses TBs de dados em diferentes máquinas:
- computação distribuída: ao serem distribuídos não significa que os índices são simplesmente distribuídos em máquinas diferentes, eles são realmente replicados em clusters diferentes, o que permite a muitos usuários realizar consultas diferentes com baixo tempo de recuperação (sim, grandes empresas podem pagar por isso de máquinas);
- cache: os caches reduzem tremendamente o tempo de execução, seja na etapa de rastreamento, na recuperação de páginas ou na classificação e exposição dos resultados;
- muitos ajustes: todos os algoritmos / soluções acima e muito eficientes só podem ser eficazes se a implementação também for eficiente. Existem toneladas de otimizações (codificadas), como localidade de referência, compactação, cache; todos eles geralmente aplicáveis a diferentes partes do processamento.
Considerando isso, vamos tentar responder às suas perguntas:
mas imagino inviável que os resultados de cada consulta possível sejam indexados
Sim, seria e, na verdade, é inviável ter resultados para todas as consultas possíveis . Existe um número infinito de termos no mundo (mesmo que você assuma que apenas os termos escritos corretamente serão inseridos) e existe um número exponencial de consultas a partir desses n -> inf
termos ( 2^n
). Então o que é feito? Armazenamento em cache. Mas se houver tantas consultas / resultados, quais armazenar em cache? Políticas de armazenamento em cache. As consultas mais frequentes / populares / relevantes para o usuário são armazenadas em cache.
a latência de hardware no hardware do Google não seria enorme? Mesmo que todos os dados no Google sejam armazenados em SS / TB / s
Atualmente, com esses processadores altamente desenvolvidos, as pessoas tendem a pensar que todas as tarefas possíveis que devem terminar em um segundo (ou menos) e que lidam com tantos dados devem ser processadas por processadores extremamente poderosos, com vários núcleos e muita memória. No entanto, a única coisa que domina o mercado é o dinheiro e os investidores não estão interessados em desperdiçá-lo. Então o que é feito?
A preferência é realmente ter muitas máquinas, cada uma usando processadores simples / acessíveis (em termos de custo), o que reduz o preço da construção da multiplicidade de clusters existentes. E sim, funciona. O principal gargalo sempre se resume ao disco, se você considerar medidas simples de desempenho . Porém, uma vez que existem tantas máquinas, é possível carregar coisas na memória principal, em vez de trabalhar em discos rígidos.
Os cartões de memória são caros para nós, meros seres humanos, mas são muito baratos para empresas que compram muitos desses cartões ao mesmo tempo. Como não é caro, ter muita memória necessária para carregar índices e manter os caches à mão não é um problema. E como existem tantas máquinas, não há necessidade de processadores super rápidos, pois você pode direcionar consultas para locais diferentes e ter agrupamentos de máquinas responsáveis por atender regiões geográficas específicas , o que permite cache de dados mais especializado e resposta ainda melhor vezes.
O MapReduce ajuda a resolver esse problema?
Embora eu ache que o uso ou não do MapReduce seja uma informação restrita no Google, não estou familiarizado com esse ponto. No entanto, a implementação do MapReduce pelo Google (que certamente não é o Hadoop) deve ter muitas otimizações, muitas envolvendo os aspectos discutidos acima. Portanto, a arquitetura do MapReduce provavelmente ajuda a orientar como os cálculos são fisicamente distribuídos, mas há muitos outros pontos a serem considerados para justificar essa velocidade no tempo de consulta.
Ok, entendo que pesquisas populares podem ser armazenadas em cache na memória. Mas e as pesquisas impopulares?
O gráfico abaixo apresenta uma curva de como os tipos de consultas ocorrem. Você pode ver que existem três tipos principais de pesquisas, cada uma contendo aproximadamente 1/3 do volume de consultas (área abaixo da curva). A trama mostra a lei de energia e reforça o fato de que consultas menores são as mais populares. O segundo terço das consultas ainda é possível de processar, uma vez que contêm poucas palavras. Mas o conjunto de chamadas obscuras , que geralmente consistem em consultas de usuários não experientes, não é uma parte desprezível das consultas.
E existe espaço para novas soluções. Como não são apenas uma ou duas consultas (mas um terço delas), elas devem ter resultados relevantes . Se você digitar algo muito obscuro em uma pesquisa no Google, não demorará mais para retornar uma lista de resultados, mas provavelmente mostrará algo que você deduziu . Ou pode simplesmente declarar que não havia documento com esses termos - ou até reduzir sua pesquisa para 32 palavras (o que aconteceu comigo em um teste aleatório aqui).
Existem dezenas de heurísticas aplicáveis, que podem ser para ignorar algumas palavras ou para tentar dividir a consulta em palavras menores e reunir os resultados mais populares . E todas essas soluções podem ser personalizadas e ajustadas para respeitar os tempos de espera viáveis de, digamos, menos de um segundo? : D