Comment une requête dans un énorme retour de la base de données avec une latence négligeable?

datascience.stackexchange https://datascience.stackexchange.com/questions/89

  •  16-10-2019
  •  | 
  •  

Question

Par exemple, lorsque vous recherchez quelque chose dans Google, les résultats reviennent presque-instantanément.

Je comprends que les sortes de Google et des pages d'index avec des algorithmes, etc., mais je l'imagine infaisable pour les résultats de chaque requête possible à indexer (et les résultats sont personnalisés, ce qui rend cela encore plus infaisable)?

Par ailleurs, ne serait pas le temps de latence du matériel dans le matériel de Google est énorme? Même si les données de Google ont tous été stockées dans les disques SSD TB / s, je suppose que le temps de latence du matériel pour être énorme, compte tenu de l'énorme quantité de données à traiter.

Est-ce que MapReduce aider à résoudre ce problème?

EDIT: D'accord, donc je comprends que les recherches populaires peuvent être mises en mémoire cache. Mais qu'en est-recherches impopulaires? Même pour la recherche la plus obscure que je l'ai conduit, je ne pense pas que la recherche n'a jamais été rapporté être plus de 5 secondes. Comment est-ce possible?

Était-ce utile?

La solution

Eh bien, je ne sais pas si elle est MapReduce qui résout le problème, mais il ne serait pas sûrement MapReduce seul pour résoudre toutes ces questions que vous avez posées. Mais voici choses importantes à prendre en compte, et qui en font possible pour avoir un tel faible temps d'attente sur les requêtes de toutes ces données dans téraoctets de machines différentes:

  1. calcul distribué: en étant distribués ne signifie pas que les indices sont simplement distribués dans des machines différentes, ils sont effectivement répliquées en fonction de groupes différents, ce qui permet beaucoup d'utilisateurs effectuant des requêtes différentes avec un faible temps de récupération (oui, d'énormes entreprises peuvent se permettre pour que la plupart des machines);
  2. Mise en cache: caches réduire considérablement le temps d'exécution, que ce soit pour l'étape rampants, pour la récupération des pages, ou pour le classement et exihibition des résultats;
  3. beaucoup de peaufinage: tous les algorithmes / solutions ci-dessus et très efficace ne peut être efficace que si la mise en œuvre est également efficace. Il y a des tonnes de optimisations (codés en dur), comme lieu de référence, la compression, la mise en cache; tous généralement appliable aux différentes parties du traitement.

Considérant que, permet d'essayer de répondre à vos questions:

  

mais je l'imagine infaisable pour les résultats de chaque requête possible d'être indexé

Oui, ce serait, et est en fait infaisable d'avoir des résultats pour chaque requête possible . Il y a un nombre infini de termes dans le monde (même si vous assumez que seuls les termes correctement orthographiés seront inscrits), et il y a un nombre exponentiel de requêtes de ces termes de n -> inf (de 2^n). Alors ce qui est fait? Mise en cache. Mais s'il y a tellement de requêtes / résultats, les mettre en cache? politiques Caching. Les plus fréquents / populaires / pertinentes-pour-le-utilisateur requêtes sont celles mises en cache.

  

ne serait pas le temps de latence du matériel dans le matériel de Google est énorme? Même si les données de Google ont tous été stockées dans TB / s disques SSD

Nowdays, avec les très développés processeurs, les gens ont tendance à penser que toutes les tâches possibles que finition doit, dans une seconde (ou moins), et qui traite des données tant, doivent être traitées par des processeurs très puissants avec plusieurs cœurs et beaucoup de la mémoire. Cependant, la seule chose au pouvoir marché est de l'argent, et les investisseurs ne sont pas intéressés à gaspiller. Alors qu'est-ce qui est fait?

La préférence est en fait pour avoir beaucoup de machines, chacun utilisant des processeurs simples / accessibles (en termes de coûts), ce qui réduit le prix de la construction de la multitude de groupes il y a. Et oui, cela fonctionne. Le principal goulot d'étranglement revient toujours sur le disque, si l'on considère des mesures simples de performance . Mais une fois il y a tellement de machines, on peut se permettre de charger les choses à la mémoire principale, au lieu de travailler sur des disques durs.

Les cartes mémoire sont cher pour nous, êtres simples humains, mais ils sont vraiment pas cher pour les entreprises qui achètent beaucoup de ces cartes à la fois. Comme il est peu coûteux, ayant autant de mémoire que nécessaire pour les indices de charge et de garder les caches à portée de main est pas un problème. Et comme il y a tant de machines, il n'y a pas besoin de processeurs ultra-rapide, comme vous pouvez diriger les requêtes vers des endroits différents et ont des groupes de machines responsables de participer à régions géographiques spécifiques , ce qui permet de plus < em> spécialisée mise en cache des données, et encore mieux les temps de réponse.

  

Est-ce que MapReduce aider à résoudre ce problème?

Bien que je ne pense pas que l'utilisation ou non MapReduce est une information limitée dans Google, je ne suis pas au courant à propos de ce point. Cependant, la mise en œuvre de Google MapReduce (ce qui est sûrement pas Hadoop) doit avoir beaucoup d'optimisations, impliquant de nombreux aspects discutés ci-dessus. Ainsi, l'architecture MapReduce probablement illps les calculs régissant la façon dont sont distribués physiquement, mais il y a beaucoup d'autres points à considérer pour justifier une telle vitesse dans le temps l'interrogation.

  

D'accord, donc je comprends que les recherches populaires peuvent être mises en mémoire cache. Mais qu'en est-recherches impopulaires?

Le graphique ci-dessous présente une courbe de la façon dont les types de requêtes se produisent. Vous pouvez voir qu'il ya trois principaux types de recherches, chacun d'entre eux détiennent environ un tiers du volume de requêtes (zone sous la courbe). La loi graphique montre de puissance, et renforce le fait que les petites requêtes sont les plus populaires. Le deuxième tiers des requêtes sont toujours possible de traiter, car ils détiennent peu de mots. Mais l'ensemble de ce qu'on appelle requêtes obscures , qui consistent généralement des requêtes des utilisateurs non expérimentés, ne sont pas une partie négligeable des requêtes.

Distribution Heavy-tailed

Et il se trouve un espace pour des solutions nouvelles. Comme il est non seulement une ou deux requêtes (mais un tiers d'entre eux), ils doivent avoir pertinents Résultats. Si vous tapez quelque chose beaucoup trop obscurcir dans une recherche Google, il ne doit pas prendre plus de temps pour retourner une liste de résultats, mais très probablement vous montrer quelque chose qu'il inférée « aimerais dire. Ou il peut simplement indiquer qu'il n'y avait pas de document avec ces termes - ou même réduire votre recherche 32 mots (ce qui vient de se passer pour moi dans un test aléatoire ici)

.

Il y a des dizaines de heuristiques appliable, qui peuvent être soit d'ignorer certains mots, ou pour tenter de briser la requête en plus petits, et de recueillir le plus de populaires Résultats. Et toutes ces solutions peuvent être adaptées et peaufinés à respecter possibles temps d'attente de, disons, moins d'une seconde? : D

Autres conseils

MapReduce n'a rien à voir avec quoi que ce soit en temps réel. Il est un cadre de traitement orienté par lots appropriés pour certaines tâches hors ligne, comme ETL et la construction d'index. Google a déplacé hors de MapReduce pour la plupart des emplois maintenant, et même l'écosystème Hadoop fait la même chose.

La réponse à faible latence est généralement de maintenir les indices précalculées en mémoire. Tout ce qui touche le disque est difficile de faire rapidement et à l'échelle. Voici comment les moteurs SQL basé Hadoop nouvelle génération comme Impala obtenez beaucoup de vitesse par rapport à l'infrastructure basée sur MapReduce comme ruche , par exemple.

Rechercher l'infrastructure ne peut pas mettre en cache les résultats de chaque requête. Mais il peut vous mettre en cache des résultats intermédiaires, ou, plus des résultats complets pour les requêtes les. Avec un peu de mise en cache, vous pouvez servir des résultats pour une minorité importante de toutes les requêtes.

La recherche est également répartie sur les serveurs. Donc, une machine peut déléguer à 100 à chaque obtenir une partie du résultat puis les combiner.

Vous pouvez aussi sortir avec un certain degré d'approximation. Google ne fait pas littéralement mille pages de résultats de recherche; il a juste pour obtenir la première page sur la droite.

Gardez à l'esprit que Google a millions d'ordinateurs dans le monde entier. Vos requêtes vont à un centre de données géographiquement proche de vous et qui est seulement au service de votre géographie. Cela réduit la plupart du temps d'attente, qui est le réseau et non le temps de traitement dans le centre de données.

MapReduce est pas utilisé dans la recherche. Il a été utilisé depuis longtemps pour construire l'indice; mais il est un cadre de traitement par lots, et la plupart du web ne change pas tout le temps, de sorte que les architectures les plus récentes sont tous incrémental au lieu de lots orientés.

Rechercher dans Google en grande partie le même travail, il travaille dans Lucene et Recherche élastique, sauf pour beaucoup d'peaufiné pondération supplémentaire et des optimisations. Mais au cœur même, ils utiliseront une certaine forme de index inversé . En d'autres termes, ils font pas rechercher plusieurs téraoctets lorsque vous entrez une requête de recherche (même quand il est pas mis en cache). Ils ne regardent pas probablement les documents réels du tout. Mais ils utilisent une table de recherche qui répertorie les documents correspondant à votre terme de requête (avec égrappage, fautes d'orthographe, synonymes, etc. tous prétraitées). Ils extraient probablement le des top 10000 documents pour chaque mot (10k entiers - juste quelques kb) et calculer les meilleurs matchs de cela. Seulement s'il n'y a pas de bons résultats dans ces listes, ils étendent aux prochains tels blocs etc.

Les requêtes pour les mots communs peuvent être facilement mises en cache; et par l'intermédiaire prétraiter vous pouvez construire une liste des résultats 10k supérieur, puis les rerank selon le profil de l'utilisateur. Il n'y a rien à gagner en calculant une réponse « exacte », aussi. En regardant en haut 10k résultats est assez probable; il n'y a pas de réponse correcte; et si un meilleur résultat quelque part à la position 10001 est manquée, personne ne saura ou un avis (ou de soins). Il était déjà classé probablement dans prétraiter et n'aurait pas fait dans le top 10 qui est présenté à l'utilisateur à la fin (ou le top 3, l'utilisateur regarde réellement à)

Les termes rares d'autre part ne sont pas beaucoup plus d'un défi, soit -. L'une des listes ne contient que quelques documents correspondants, et vous pouvez immédiatement rejeter tous les autres

Je recommande la lecture de cet article:

  

L'anatomie d'une grande échelle hypertextuelle Web Search Engine   Sergey Brin et Lawrence Page
  Département Informatique, Université de Stanford, Stanford, CA 94305
   http://infolab.stanford.edu/~backrub/google.html

Et oui, ce sont les fondateurs de Google qui ont écrit cela. Ce n'est pas le dernier état, mais il sera déjà travailler à une échelle assez grande.

Licencié sous: CC-BY-SA avec attribution
scroll top