Elasticsearchでの大きなデータセットの効率的な検索と取得

この投稿では、ホストされたElasticsearchを使用します。Qbox.io.ここでクラスターをサインアップまたは起動するか、ヘッダーナビゲーションの”Get Started”をクリックします。 設定のヘルプが必要な場合は、”Qbox Elasticsearchクラスターのプロビジョニング”を参照してください。

私たちの目標

Qboxは、Elasticsearch、Kibana、および多くのElasticsearch分析および監視プラグインのターンキーソリューションを提供します。 このチュートリアルの目的は、Qboxを使用して、スキャン要求とスクロール要求を使用して大きなデータチャンクをフェッチすることを示すことです。 Logstashを別のノード/マシンに設定してTwitterストリームを収集し、qboxプロビジョニングされたElasticsearchを使用して強力なScan and Scroll APIを再生します。

私たちのELKスタックの設定には、三つの主要なコンポーネントがあります:

  • Elasticsearch: これは、すべてのアプリケーションと監視ログ(Qboxによってプロビジョニング)を格納するために使用されます。
  • Logstash: 受信ログを処理し、ESにフィードするサーバーコンポーネント。
  • Kibana(オプション): ログを検索および視覚化するためのwebインターフェイス(Qboxによってプロビジョニング)。

前提条件

ELASTICSEARCHサーバーが必要とするCPU、RAM、およびストレージの量は、収集するログの量によって異なります。 このチュートリアルでは、以下の最小仕様でqboxプロビジョニングされたElasticsearchを使用します:

  • プロバイダ: AWS
  • バージョン: 5.1.1
  • ラム: 1GB
  • CPU: vCPU1
  • レプリカ: 0

上記のspecsはあなたの望ましい条件ごとに変えることができます。 必要に応じて、適切な名前、バージョン、地域を選択してください。 この例では、Elasticsearchバージョン5.1.1を使用しましたが、最新のバージョンは5.3です。 QboxではすべてのバージョンのElasticsearchをサポートしています。 (2つの主な違いについての詳細を学ぶために。xと5x、ここをクリックしてください。 Elasticsearchサーバーに加えて、twitter APIからの着信twitterストリームを処理してElasticsearchに出荷するには、別のlogstashサーバーが必要です。 簡単にしてテストするために、logstashサーバーはクライアントサーバー自体としても機能します。 QboxプロビジョニングされたElasticsearchクラスターのエンドポイントとトランスポートアドレスは次のとおりです:

共通_1.png

エンドポイント:REST API

https://ec18487808b6908009d3:[email protected]:32563

認証

  • ユーザー名= ec18487808b6908009d3
  • パスワード= efcec6a1e0

トランスポート(ネイティブJAVA)

eb843037.qb0x.com:30543

注:qbox Elasticsearchクラスターからlogstashサーバー IPをホワイトリストに登録してください。

Logstashのインストール

公開署名キーをダウンロードしてインストールします:

wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

私たちはLogstash version 2.4.xを私たちのElasticsearch version 5.1.xと互換性のあるものとして使用します。 Elastic Community製品サポートマトリックスは、バージョンの問題をクリアするために参照できます。

リポジトリ定義を/etc/apt/sourcesに追加します。リストファイル:

echo "deb https://packages.elastic.co/logstash/2.4/debian stable main" | sudo tee -a /etc/apt/sources.list

sudo apt-get updateを実行すると、リポジトリを使用する準備が整いました。 あなたはそれをインストールすることができます:

sudo apt-get update && sudo apt-get install logstash

または、logstash tarは、Elastic製品リリースサイトからダウンロードすることもできます。 次に、logstashの設定と実行の手順は非常に簡単です:

  • Logstashをダウンロードして解凍します
  • logstash.conf設定ファイルを準備します
  • bin/logstash -f logstash.conf -tを実行してconfig(logstash.conf)
  • 実行bin/logstash -f logstash.conf

Logstashの設定(Twitterストリーム)

Logstash設定ファイルはJSON形式で、/etc/logstash/conf.dに存在します。 この構成は、入力、フィルタ、および出力の3つのセクションで構成されています。

TwitterからAPI経由でデータを取得する権限が必要です。 この部分は簡単です:

  1. Twitterアカウントにログイン
  2. https://dev.twitter.com/apps/
  3. に移動します新しいTwitterアプリケーションを作成します(ここではTwitter-Qbox-Streamをアプリの名前として指定します)。

t1...png

Twitterアプリケーションを正常に作成すると、”キーとアクセストークン”に次のパラメータが表示されます”:

  1. コンシューマーキー(APIキー)
  2. コンシューマーシークレット(APIシークレット)
  3. アクセストークン
  4. アクセストークンシークレット

t2...png

これで、TwitterサーバーからマシンへのTwitterデータパス(ストリーム)を作成する準備が整いました。 上記の4つのパラメータ(consumer key、consumer secret、access token、access token secret)を使用して、logstashのtwitter入力を設定します。

02-twitter-input.conf という設定ファイルを作成し、”twitter”入力を設定しましょう:

sudo vi /etc/logstash/conf.d/02-twitter-input.conf

次の入力構成を挿入します:

input { twitter { consumer_key => "BCgpJwYPDjXXXXXX80JpU0" consumer_secret => "Eufyx0RxslO81jpRuXXXXXXXMlL8ysLpuHQRTb0Fvh2" keywords => oauth_token => "193562229-o0CgXXXXXXXX0e9OQOob3Ubo0lDj2v7g1ZR" oauth_token_secret => "xkb6I4JJmnvaKv4WXXXXXXXXS342TGO6y0bQE7U" }}

ファイル02-twitter-input.confを保存して終了します。これは、キーワード「mobile」、「java」、「android」、「elasticsearch」、「search」を含むツイートをフィルタリングし、それらをlogstash出力に渡すtwitter入力を指定します。 保存して終了します。 最後に、次のような設定ファイルを作成します30-elasticsearch-output.conf:

sudo vi /etc/logstash/conf.d/30-elasticsearch-output.conf

次の出力構成を挿入します:

output { elasticsearch { hosts => user => "ec18487808b6908009d3" password => "efcec6a1e0" index => "twitter-%{+YYYY.MM.dd}" document_type => "tweet" } stdout { codec => rubydebug }}

保存して終了します。 この出力は基本的に、Twitterのログデータをhttps://eb843037.qb0x.com:30024/で実行されているElasticsearchに、twitterにちなんで命名されたインデックスに格納するようにLogstashを構成します。

logstash tarまたはzipをダウンロードした場合は、logstashを作成できます。入力、フィルタ、出力をすべて一箇所に持つconfファイル。

sudo vi LOGSTASH_HOME/logstash.conf

logstashに以下の入出力設定を挿入します。conf

input { twitter { consumer_key => "BCgpJwYPDjXXXXXX80JpU0" consumer_secret => "Eufyx0RxslO81jpRuXXXXXXXMlL8ysLpuHQRTb0Fvh2" keywords => oauth_token => "193562229-o0CgXXXXXXXX0e9OQOob3Ubo0lDj2v7g1ZR" oauth_token_secret => "xkb6I4JJmnvaKv4WXXXXXXXXS342TGO6y0bQE7U" }}output { elasticsearch { hosts => user => "ec18487808b6908009d3" password => "efcec6a1e0" index => "twitter-%{+YYYY.MM.dd}" document_type => "tweet" } stdout { codec => rubydebug }}

次のコマンドを使用してLogstash設定をテストします:

sudo service logstash configtest

構文エラーがない場合は、構成OKが表示されます。 それ以外の場合は、エラー出力を読んで、Logstash設定の何が問題なのかを確認してください。

Logstashを再起動して有効にし、設定の変更を有効にします:

sudo service logstash restartsudo update-rc.d logstash defaults 96 9

logstash tarまたはzipをダウンロードした場合は、次のコマンドを使用して実行できます

bin/logstash -f logstash.conf

多数の応答が受信されます。 文書の構造は次のとおりです:

{ "text": "Learn how to automate anomaly detection on your #Elasticsearch #timeseries data with #MachineLearning:", "created_at": "2017-05-07T07:54:47.000Z", "source": "<a href="%5C">Twitter for iPhone</a>", "truncated": false, "language": "en", "mention": , "retweet_count": 0, "hashtag": , "location": { "lat": 33.686657, "lon": -117.674558 }, "place": { "id": "74a60733a8b5f7f9", "name": "elastic", "type": "city", "full_name": "San Francisco, CA", "street_address": null, "country": "United States", "country_code": "US", "url": "https://api.twitter.com/1.1/geo/id/74a60733a8b5f7f9.json" }, "link": , "user": { "id": 2873953509, "name": "Elastic", "screen_name": "elastic", "location": "SF, CA", "description": "The company behind the Elastic Stack (#elasticsearch, #kibana, Beats, #logstash), X-Pack, and Elastic Cloud" }}

Elasticsearchは、sizeとfromパラメータを追加することでページネーションを可能にします。 たとえば、3番目のページから5のバッチで結果を取得する場合(つまり、結果11-15を表示する場合)、次のようにします:

curl -XGET 'ES_HOST:ES_PORT/twitter/tweet/_search?size=5&from=10'

しかし、結果のリストにさらに進むにつれて、それはより高価になります。 これらの呼び出しのいずれかを行うたびに、検索操作を再実行し、Luceneを強制的にオフにしてすべての結果を再スコア化し、ランク付けしてから、最初の10 より簡単なオプションはscan and scroll APIです。 アイデアは、実際のクエリを一度実行してから、Elasticが結果をどこかにキャッシュし、戻って取得するための「アクセストークン」を提供することです。 次に、上記のトークンを使用してscroll APIエンドポイントを呼び出して、結果の次のページを取得します。

スクロールを使用するには、最初の検索要求でクエリ文字列にscrollパラメータを指定する必要があります。スクロール=1m.

curl -XPOST 'ES_HOST:ES_PORT/twitter-*/tweet/_search?scroll=1m&pretty' -H 'Content-Type: application/json' -d '{ "size": 100, "query": { "match" : { "text" : "elasticsearch" } }}'

上記のリクエストの結果には_scroll_idが含まれており、結果の次のバッチを取得するためにscroll APIに渡される必要があります。

curl -XPOST 'ES_HOST:ES_PORT/_search/scroll?pretty' -H 'Content-Type: application/json' -d '{ "scroll" : "1m", "scroll_id" : "DXF1ZXJ5DKJ56hghFHFDJgBAAAAAAAArknJBJsbjYtZndUQlNsdDcwakFSDSSXSQ=="}'

sizeパラメータを使用すると、結果の各バッチで返されるヒットの最大数を設定できます。 Scroll APIを呼び出すたびに、返される結果がなくなるまで、つまりhits配列が空になるまで、次のバッチの結果が返されます。 ScrollとScan APIに関して考慮すべきいくつかの重要な点は次のとおりです:

  • 最初の検索要求と後続の各スクロール要求は新しい_scroll_idを返し、最新の_scroll_idのみを使用する必要があります。
  • リクエストで集計が指定されている場合、最初の検索応答にのみ集計結果が含まれます。
  • スクロール要求には、並べ替え順序が_docの場合に高速になる最適化があります。 順序に関係なくすべてのドキュメントを反復処理する場合は、これが最も効率的なオプションです:
curl -XGET 'ES_HOST:ES_PORT/_search?scroll=1m&pretty' -H 'Content-Type: application/json' -d '{ "sort": }'

検索コンテキスト

scrollパラメータは、検索コンテキストを存続させる必要がある時間をElasticsearchに指示します。 その値(例:1m)は、すべてのデータを処理するのに十分な長さである必要はなく、前のバッチの結果を処理するのに十分な長さである必要があります。 各スクロール要求は、新しい有効期限を設定します。

Clear Scroll API

スクロールタイムアウトを超えると、検索コンテキストは自動的に削除されます。 ただし、スクロールを開いたままにするとコストがかかるため(パフォーマンスのセクションで後述します)、clear-scroll APIを使用してスクロールが使用されなくな:

curl -XDELETE 'ES_HOST:ES_PORT/_search/scroll?pretty' -H 'Content-Type: application/json' -d '{ "scroll_id" : }'

複数のスクロールIdを配列として渡すことができます:

curl -XDELETE 'ES_HOST:ES_PORT/_search/scroll?pretty' -H 'Content-Type: application/json' -d '{ "scroll_id" : }'

すべての検索コンテキストは、_allパラメーターでクリアできます:

curl -XDELETE 'ES_HOST:ES_PORT/_search/scroll/_all?pretty'

スライスされたスクロール

多くのドキュメントを返すスクロールクエリは、独立して消費できる複数のスライスに分割することができます:

 curl -XGET 'ES_HOST:ES_PORT/twitter-*/tweet/_search?scroll=1m&pretty' -H 'Content-Type: application/json' -d '{ "slice": { "id": 0, "max": 2 }, "query": { "match" : { "text" : "elasticsearch" } }}'
curl -XGET 'ES_HOST:ES_PORT/twitter-*/tweet/_search?scroll=1m&pretty' -H 'Content-Type: application/json' -d '{ "slice": { "id": 1, "max": 2 }, "query": { "match" : { "text" : "elasticsearch" } }}'

最初の要求の結果は、最初のスライス(id:0)に属するドキュメントを返し、2番目の要求の結果は、2番目のスライスに属するドキュメントを返します。 スライスの最大数は2に設定されているため、2つの要求の結果の和集合は、スライスなしのスクロールクエリの結果と同じです。

デフォルトでは、分割は最初にシャードで行われ、次に次の式で_uidフィールドを使用して各シャードでローカルに行われます:

slice(doc) = floorMod(hashCode(doc._uid), max)

パフォーマンスに関する考慮事項:

Scroll API : バックグラウンドマージプロセスでは、小さなセグメントをマージして新しい大きなセグメントを作成し、小さなセグメントが削除されます。 この処理はスクロール中も継続されますが、検索コンテキストを開いていると、古い分節がまだ使用されている間に削除されなくなります。 これは、Elasticsearchがドキュメントへのその後の変更に関係なく、最初の検索要求の結果を返す方法です。

古いセグメントを維持すると、より多くのファイルハンドルが必要になります。 ノードが十分な空きファイルハンドルを持つように構成されていることを確認し、データフェッチ後すぐにscroll APIコンテクストがクリアされます。

nodes stats APIで開いている検索コンテキストの数を確認できます:

curl -XGET 'ES_HOST:ES_PORT/_nodes/stats/indices/search?pretty'

したがって、前述の”スクロールAPIのクリア”セクションで説明したように、スクロールAPIコンテキストをクリアすることが非常に必要です。

: スライスの数がシャードの数よりも大きい場合、スライスフィルタは最初の呼び出しで非常に遅く、複雑さはO(N)であり、メモリコストはスライスあたりNビットに等しくなります。Nはシャード内のドキュメントの総数です。 いくつかの呼び出しの後、フィルターをキャッシュし、後続の呼び出しを高速にする必要がありますが、メモリの爆発を避けるために、並列に実行するスラ

注:スクロールごとに許可されるスライスの最大数は1024に制限されており、この制限を回避するためにindex.max_slices_per_scrollインデックス設定を使用して更新できます。

このコストを完全に回避するには、別のフィールドのdoc_valuesを使用してスライスを行うことができますが、ユーザーはフィールドに次のプロパティがあることを確:

  • フィールドは数値です。
  • doc_valuesはそのフィールドで有効になっています
  • すべての文書には単一の値が含まれている必要があります。 ドキュメントに指定されたフィールドに複数の値がある場合は、最初の値が使用されます。
  • 各文書の値は、文書が作成され、更新されないときに一度設定する必要があります。 これにより、各スライスが確定的な結果を得ることが保証されます。
  • フィールドの基数は高くする必要があります。 これにより、各スライスがほぼ同じ量のドキュメントを取得できるようになります。

フィールド”date”は自然に上記のプロパティを提供するため、スライスに使用できます:

curl -XGET 'ES_HOST:ES_PORT/twitter-*/tweet/_search?scroll=1m&pretty' -H 'Content-Type: application/json' -d '{ "slice": { "field": "date", "id": 0, "max": 10 }, "query": { "match" : { "text" : "elasticsearch" } }}'

Qbox Hosted Elasticsearch

をお試しください47のRackspace、Softlayer、またはAmazonデータセンターのいずれかで、標準のhosted elasticsearchクラスターを簡単にスピンアップできます。 また、Qbox Private Hosted Elasticsearchで独自のAWSクレジットをプロビジョニングできるようになりました。

私達にノートを落とせば、私達は敏速な応答を得ます。

QboxでホストされたELK-stack enterprise searchの利点をまだ享受していませんか? 今日はアカウントを作成し、クラウドホスティングサービスでElasticsearch環境を管理および拡張するのがいかに簡単かを発見することをお勧めします。

コメントを残す

メールアドレスが公開されることはありません。