Come implementeresti la Ricerca Google? [chiuso]


44

Supponiamo che ti venga chiesto in un'intervista "Come implementeresti la Ricerca Google?" Come risponderesti a una domanda del genere? Potrebbero esserci risorse là fuori che spiegano come vengono implementati alcuni pezzi di Google (BigTable, MapReduce, PageRank, ...), ma ciò non si adatta esattamente a un'intervista.

Quale architettura generale useresti e come spiegheresti questo in un arco di tempo di 15-30 minuti?

Vorrei iniziare con la spiegazione di come costruire un motore di ricerca che gestisce ~ 100.000 documenti, quindi espanderlo tramite lo sharding a circa 50 milioni di documenti, quindi forse un altro salto architettonico / tecnico.

Questa è la vista di 20.000 piedi. Quello che mi piacerebbe sono i dettagli: come risponderesti effettivamente in un'intervista. Quali strutture di dati useresti. Di quali servizi / macchine è composta la tua architettura. Quale sarebbe una tipica latenza di query? Che dire dei problemi di failover / split brain? Eccetera...


1
È una domanda abbastanza per un colloquio. Quanti dettagli stavano cercando?
Paddy,

1
In realtà, questa è una domanda che ho usato quando ho fatto alcune interviste qualche tempo fa. Il bello è che la quantità di dettagli che dai è davvero tua, e il tempo che il tuo intervistatore vuole spendere per questo.
ripper234,

2
"Riduci mappa! Prossima domanda per favore." "Ti chiameremo."

2
bella domanda ma il tipo a cui potresti passare ore a rispondere. Forse vorrei entrare in Google con flash drive

Penso che questa sia una buona domanda, anche se la troverei abbastanza travolgente. Ho pensato di recente a come costruire un algoritmo per "appesantire" gli articoli su un sito di notizie (solo in teoria, qualcosa per tenermi occupato sotto la doccia :) e ammetto che trovo che anche questa idea sia abbastanza difficile /complesso.

Risposte:


45

Considera il meta-punto: cosa sta cercando l'intervistatore?

Una domanda mastodontica del genere non ti sta cercando di perdere tempo nell'ottimismo dell'implementazione di un algoritmo di tipo PageRank o di come eseguire l'indicizzazione distribuita. Concentrati invece sull'immagine completa di ciò che sarebbe necessario. Sembra che tu sappia già tutti i pezzi grandi (BigTable, PageRank, Map / Reduce). Quindi la domanda è: come collegarli?

Ecco la mia pugnalata.

Fase 1: infrastruttura di indicizzazione (spendere 5 minuti per spiegare)

La prima fase di implementazione di Google (o di qualsiasi motore di ricerca) è la creazione di un indicizzatore. Questo è il software che esegue la scansione del corpus di dati e produce i risultati in una struttura di dati più efficiente per eseguire le letture.

Per implementarlo, considera due parti: un crawler e un indicizzatore.

Il compito del crawler Web è di collegare i collegamenti alle pagine Web e scaricarli in un set. Il passo più importante qui è quello di evitare di essere catturati in un ciclo infinito o in contenuti generati all'infinito. Posiziona ciascuno di questi link in un enorme file di testo (per ora).

In secondo luogo, l'indicizzatore verrà eseguito come parte di un processo Mappa / Riduci. (Mappare una funzione su ogni elemento nell'input, quindi ridurre i risultati in una singola "cosa".) L'indicizzatore prenderà un singolo collegamento Web, recupererà il sito Web e lo convertirà in un file indice. (Di seguito verrà discusso.) Il passaggio di riduzione consisterà semplicemente nell'aggregazione di tutti questi file di indice in una singola unità. (Piuttosto che milioni di file sciolti.) Poiché i passaggi di indicizzazione possono essere eseguiti in parallelo, è possibile eseguire il farm di questo lavoro Mappa / Riduci su un centro dati di dimensioni arbitrarie.

Fase 2: specifiche degli algoritmi di indicizzazione (spendere 10 minuti per spiegare)

Dopo aver dichiarato come elaborare le pagine Web, la parte successiva spiega come calcolare risultati significativi. La risposta breve qui è "molto più Mappa / Riduzione", ma considera il tipo di cose che puoi fare:

  • Per ogni sito Web, contare il numero di collegamenti in entrata. (Le pagine più pesantemente collegate dovrebbero essere "migliori".)
  • Per ogni sito Web, guarda come è stato presentato il link. (I collegamenti in <h1> o <b> dovrebbero essere più importanti di quelli sepolti in <h3>.)
  • Per ogni sito Web, guarda il numero di link in uscita. (A nessuno piacciono gli spammer.)
  • Per ogni sito Web, guarda i tipi di parole utilizzate. Ad esempio, "hash" e "tabella" probabilmente indicano che il sito Web è correlato a Informatica. 'hash' e 'brownies' d'altro canto implicherebbero che il sito riguardasse qualcosa di molto diverso.

Sfortunatamente non conosco abbastanza i modi per analizzare ed elaborare i dati per essere di grande aiuto. Ma l'idea generale è di modi scalabili per analizzare i tuoi dati .

Fase 3: risultati di pubblicazione (spendi 10 minuti per spiegare)

La fase finale sta effettivamente servendo i risultati. Spero che tu abbia condiviso alcune intuizioni interessanti su come analizzare i dati delle pagine Web, ma la domanda è: come effettivamente interrogarli? Aneddoticamente il 10% delle query di ricerca di Google ogni giorno non è mai stato visto prima. Ciò significa che non è possibile memorizzare nella cache i risultati precedenti.

Non puoi avere una sola "ricerca" dai tuoi indici web, quindi quale proveresti? Come guarderesti attraverso diversi indici? (Forse combinando i risultati, forse la parola chiave "stackoverflow" è risultata molto utile in più indici.)

Inoltre, come lo guarderesti comunque? Quali tipi di approcci è possibile utilizzare per leggere rapidamente dati da enormi quantità di informazioni? (Sentiti libero di nominare il tuo database NoSQL preferito qui e / o esaminare in cosa consiste la BigTable di Google.) Anche se hai un fantastico indice altamente accurato, hai bisogno di un modo per trovare rapidamente i dati in esso. (Ad esempio, trova il numero di rango per "stackoverflow.com" all'interno di un file da 200 GB.)

Problemi casuali (tempo rimanente)

Dopo aver coperto le "ossa" del tuo motore di ricerca, sentiti libero di bucare il topo su ogni singolo argomento di cui sei particolarmente informato.

  • Prestazioni del frontend del sito Web
  • Gestione del data center per i lavori Map / Reduce
  • Test A / B per migliorare i motori di ricerca
  • Integrazione di volumi / tendenze di ricerca precedenti nell'indicizzazione. (Ad esempio, aspettandosi che i carichi del server frontend aumentino di 9-5 e muoiano all'inizio di AM.)

Ovviamente ci sono più di 15 minuti di materiale da discutere qui, ma speriamo che sia abbastanza per iniziare.


1
Questa è un'ottima risposta, ma ritengo che non inizi a risolvere i problemi di scala con la costruzione di Google. Penso che la parte più stimolante sia quella di pubblicare i risultati nella parte della tua risposta, e dove risiede molta magia di Google. Ho qualche idea su come progettare qualcosa del genere, ma sono interessante ascoltare gli altri.
ripper234,

Ho chiesto questo su Quora - penso che potrebbe avere il pubblico a rispondere a questa domanda. quora.com/…
ripper234

Dai un'occhiata alla mia risposta.
ripper234,

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.