千の顔推薦システムのElasticSearch +スパーク構築し、関連性の高いサービス&数千人

ElasticSearch(以下、ESと称する)は、オープンソースのLucene検索エンジンの製品に基づいています。Luceneのは、Word文書、ドメイン、インデックスの基本的な機能を反転し、セクションなど関連性スコアを含むJavaの文書検索で書かれたオープンソースのライブラリーの基礎であり、ESは、これらのライブラリを使用することで、直接ビルドaに使用することができます検索エンジンは、製品の使用します。直感的に理解し、Luceneには、自動車部品、カーディーラーとの直接ESを提供します。

いえば ESの誕生、それは非常に興味深い話です。、彼はロンドン。でロンドンへの彼の新しい妻以下、無職のエンジニアだった数年前にESの作者シェイBanon--は」、彼の妻は、シェフであることを学びたいと思って、彼の妻のアプリケーションを開発したい、便利なレシピ検索ですLuceneの建物を使用して直接検索は、反復作業を多く含む多くの問題を、持っているなぜ彼らはLuceneのと接触する。シェイは、Luceneの抽象化に基づいてされ続けてJavaプログラムは、検索が容易に埋め込まれた時間をかけて研磨できるようになるので、彼らは彼の最初のオープンソースは、コンパス、中国すなわち「コンパス」を意味する働きを出産した。、シェイは、高性能な分散開発環境に直面して新しい仕事を見つけた後、職場で、彼は次第にAのためのニーズの高まりを見つけました彼はコンパスを書き直すことにしました簡単に使用する、高性能、リアルタイム、分散型検索サービスに、ので、それはライブラリからスタンドアロンサーバーに構築し、elasticsearchと改名します。」

 

どのような愛のアップティンカーに見えるプログラマは、それが言われていたが、ということである妻のレシピ検索にシェイバノンのコミットメントが出て来ていない......

この記事では、おそらく導入 ESの原理を、だけでなく、いくつかの教訓が最も多湿の使用ESを学びました。ここでの焦点は、また、ピットのいくつかの重要なポイントのステップが説明されていることがあり、実際のプロジェクトが使用する可能性がありますピックアップして、機能や知識としてES自体は、非常に広いです。

キー概念
クラスタ(クラスタ):ESは、一般に、複数の物理マシンから構成される、分散型検索エンジンです。これらの物理マシンは、同じクラスタ名を配置することにより、クラスタに自分自身を整理するために、お互いを発見しました。

ノード(ノード):Elasticearchホストのクラスタと。

マスタースライス(プライマリシャード):物理的なサブセットのインデックス(後述)。同じインデックスは、物理的に異なるノードに分散された複数の部分を切断してもよいです。断片化は、Luceneインデックスを達成しています。

注: ESは、もはや変更後に設立され、インデックスを指定する必要があるインデックスにフラグメントの数。だから、インデックスを作成するための開始時に、我々は、合理的な範囲内の断片化分布の数をデータサイズを期待するべきです。

コピー断片(レプリカシャード):各メインシートは、ユーザーの数が自分を設定するには、1つ以上のコピーを有することができます。ESは、耐障害性を向上させるために、異なるノードに分散し、同じインデックスの異なるスライスにしようとします。インデックスに、破片がリンクされている限りではないすべてのマシンとして、彼らが使用することができます。メインコンセプト、コピー、ノードは次のとおりです。

 

 


インデックス(指数):論理的な概念は、ドキュメントオブジェクトのコレクションを取得することができます。コンセプトは、データベースDBに似ています。クラスタに複数のインデックスを作成することができます。たとえば、本番環境での方法の一般的なのは、毎月生成されたデータのインデックスは、制御のための単一のインデックスを確認します。インデックス- >タイプ- >ドキュメントには、このような論理組織までに書類をES。

タイプ(種類):データベース・テーブルへのインデックスの概念の下で、ほぼ等しいです。同じインデックスには複数のタイプが含まれていてもよいです。このレベルで実用化されている個人的な感情の種類は、多くの場合、このタイプは、ドキュメントのコレクションを確立し、検索を続けるには、インデックスに直接タイプを構築するために、非常に多く使用されています。

ドキュメント(文書):文書検索エンジンの概念、すなわち、それがESの基本単位であるが、データベース行、レコードの等価、検索することができます。

フィールド(フィールド):データベース列に対応しています。ES、すべての文書は、実際には、JSONの形式で格納されています。文書は、複数のフィールドのセットとみなすことができます。たとえば、記事がテーマ、抽象的、テキスト、著者、時間やその他の情報が含まれる場合があります、各情報は、フィールドで、最後ビーイングは、JSON文字列、床からディスクに統合。

マッピング(マッピング):

データベースに対応スキーマ、タイプフィールドを制限するために使用されるが、マッピングはElasticsearchは、自動的に文書データに基づいて作成された指定表示されない場合があります。

Elasticsearchは非常に親切にRESTfulなAPIを提供し、あなたは、HTTPリクエストから直接すべての操作を完了することができます。ここでは、インデックスにドキュメントを追加さ​​えずりなど、公式の例は、タイプは、IDつぶやきは、文書が1で、次のとおりです。

 

したがって、に従い、検索されたドキュメントのユーザーフィールド:


キー設定項目
番号の破片1、インデックス: 
破片の数、それは良好であり、関連するノードの数。理論的には同じインデックス、最良の単一ではないつ以上の破片の数、そのため、可能な限り各クエリの並列処理。ESは、あなたが考慮に入れそうならば、破片の数を再調整する方法を決定することですので、しかし、データは、急速な成長は、より缶の割り当てるようになったことでしょう。それは、動的に新たに追加されたインデックスを調整することができるので、破片の数-別の一般的なアイデアは、時間ラチチュード(月)によってESインデックスを定義することです。そのような重合最も多湿のが原因ESが管理するので、破片の数(200が1である)を定義するが、あまりにも多くの破片は、一般的に推奨されていない、データチャネルカットに応じて可能な限り分離する必要があるため、移動するには、以下の例のようないくつかの他の場合、オーバーヘッドがあります。

2、ヒープメモリ: 
公式アドバイスが半分使用可能なメモリで、開始することにより、 ES環境を、完成した環境変数の方法を定義します。輸出ES_HEAP_SIZE = 10グラム

3、cluster.name: 
クラスタの論理名。唯一のクラスタマシンと同じ名前は、論理的にクラスタを形成します。例えば、ネットワークES機5の例があり、いくつかの非干渉ESクラスタで構成されています。

4、discovery.zen.minimum_master_nodes: 
これは、少なくともの分散クラスタの決定であるマスターマシンの数。コーディネーションと共通分散アルゴリズムは、のように、回避のスプリットブレイン現象へ順に、次のことが推奨され、よりマシンの半分以上、N / 2 + 1

5、discovery.zen.ping.unicast.hosts: 
マシンのリストには、クラスタをES。メモは、最終形態クラスターをES、それはすべてのマシンを見つける、各マシンが構成されて互いに接続することができる他のマシンで構成されている限り、接続されたグラフのように、クラスタリスト内のすべてのマシンの構成の一点なしES。[ '111.111.111.0'、 '111.111.111.1' 、 '111.111.111.2']

マッピング
マッピングデータベーステーブルの構造は、マッピングの定義は、インデックスを作成したことを意味し、同様です。違いは、実行時間がまだインデックスが定義されていない場合、データベースは、インデックスは、ESが自動的に作成されたフィールドと、文書の内容に基づいて行われます、例えば上記さえずりインデックス内の文書データの挿入としてマッピングディスプレイを確立する必要がないことですインデックス作成とマッピング。この方法で作成しかし、インデックスフィールド、我々は必要なものが多いかもしれません。だから、手動でまたはインデックスを作成するために、独自の事前定義されたマッピングが良いです。ここでは、ユーザのためにmy_indexこのディレクトリに、この例のマッピングを作成し、ブログ投稿マッピングのこれらのタイプを作成するための例があります。以下のプロパティを等文字列、数字、日付、のタイプを含む様々な分野で定義されている定義されています。

赤枠部に示すように、この例では、2つの注意点があります。

1、文字列型のUSER_IDが、そのインデックスは、「not_analzyed」にその意味を明確にする必要性が定義されています。次のように一般的には、検索エンジンのフルテキスト検索機能は、単純に実装する者:原稿の単語の後にその後、これらの転置インデックスを作成するための言葉、行を取得し、ユーザーのクエリ単語分割を行って、最終的な結果を得るために、ジッパー結果転置インデックス、マージ、関連性のランキングなどを引っ張って複数とのセグメント化の結果。しかし、フィールドの一部の文字列型のため、実際には、あなたが完全に一致をしたい、反転ビルドしたくない、そのようなユーザーの名前と、ちょうど後で単語「張を取得するのではなく、「ジョー・スミス」として正確な名前フィールドを見つけました4「と」リー3「二人は、この時間は、私たちは、インデックスフィールドのタイプを定義する必要があります。このフィールドには、解析し、無単にこのフィールドを与えていない、3種類のnot_analyzedていない、インデックス付き全文検索および分析によって分析されnot_analyzed、ビルドへの道である正確なキーワードクエリに一致です。

2、あなたは「形式」の様々なを通じてマッピングのニーズを作成した日付タイプは、入力フォーマット可能な時間を指定します。ですから、文書を作成するときに、ESが自動的に入力フィールドに移動しますどのような種類のドキュメントのに基づいて決定されます。しかし、直感的にドキュメントを作成するときに、ダイナミックES判断のオーバーヘッドを排除し、特定の時刻形式を指定し、想像の下で、パフォーマンスを向上させるために、わずかに小さくする必要があります。また、有料の注意を、epoch_second(秒単位のタイムスタンプ)と(ミリ秒単位)epoch_millisあなたがミックスしなければならない場合は、混在しないようにしよう、明らか挿入時に示す必要がありますがこれです。持っているが、ピット段、epoch_second秒のタイムスタンプを挿入しますが、優先順位が短縮された時間で、その結果、ミリ秒ES考えられていることは1000倍、1970年の時間になっ最新の時間です。


地図示すデータ・タイプ・マッピングは、ESの現在のバージョンで実行することができるが、組み込みフィールド、パラメータマッピング操作を行うことができます。そのためのスペース上の理由で、ここで詳細に説明しません。

 


ここでは詳細に説明し、赤いボックスの上の図は、我々が作成し、マークされている 2は、ビルトインタイプ、および2つのマッピングパラメータは、実際に使用されるマッピングより重要な。これらは、直接インデックス最後の訪問のパフォーマンスに影響します。

 

 

1)_source:これは、元のデータの完全な量として理解することができるので、彼はインデックスに使用することはできませんが、必要なときに返すことがあり、ディスクへの生のJSONの秋を構成するすべてのフィールドをes'll。サポートされていない更新にスクリプトを使って、無効にするなど、無効に注意を払うしないようにしてください。

2)_all:フルテキストインデックスのための「擬似」フィールドがぼやけ。理解することができます:インデックスを構築するとき、すべてのフィールドは、文字列を構成する、その後、反転建てられ、この「ビッグ」単語分割フィールドは、そのフィールドは破棄されます、そして本当にディスクに落ちません。何のドメインがクエリで指定されていない場合は、フルテキスト検索は、タイトルなど、(非常に一般的である)テキストは、その行下に大きなジッパーから文書を引くとき。、日付などのいくつかのマーカーまたは値型のフィールドを、想像し、スコアは、フルテキスト検索では、この時間は無意味である、それは_allに含めることはできません、そして、タイトル、ドキュメントなどのテキストフィールドは、_allに含まれていますています。これらは、とすることができる建設マッピングであり、好ましくは、指定されました。

3)doc_values:doc_values重合をデフォルトで有効になって、これらの統計的パラメータを並べ替えに使用される以下のfield_data()は、後述する、です。逆索引は確かに不適切であるとソート、集計、この作品は、世界的な文書で行いました。そのため、文書のグローバル統計を作るのは簡単にランクされている店舗のドキュメントへのカラムモードを介してdoc_valuesのnot_analyzedのフィールド(すなわち、反転内蔵されていない)(HBaseのを参照してください)。doc_valuesはあなたには、いくつかのフィールドをクリアした場合にだけ、統計のために、あなたはこの秋を無効にすることができない、を示すことを行く、ディスク上に格納されています。Doc_valuesは確かに分析する場ではなく、次のフィールドデータと、(列インデックスのものを構築する方法、また不適切だと思う、両方のカット・ワード)を索引付けされません。

4)field_dataは:分析されたテキストフィールドに、テキストなど、実際には、ESは、キー文書重合統計のいくつかによってサポートされているような統計の需要(があるでしょうが、このタスクに一般的に使用される方法は、Hadoopのか、などのオフラインツールを介して行われスタンドアローンを分析した後、オンラインでの索引は、実際に)少し奇妙に感じたESに直接カウントするように、良い仕事をするためにプッシュ。検索エンジンには適していませんが行うが、あなたが本当にやりますが、ESは、フィールドデータの動的ロードメモリにこのデータを置く操作を実行します。だから、あなたが知っていると思う、これは、JVMのヒープ完成することが可能である、非常にメモリ集約操作です!ESは、デフォルトで有効になっていますが、このダイナミックなロードメモリ(怠惰な道)に行く前に、ソートされ、重合のドメインを分析する必要があるちょうどその時、ロードされません。だから、このパンドラの箱を開け、クエリの時に行く、または単にバーをオフにするオプションを入れないようにしてみてください。

重合
の検索エンジンを言うだけで検索するために使用することができますか?ESが検索できるだけでなく、直接検索の統計結果のコレクションで、それは非常に強力です。ES主に2つの方法で、現在安定した非実験相重合:メトリックアグリゲーション(集約インデックス)とバケットアグリゲーション(バレル重合)。

重合の主な指標は、公式のような数学的統計クラス従来の操作のコレクションを参照するトランザクションを見つけ、その後、それらの平均価格を見つけるために、すべての赤い車:この例のガイド:

結果は次のようになります。

魔法それ〜そのような最大値、最小値、合計値、数、地理的座標の計算など、コンピューティング他のメトリクスをさらに含みます。しかし、今日、私たちは主バケツ集約、樽の重合を説明するための一例になりたいです。これは、指定されたフィールドを異なるグループに分割し、その後さらに、セット動作中で重合されるによるポリマー浴槽文書を参照して、タブレベルの結果を返します。ようにヒストグラム、サブ時の統計と次のようなより直感的な理解、。次の例では、カラーフィールドに応じて、ポリマー槽重合用語、すなわち、である、マッチング精度分割浴槽、浴槽さらに重合ネスト平均価格、部品の製造業者のキットさらなる重合に記載の方法。

この下に、赤い車のような調査結果の合計 4は、平均価格は32500であり、また、3ホンダとBMW 1が含まれています。

上記の簡単な例です。当社では最も雨の多い世論、ホットポストフォーラム機能があり、すなわち、データソースから、フォーラム(例えば王の栄光のように、右)、一定期間(例えばBaiduのポストバーなど)のリアルタイムの統計情報(例えば、3ヶ月) 、回答はTopNポストの最大数。

詳細には説明しないオンライン方法この関数は、現在実装され、データベースは、一般にスタックを維持するのHBaseに対応するスキャンデータ、TOP Nのアイデアを取得します。一方で、多少時間がかかりますが、一方で、要求量が多い可能性が高いDBアクセスとのHBaseに圧力をもたらすことですが、それはまた別のスキームを探している、我々はESを使用するのではと思いました。

使用するためには、重合ESバレル、どのように(で、すべてのユーザーのコメント)プログラムをドキュメントを格納するために、私たち最初のデザインを。データの量が非常に大きいので(10億)、私たちはさまざまな指標に文書(例えば、毎月など)、その後、特定の月に初めて考えるので(例えば、3ヶ月)、インデックス、ほとんどのトップコメント重合ポスト。しかし、これは問題がある:インデックスESの複数の重合は、ESが一緒に重合のTopNが、しかし、個別に各インデックスのTopNの後に決定された全てのインデックスになり、そして一緒に重合を入れないとき。ピットを使用する際に注意を払うです。この結果は、このような3ヶ月などのTopN、ない本当の上位N(うち複数のインデックスに直接重合され、毎月トップ1ではありませんが、トップ1.ローカルの三ヶ月まで追加します最適)は、グローバル最適と同じではありません。

だから、時間セグメンテーションから、基本的にこの道路が閉鎖されています。空間的なセグメンテーションからの鳥(あなたは助けることはできませんが、聞いてセグメンテーション?データの量の10億を、何百もの GBは、検索したファイルの数百GBから、素直に、毎回それをスライスしません何か、)...また、どのように遅い知っていると思います。破片のハッシュデータにどのように)1:空間的なセグメンテーションから、また、我々は二つの質問を考慮する必要があります。2)どのように多くの破片スライス。最初の質問のために、我々は、(フォーラムとして理解することができる)の下で、クロスチャネルは、したがって、破片チャネルIDに従って割り当てられないであろう、同じフォーラムへのデータのハッシュがシャード可能な各チャンネルの集約統計であるため。したがって、チャネル内の各要求重合結果は、要求は、シャードに操作ルーティング対応するチャネルIDに従って。2番目の質問については、それが特定のサイズに依存します。我々は、より速く、当然の破片の数ではなく、あまりにも多く、それ以外の場合は、意志ます単一シャード時間にその重合を確実にするために、できるだけ各シャード上のコンテンツを願っていますので、我々はGの何百、データソースの数千人を、持っているデータの量非常に大規模な管理オーバーヘッドのES紹介。ダウン統合され、破片の数は、我々は200を選択しました。

残念ながら、唯一のあなたの指定したキー(フォーラムID)に基づくルーティングの後にESは、異なるデータの破片にリードが完全に平均ではありません、ハッシュを行う10ギガバイト、わずか数十MBの最小値の最大値を超えています。1日の場合、ESあなたはそんなに良く、破片バランスアプローチにルールやデータをルーティングするカスタムを開いた場合。

多くの場合、ES批判場所は比較的遅く、インデックス、それは数日かかる長い構築するために10億のインデックスデータです。また、簡単に理解することです、ないフリーランチは存在しない、読み取りと書き込みのパフォーマンスは、相互に排他的で速い遅いことがバインドされて書かれている事前に確立された二次データをたくさん読んで、インデックスと検索手段傾向にあります。、あなたは、実際のビジネスシナリオを見てどのように選択する必要があります依存しています。ここでは、インデックスの後に構築され、フォーラムのトップのポストと呼ばれる時間の総計インタフェース指定された期間にアクセスしてください。

 その後、我々はテストされた既存のESおよびオンラインサービスのそれぞれに2つのチャネルの結果を中継ぎTOP30連続統計最も暑い上位N(Nは異なる数である)の方法があります:

5上記視覚と今、図の結果を反映する統計的方法で、従来の統計的方法及び世論ラインES重合最も多湿の結果を取得するために時間がかかります。

この結果から、我々は約推測 ES統計集計操作の練習:フィルタ基準のすべてを満たすの最初のすべてのデータを取得し、その後、メモリ内のソート操作をして集約。これは、修飾されたデータより大きな、より遅い重合操作の順です。この原則に沿って、その結果は、マップを理解することは、より簡単になります。

1)熱重合後にホットなチャネルの連続Top1000中、ES性能はほとんどの既存の実装よりも優れています。これは、チャネルTop1000は、チャンネルのほとんどは非常に小さな破片であったので、いくつかのわずか数MBは、データの量は、このような破片で重合は、非常に高速で、小さいです。

2)時間緯度、統計データの3ヶ月は、ほとんどの場合、低速の既存の方法よりもES、および次の1月または1日の状況、ESは、より速く。これは、次の3ヶ月からである、とデータが増加(3万トピックスレッドの最大値が存在する)のオーダーの条件に準拠して、業務効率がより強力に低下ES。

3)Top1000トップ10からの合計時間に、ESは、徐々に従来の方法では悪化しました。これは、空間緯度ので、トップ10のチャネルは、注文データの条件は非常に大きいので、ES作業効率がより強力な減少満たしています。

この実験を行った後に、データ・ソースのヘッダにおけるES最も多湿の重合速度は、それが今よりも速くはないが、中央より良いロングテールへの影響は、重合は、データの影響を受ける候補セット量をESことを示すことは非常に大きいので、もしこのアプローチは、まだ最終的に切り替えています。しかし、この実験は、ES重合のパワーを発揮、少なくとも、コードは、このような膨大なデータが完全でのみ統計的操作インタフェースを介して呼び出すことができます何を自分で書いていない、まだ非常に便利なものですが、性能も良いです。圧力は、統計的操作DB独自の実装を向上させる場合には、要求ES重合のこの部分を分離することにより、また、非常に良い選択です。

おすすめ

転載: www.cnblogs.com/itpy/p/11872066.html