web-dev-qa-db-ja.com

Google検索をどのように実装しますか?

インタビューで「Google検索をどのように実装しますか?」あなたはそのような質問にどのように答えますか? Googleの一部(BigTable、MapReduce、PageRankなど)がどのように実装されているかを説明するリソースは世の中にあるかもしれませんが、それはインタビューに完全には適合しません。

どの全体的なアーキテクチャを使用しますか、これを15〜30分の期間でどのように説明しますか?

1万件を超えるドキュメントを処理する検索エンジンを構築する方法を説明することから始め、これをシャーディングを介して約5,000万のドキュメントに拡張し、次に別のアーキテクチャー/技術的飛躍を図ります。

これは20,000フィートのビューです。詳細は、インタビューで実際にどのように答えるかです。どのデータ構造を使用しますか。アーキテクチャを構成するサービス/マシンは何ですか。一般的なクエリのレイテンシはどのくらいですか?フェイルオーバー/スプリットブレインの問題はどうですか?等...

47
ripper234

Quoraへの投稿 は、Sergey BrinおよびLarry Pageによる 元の記事が公開されました を生成しました。これは、この種の質問の優れたリファレンスのようです。

Google Architecture

19
ripper234

メタポイントについて考えてみましょう。面接担当者は何を探していますか?

そのような巨大な質問は、PageRankタイプのアルゴリズムを実装することの核心で時間を浪費したり、分散インデックス作成を行う方法を探しているのではありません。代わりに、それが取るものの完全な図に焦点を当てます。大きな部分(BigTable、PageRank、Map/Reduce)はすべて知っているようです。だから問題は、どうやって実際にそれらを一緒に配線するのですか?

これが私の刺しです。

フェーズ1:インデックスインフラストラクチャ(5分かけて説明)

Google(または任意の検索エンジン)を実装する最初のフェーズは、インデクサーを構築することです。これは、データのコーパスをクロールし、読み取りをより効率的なデータ構造で結果を生成するソフトウェアです。

これを実装するには、クローラーとインデクサーの2つの部分を考慮してください。

Webクローラーの仕事は、Webページのリンクをスパイダーし、それらをセットにダンプすることです。ここで最も重要なステップは、無限ループや無限に生成されたコンテンツに巻き込まれないようにすることです。これらの各リンクを1つの大きなテキストファイルに配置します(現時点では)。

次に、インデクサーはMap/Reduceジョブの一部として実行されます。 (関数を入力内のすべてのアイテムにマップし、結果を単一の「もの」に減らします。)インデクサーは単一のWebリンクを取得し、Webサイトを取得して、それをインデックスファイルに変換します。 (次に説明します。)削減ステップは、これらすべてのインデックスファイルを1つの単位に集約することです。 (数百万のばらばらのファイルではありません。)インデックス作成の手順は並行して実行できるため、このMap/Reduceジョブを任意の大規模なデータセンター全体にファームできます。

フェーズ2:インデックス作成アルゴリズムの詳細(10分かけて説明)

Webページの処理方法を説明したら、次の部分では、意味のある結果を計算する方法を説明します。ここでの短い答えは「より多くのMap/Reduces」ですが、あなたができることの種類を考慮してください:

  • 各Webサイトについて、着信リンクの数を数えます。 (より強くリンクされたページは「より良い」はずです。)
  • 各Webサイトについて、リンクがどのように表示されたかを確認してください。 (<h1>または<b>のリンクは、<h3>に埋め込まれたリンクよりも重要です。)
  • 各Webサイトについて、送信リンクの数を確認します。 (スパマーが好きな人はいません。)
  • 各Webサイトについて、使用されている単語の種類を確認します。たとえば、「ハッシュ」と「テーブル」は、おそらくWebサイトがコンピュータサイエンスに関連していることを意味します。一方、「ハッシュ」と「ブラウニー」は、サイトがまったく異なるものであることを意味します。

残念ながら、非常に役立つデータを分析して処理する方法の種類については十分に知りません。ただし、一般的な考え方は、データを分析するスケーラブルな方法です。

フェーズ3:結果の提供(10分かけて説明)

最終フェーズは実際に結果を提供しています。うまくいけば、Webページのデータを分析する方法に関する興味深い洞察を共有できましたが、問題は、実際にそれをどのようにクエリするかです。事例によれば、毎日のGoogle検索クエリの10%はこれまでに見られたことはありません。つまり、以前の結果をキャッシュすることはできません。

Webインデックスから単一の「ルックアップ」を行うことはできないので、どちらを試してみますか?さまざまなインデックスをどのように見ますか? (おそらく結果を組み合わせる-おそらくキーワード 'stackoverflow'が複数のインデックスで高く登場しました。)

また、どうやってそれを調べますか? 大量の情報量からデータをすばやく読み取るには、どのようなアプローチを使用できますか? (お気に入りのNoSQLデータベースをここに自由に名前を付けたり、GoogleのBigTableの内容を調べたりしてください。)非常に正確な素晴らしいインデックスがある場合でも、データをすばやく見つける方法が必要です。 (たとえば、200GBファイル内の「stackoverflow.com」のランク番号を見つけます。)

ランダムな問題(残り時間)

検索エンジンの「骨」をカバーしたら、特に知識のある個々のトピックを自由に掘り下げてください。

  • ウェブサイトのフロントエンドのパフォーマンス
  • Map/Reduceジョブのデータセンターの管理
  • A/Bテスト検索エンジンの改善
  • 以前の検索ボリューム/傾向をインデックスに統合します。 (たとえば、フロントエンドサーバーの負荷が午前5時に急上昇し、AMの初めに消滅すると予想しています。)

ここで説明する資料は15分以上ありますが、最初はこれで十分です。

46
Chris Smith