In che modo una query in un enorme database viene restituita con una latenza trascurabile?


12

Ad esempio, quando cerchi qualcosa su Google, i risultati ritornano all'istante.

Capisco che Google ordina e indicizza le pagine con algoritmi ecc., Ma immagino che non sia possibile indicizzare i risultati di ogni singola query possibile (e i risultati sono personalizzati, il che rende ciò ancora più irrealizzabile)?

Inoltre, la latenza dell'hardware nell'hardware di Google non sarebbe enorme? Anche se i dati di Google fossero tutti archiviati in SSD TB / s, immagino che la latenza dell'hardware sia enorme, data la mera quantità di dati da elaborare.

MapReduce aiuta a risolvere questo problema?

EDIT: Va bene, quindi capisco che le ricerche popolari possono essere memorizzate nella cache. Ma per quanto riguarda le ricerche impopolari? Anche per la ricerca più oscura che ho condotto, non credo che la ricerca sia mai stata superiore a 5 secondi. Com'è possibile?

Risposte:


13

Bene, non sono sicuro che sia MapReduce a risolvere il problema, ma sicuramente non sarebbe MapReduce da solo a risolvere tutte queste domande che hai sollevato. Ma qui ci sono cose importanti da prendere in considerazione, e che lo fanno possibile avere una latenza così bassa sulle query da tutti questi TB di dati in macchine diverse:

  1. calcolo distribuito: essendo distribuito non significa che gli indici siano semplicemente distribuiti su macchine diverse, in realtà vengono replicati lungo cluster diversi, il che consente a molti utenti di eseguire query diverse con tempi di recupero ridotti (sì, le grandi aziende possono permetterselo di macchine);
  2. memorizzazione nella cache: le cache riducono enormemente i tempi di esecuzione, sia per la fase di scansione, per il recupero delle pagine, sia per la classificazione e la visualizzazione dei risultati;
  3. molte modifiche: tutto quanto sopra e algoritmi / soluzioni molto efficienti possono essere efficaci solo se l'implementazione è anche efficiente. Ci sono tonnellate di ottimizzazioni (hard coded), come località di riferimento, compressione, memorizzazione nella cache; tutti generalmente applicabili a diverse parti dell'elaborazione.

Considerando ciò, proviamo a rispondere alle tue domande:

ma immagino che sia impossibile indicizzare i risultati di ogni singola query possibile

Sì, lo sarebbe, ed effettivamente non è possibile avere risultati per ogni singola query possibile . Esiste un numero infinito di termini nel mondo (anche se si presume che verranno inseriti solo termini scritti correttamente) e esiste un numero esponenziale di query da questi n -> inftermini ( 2^n). Quindi cosa si fa? Caching. Ma se ci sono così tante query / risultati, quali memorizzare nella cache? Politiche di memorizzazione nella cache. Le query più frequenti / popolari / pertinenti per l'utente sono quelle memorizzate nella cache.

la latenza dell'hardware nell'hardware di Google non sarebbe enorme? Anche se i dati in Google erano tutti archiviati in SSD TB / s

Al giorno d'oggi, con processori così altamente sviluppati, le persone tendono a pensare che ogni possibile compito che deve finire in un secondo (o meno) e che si occupa di così tanti dati, debba essere elaborato da processori estremamente potenti con più core e molta memoria. Tuttavia, l'unica cosa dominante mercato è il denaro e gli investitori non sono interessati a sprecarlo. Quindi cosa si fa?

La preferenza è in realtà avere molte macchine, ognuna delle quali utilizza processori semplici / accessibili (in termini di costi), il che riduce il prezzo di costruzione della moltitudine di cluster che ci sono. E sì, funziona. Il principale collo di bottiglia si riduce sempre al disco, se si considerano semplici misurazioni delle prestazioni . Ma una volta che ci sono così tante macchine, ci si può permettere di caricare le cose nella memoria principale, invece di lavorare su dischi rigidi.

Le schede di memoria sono costose per noi, semplici esseri umani, ma sono molto economiche per le aziende che acquistano molte di queste carte contemporaneamente. Poiché non è costoso, disporre di molta memoria necessaria per caricare gli indici e tenere a portata di mano le cache non è un problema. E poiché ci sono così tante macchine, non è necessario disporre di processori super veloci, poiché è possibile indirizzare query in luoghi diversi e disporre di cluster di macchine responsabili della partecipazione a specifiche aree geografiche , il che consente una memorizzazione dei dati più specializzata e una risposta ancora migliore volte.

MapReduce aiuta a risolvere questo problema?

Anche se non credo che l'utilizzo o meno di MapReduce sia limitato alle informazioni all'interno di Google, non sono a conoscenza di questo punto. Tuttavia, l'implementazione di Google di MapReduce (che sicuramente non è Hadoop) deve avere molte ottimizzazioni, molte delle quali riguardano gli aspetti discussi sopra. Quindi, l'architettura di MapReduce probabilmente aiuta a guidare il modo in cui i calcoli sono fisicamente distribuiti, ma ci sono molti altri punti da considerare per giustificare tale velocità nei tempi di interrogazione.

Va bene, quindi capisco che le ricerche popolari possono essere memorizzate nella cache. Ma per quanto riguarda le ricerche impopolari?

Il grafico seguente mostra una curva di come si verificano i tipi di query. Puoi vedere che ci sono tre tipi principali di ricerche, ognuna delle quali contiene circa 1/3 del volume di query (area sotto la curva). La trama mostra la legge del potere e rafforza il fatto che le query più piccole sono le più popolari. È ancora possibile elaborare il secondo terzo delle query, poiché contengono poche parole. Ma l'insieme delle cosiddette query oscure , che di solito consistono in query di utenti non esperti, non è una parte trascurabile delle query.

Distribuzione dalla coda pesante

E c'è spazio per nuove soluzioni. Dal momento che non sono solo una o due query (ma un terzo di esse), devono avere risultati pertinenti . Se digiti qualcosa di troppo oscuro in una ricerca di Google, non ci vorrà più tempo per restituire un elenco di risultati, ma molto probabilmente ti mostrerà qualcosa che ha dedotto che vorresti dire. Oppure potrebbe semplicemente affermare che non esisteva un documento con tali termini - o addirittura ridurre la tua ricerca a 32 parole (cosa che mi è appena capitata in un test casuale qui).

Esistono dozzine di euristiche applicabili, che possono essere o ignorare alcune parole o provare a suddividere la query in parole più piccole e raccogliere i risultati più popolari . E tutte queste soluzioni possono essere personalizzate e ottimizzate per rispettare i tempi di attesa fattibili , diciamo, meno di un secondo? : D


Ho modificato la domanda per aggiungere un'altra query.
resgh

@namequi Ho provato a risolvere la tua modifica; spero che aiuti a rispondere alla domanda.
Rubens,

10

MapReduce non ha nulla a che fare con nulla in tempo reale. È un framework di elaborazione orientato al batch adatto per alcune attività offline, come ETL e costruzione di indici. Google ha abbandonato MapReduce per la maggior parte dei lavori ora e anche l'ecosistema Hadoop sta facendo lo stesso.

La risposta alla bassa latenza è generalmente quella di mantenere in memoria gli indici pre-calcolati. Tutto ciò che tocca il disco è difficile da velocizzare e ridimensionare. Questo è il modo in cui i motori SQL di nuova generazione basati su Hadoop come Impala ottengono tanta velocità rispetto all'infrastruttura basata su MapReduce come Hive , ad esempio.

L'infrastruttura di ricerca non può memorizzare nella cache i risultati di ogni singola query. Ma può sicuramente memorizzare nella cache risultati intermedi o risultati più completi per le query principali. Con un po 'di cache è possibile fornire risultati per una minoranza significativa di tutte le query.

La ricerca è inoltre suddivisa su più server. Quindi una macchina può delegare a 100 per ottenere una parte del risultato e poi combinarli.

Puoi anche cavartela con un certo grado di approssimazione. Google non forma letteralmente mille pagine di risultati di ricerca; deve solo avere la prima pagina a destra.

Tieni presente che Google ha milioni di computer in tutto il mondo. Le tue domande verranno indirizzate a un data center geograficamente vicino a te e questo serve solo alla tua geografia. Ciò elimina gran parte della latenza, che è la rete e non i tempi di elaborazione nel data center.


Innanzitutto, ho modificato la domanda per aggiungere un'altra query. Inoltre: immagino che anche con una significativa minoranza pre-calcolata, il resto della query dovrebbe comunque richiedere molto tempo per essere completato. Inoltre, quando il processo è delegato da una macchina a 100 macchine, la latenza non viene effettivamente aumentata (la latenza di rete tra macchine e la latenza totale è massima delle latenze di tutte le macchine)?
resgh

Voglio dire che rispondere alla query "spaghetti diamond", che è una strana query rara, potrebbe essere accelerato dai risultati precalcolati per "spaghetti" e "diamante" singolarmente. Le connessioni intra-DC sono molto veloci e a bassa latenza. Uno o due hop in più all'interno non sono nulla in confronto ai ~ 20 hop tra il tuo computer e la DC. Il problema dominante nella distribuzione del lavoro è il problema più sbilenco; devi eliminare i risultati da alcuni sottoinsiemi se non rispondono in tempo. Queste sono tutte generalizzazioni grossolane ma puntano nella giusta direzione.
Sean Owen,

4

MapReduce non viene utilizzato nella ricerca. È stato usato molto tempo fa per costruire l'indice; ma è un framework di elaborazione batch e la maggior parte del Web non cambia continuamente, quindi le architetture più recenti sono tutte incrementali anziché orientate al batch.

La ricerca in Google funzionerà in gran parte nello stesso modo in cui funziona in Lucene e Elastic Search, ad eccezione di molte ottimizzazioni e ponderazioni extra ottimizzate. Ma nel profondo useranno una qualche forma di un indice invertito . In altre parole, non cercano diversi terabyte quando si inserisce una query di ricerca (anche quando non è memorizzata nella cache). Probabilmente non guardano affatto i documenti reali. Ma usano una tabella di ricerca che elenca quali documenti corrispondono al termine della tua ricerca (con derivazione, errori di ortografia, sinonimi ecc. Tutti preelaborati). Probabilmente recuperano la lista dei primi 10000 documenti per ogni parola (10k interi - solo pochi kb!) E calcolano le migliori corrispondenze da quella. Solo se non ci sono buone corrispondenze in queste liste, si espandono ai blocchi simili successivi ecc.

Le query per parole comuni possono essere facilmente memorizzate nella cache; e tramite la preelaborazione è possibile creare un elenco dei primi 10k risultati e quindi eseguirli nuovamente in base al profilo utente. Non c'è nulla da guadagnare calcolando anche una risposta "esatta". Guardare i primi 10k risultati è probabilmente abbastanza; non c'è una risposta corretta; e se un risultato migliore da qualche parte nella posizione 10001 è mancato, nessuno lo saprà o noterà (o si preoccuperà). Probabilmente era già stato classificato in basso nella preelaborazione e non sarebbe arrivato tra i primi 10 che vengono presentati all'utente alla fine (o tra i primi 3, l'utente effettivamente guarda)

D'altra parte, i termini rari non rappresentano una vera sfida: una delle liste contiene solo pochi documenti corrispondenti e puoi scartare immediatamente tutti gli altri.

Consiglio di leggere questo articolo:

L'anatomia di un motore di ricerca web ipertestuale su larga scala
Sergey Brin e Lawrence Page
Dipartimento di informatica, Università di Stanford, Stanford, CA 94305
http://infolab.stanford.edu/~backrub/google.html

E sì, sono i fondatori di Google che hanno scritto questo. Non è l'ultimo stato, ma funzionerà già su larga scala.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.