Spark Elasticsearch
Spark Elasticsearch とは
Spark Elasticsearch とは、ドキュメント指向および半構造化データを格納、取得、管理する NoSQL 分散データベースです。GitHub オープンソースである Elasticsearch は、Apache Lucene をベースに構築され、Apache ライセンスの条件下でリリースされた RESTful な検索エンジンでもあります。
Elasticsearch は Java ベースであるため、さまざまな形式のドキュメントファイルを検索およびインデックスできる多くのプラットフォームでの利用が可能です。Elasticsearch に格納されるデータは、スキーマレスの JSON(JavaScript Object Notation)ドキュメント形式です。これは、NoSQL データベースと似ています。
Elasticsearch の概要
Elasticsearch は、Google ブレインチームのエンジニアによって設計、開発された全文検索エンジンであり、オープンソースツール群「Elastic Stack」の重要な一角を担っています。Elasticsearch は、Reddit、YouTube、eBay といったさまざまな商用アプリケーションで広く使用されています。テキストベースの検索は、多くの企業のビジネスプロセスにおいて不可欠な要素になっています。この点において、Elasticsearch は他の検索エンジンと類似しています。
Elasticsearch と他の検索エンジンの大きな違いは、分散データを保存、管理できることです。サイズが常に変化するようなデータを扱うことを想定しているとも言えます。これにより、どんなに大きなデータセットに対しても、非常に複雑なクエリを実行することが可能です。しかし、1 台のデータベースサーバーで複数のユーザーからのデータを処理することによる潜在的な影響は、大幅に増大する可能性があります。
Elasticsearch のユーザー
Google、Oracle、Microsoft などの大手テクノロジー企業や、その他の多くの有名企業を含む何千ものトップ企業が、オンラインとオフラインの両方のデータに Elasticsearch を使用しています。
しかし、構造化データのインデックスを作成する簡単な方法を知るために、テクノロジーの巨人になる必要はありません。Elasticsearch の存在を知り、どのように機能するかを理解すればいいのです。
Elasticsearch の用途
Elasticsearch は、次のような幅広いユースケースに対応します。
- ロギングとログ解析:Elasticsearch を中心とした補完的なオープンソースソフトウェアやプラットフォームで構築されたエコシステムにより、ロギングソリューションの実装と拡張が最も容易なものの 1 つになりました。
- パブリックデータの抽出と結合:Elasticsearch は、複数の異なるデータソースを取り込み、その全てを管理して検索が可能な状態に保つことができる柔軟性を備えています。
- 全文検索:Elasticsearch はドキュメント指向のデータベースで、ドキュメントを格納してインデックスを作成します。インデックス作成では、ドキュメントを作成、更新します。インデックス作成が完了すると、全文検索、ソート、およびフィルタリングが可能になります。この点で行指向のデータベースと異なります。
- イベントデータとメトリクス:Elasticsearch は、メトリクスやアプリケーションイベントなどの時系列データにも極めて有効で あることが知られています。どの技術を使用していても、Elasticsearch は一般的なアプリケーションのデータを簡単に取得するために必要なコンポーネントが用意されています。まれにコンポーネントがないこともありますが、その機能の追加は非常に簡単です。
Elasticsearch のアーキテクチャの主要コンポーネント
Spark Elasticsearch の仕組みや使用するタイミング、使用しないタイミングを理解するには、まず、Elasticsearch アーキテクチャの背後にあるインフラを理解する必要があります。Elasticsearch の主要コンポーネントには、Elasticsearch クラスタ、Elasticsearch ノード、ポート番号 9200 および 9300、Elasticsearch シャード、Elasticsearch レプリカ、Elasticsearch アナライザ、Elasticsearch ドキュメントがあります。
Elasticsearch クラスタ
Elasticsearch クラスタは、相互に接続されたコンピューティングノードの集合であり、全てのノードがクラスタデータの異なる部分を保存します。ユーザーは、コンフィグレーションフォルダにある「elasticsearch.yml」ファイルを変更することで、各クラスタの実行ノード数を調整できます。実行するクラスタの数はいくつでも良いですが、多くのユーザーは 1 ノードで十分な結果を得られると考えています。
Elasticsearch ノード
Elasticsearch ノードは、データベースの検索、インデックス作成、スケーリングにあわせて調整されたコンピューティングリソースです。Elasticsearch は分散データベースであるため、信頼できる唯一の情報源(SSOT)として全てのデータを保持する Elasticsearch データノードを使用します。クラスタ内の各ノードは、異なる名前を使 用します。通常、Elasticsearch ノードには、各インデックスに約 1,000 万から 5,000 万のドキュメントが格納されています。
ポート番号 9200 および 9300
Elasticsearch シャードでは、2 種類のポートが利用可能です。2 つのシャードポートのうち、1 つ目は常に開かれており、2 つ目は Elasticsearch のインデックス作成時とクラスタ初期化時にのみ開かれます。9200 はプライマリシャードに使用するデフォルトのポートで、9300 はそのレプリカに使用するデフォルトのポートです。
Elasticsearch シャード
Elasticsearch シャードは、1 つのインデックスに Kibana インデックスを集めたものです。Elasticsearch には、Elasticsearch ドキュメント(doc)と Elasticsearch インデックスの 2 種類のインデックスがあります。ドキュメントは、識別子とインデックスで一意に紐づけられます。
Elasticsearch レプリカ
Elasticsearch レプリカは、シャードのコピーです。全ての変更はレプリカに反映されますが、クライアントに対しては透過性が保たれます。レプリカは、新しいデータが追加されたときや、削除、更新、修正されたときに自動的に更新されます。
Elasticsearch アナライザ
Elasticsearch アナライザは Elasticsearch クラスタの一部で、データベースからデータをフェッチし、分析を行うものです。これにより、ユーザーに返されたデータのフィルタリングやソートが可能になります。
Elasticsearch ドキュメント
Elasticsearch ドキュメントは、Elasticsearch の主要なインデックスタイプです。各ドキュメントはデータセット内の ID として作成され、ドキュメントのタイプごとに 1 つの列を持ちます。Elasticsearch のドキュメント ID の簡単な例としては、{doc id} があります。一般的に、Elasticsearch クラスタの各ドキュメントは、シャード ID、名前、および全てのフィールドがシャード全体に係る識別子を持つインデックスの配列を持っています。
Elasticsearch の仕組み
簡潔に言うと、Elasticsearch は、データを取得してクラスタ内の全ノードに公開し、現在の保存データ量に基づいてデータをスケーリングするという仕組みです。Elasticsearch の利点は、インデックスを用いて全てのデータを 1 つのデータベースに格納できることです。
Elasticsearch はドキュメント指向の RESTful な検索エンジンであるため、さまざまな便利なツールを備えており、大規模でそれ以外の方法では困難なデータでも扱うことができます。さらに、別のツールに加えて補完的に使用することも可能です。例として、Elasticsearch と Spark の組み合わせが挙げられます。
Elasticsearch クエリの例
例えば、「Telecommunications」という単語を検索したい場合、次のような簡単な検索構文で動作します。
$"Telecommunications"
Elasticsearch はドキュメントから動作するため、単純にドキュメントのリストを検索することはできません。そのため、”document type” を指定する必要があります。ここでは「type:Telecommunications」というフレーズを使って、検索条件を満たすドキュメントのみを取得するようにします。
このクエリを行うために、クエリパラメータとしてドキュメント ID を渡します。
$"type:telecommunications"
これをさらにテストするために、次のように実行して簡単なサンプルドキュメントを作成することも可能です。
create index:type:telecommunications create partition:type:telecommunications --data-urlencode /tasks --data-urlencode tasks/
Elasticsearch が使用するデータベースの種類
Lucene のインデックス構築と堅牢な分散データベースモデルを組み合わせることにより、Elasticsearch ツールはデータセットをシャードと呼ばれる小さなコンポーネントに分割し、さまざまなノードに分散させることができます。
Elasticsearch のデータ保存場所
Elasticsearch に格納されるデータは、JSON 形式または CSV 形式です。全てのインデックスには、格納されるドキュメント用の独自のテンプレートがあります。インデックスは、メッセージバスを用いてレプリカと通信することで完全に複製されます。ログファイルは、Elasticsearch のインデックスとして書き込まれます。
これらのドキュメントは、Key-Value ペアの配列として「memcached set」と呼ばれるデータ構造に格納されます。memcached set は軽量、低メモリ、スケーラブルなデータ構造で、大容量のメモリを持つデータを保持して処理する能力を備えています。
Elasticsearch のストレージは、取り込み、インデックス作成、検索操作に最適化されており、一定間隔でディスクにファイルが書き込まれます。インデックスのサイズを変更するには、最後に挿入されたドキュメントを削除し、新しいドキュメントに置き換えるしかありません。この作業は「データ移行」と呼ばれ、新しいインデックスから新しいドキュメントを作成 して更新した後、再度挿入することを指します。
Elasticsearch アグリゲーション
Elasticsearch アグリゲーションとは、同じクラスタを複数のエンドポイントに割り当てることです。本番クラスタのパフォーマンスに影響を与えることなく、追加のデータや機能に同じ Elasticsearch クラスタを使用できる強力な機能です。
クラスタを集約する際、各ノードには 3 種類のワークロードのうち、1 つが割り当てられます。ワークロードの種類は、次のとおりです。
- 非リレーショナル
- オンライントランザクション処理(OLTP:Online Transaction Processing)
- オンライン分析処理(OLAP:Online Analytical Processing)
非リレーショナル
Elasticsearch が生成する全てのネットワークリクエストは、Elasticsearch クラスタに対して実行されているクエリによって生成されます。
Elasticsearch ノードがアイドル状態の場合、バックグラウンドスレッドでクエリを実行し、その結果を継続的にレポートするのはオペレーティングシステムが担います。Elasticsearch ノードが使用されている場合は、フェイルオーバーメカニズムに参加する(ノード故障の場合)か、クエリ要求を複数の他のノードに渡し(ノード過負荷の場合)、他のノードの 1 つが解放されるまで待機します。
Elasticsearch によって発生するネットワークトラフィックは、関連データのクエリが最も一般的ですが、Elasticsearch を活用できる場面は他にもたくさんあります。
OLTP
前述のとおり、Elasticsearch が生成する全てのネットワークリクエストは、Elasticsearch クラスタに対して実行されてい るクエリによって生成されます。
大規模なシステムでは全ての Elasticsearch クラスタに対して実行されますが、Elasticsearch をリレーショナルデータソースと組み合わせることが望ましい場合もあります。この場合、Elasticsearch はセカンダリリレーショナルデータソースに対して処理を実行し、実行したクエリの一部のみを記録します。このシナリオでは、各ノードにはセカンダリソースが 1 つだけ割り当てられ、もう 1 つはアイドル状態のままです。
OLAP
Elasticsearch アグリゲーションと通常のアグリゲーションの主な違いは、他のアグリゲーションが同じ Elasticsearch クラスタを複数の目的で使用できるのに対し、Elasticsearch アグリゲーションではセカンダリデータソースを使用して集約データを保存・処理する点です。これにより、Elasticsearch アグリゲーションは、SQL や NoSQL データセットのようなプライマリデータセットに追加のクエリを作成することなく、より多くのデータを格納できます。
Elasticsearch のインストール方法と使用方法
Elasticsearch のインストールは、とても簡単です。Elasticsearch のデフォルトリポジトリを使用し、Elasticsearch のデフォルト環境を設定することも可能です。
Elasticsearch は、Kibana.yml という設定ファイルを使用します。必要に応じてファイルを変更でき、InfluxDB や Logstash などの一般的な Elasticsearch のプラグインを利用することも可能です。
Elasticsearch のインストール手順
- Elasticsearch 開発バージョンとサーバーをインストールし、依存関係をインストールします。
- Java 用の BOSH 拡張機能をインストールします。BOSH 拡張機能は、データ操作ツールとしてだけでなく、Elasticsearch 用の HTML テンプレートを作成して、人間がデータにアクセスしやすく、読みやすくするのに役立ちます。BOSH 拡張機能には、Java ランタイムが必要です。OS の Java 用デフォルトリポジトリを使用してインストールできます。
- Elasticsearch を起動します。
- BOSH 用 Java プラグインをインストールします。
- これで完了です。Elasticsearch はマシン上で稼働し、読みやすい方法で全てのデータにアクセスできるようになりました。
Elasticsearch のデータ可視化
Elasticsearch では、シンプルな API を介してあらゆる種類のデータの検索、フィルタリングが可能です。RESTful API であるため、データ分析だけでなく、Web ベースのアプリケーションの運用環境でも使用できます。現在、Elasticsearch にはファセット検索というデータの集計を計算できる機能が含まれています。最も関連性の高い機能の一部を以下に示します。
- スケーラブルな検索ソリューションの提供
- ニアリアルタイム検索の実行
- マルチテナントのサポートの提供
- バックアッププロセスを合理化し、データの整合性を確保
- サーバークラッシュ時のインデックスのリカバリ
- JSON および Java アプリケーションプログラムインターフェイス(API)を使用
- JSON ドキュメントのインデックスを自動的に作成
- インデックス作成に一意の型レベル識別子を使用
- 各インデックスに独自の設定が可能
- Lucene ベースのクエリ文字列を使用した検索が可能
SQL ではなく Elasticsearch を使用する理 由
Elasticsearch サービスは、大量のデータを迅速かつ効率的に処理することにおいて、ほとんどの SQL 対応サービスよりも格段に優れているため、最も広く採用されている強力かつ有用な検索技術です。
Elasticsearch はエンタープライズサーチのために開発され、データ分析に依存するビジネスに強力な機能と使いやすいツールを提供します。そのため、より少ないリソースでデータのバッチを保存、検索、分析するためのより実用的で柔軟な方法を提供します。
Elasticsearch のバージョンの確認方法
実行中の Elasticsearch のバージョンを確認するには、2 つの方法があります。1 つ目は、Elasticsearch のコンソールを起動してログインし、ソフトウェアのバージョンを確認する方法です。2 つ目は、Elasticsearch の公式ドキュメントを確認する方法です。
Elasticsearch の代替ソフトウェア
使用するソフトウェアを検討する際には、Elasticsearch の代替品として考慮すべき 3 つの選択肢があります。
AWS
Amazon Web Services(AWS)は、スタートアップ企業や最先端の研究機関、コンピューティングインフラの強化を目指す大企業にとって最高のコンピューティングプラットフォームです。AWS は、顧客が独自の仮想サーバーを構築して使用できる技術と、業界で最も幅広いクラウドコンピューティングサービスを提供し、Microsoft の Azure と Google の Google Cloud Platform(GCP)の間のいわゆる「クラウド戦争」の原動力となっています。
Solr
Apache Solr は、Java で書かれた BSD ライセンスを採用したオープンソースの検索・分析エンジンデーモンで、最も人気のあるオープン ソース検索エンジンの 1 つです。実際、Solr は Twitter、Yahoo、Amazon、eBay、eBay Enterprise などの世界最大級の e コマースサイトやソーシャルメディアプラットフォームの多くで利用されています。
Solr は分散アーキテクチャを採用しており、高速な検索を実現します。また、独自の Unified Storage API を備えており、企業で使用されているほぼ全てのストレージ機構と検索エンジンをシームレスに統合することが可能です。
ArangoDB
ArangoDB は分散型の NoSQL ドキュメント指向データベースで、強力なデータ分析処理と使いやすさで人気があります。ArangoDB の Key-Value ストア上で動作する SQL ライクな言語で、ユーザーはリレーショナルデータベースと同じようにテーブル、結合、クエリを作成できます。
ArangoDB は、全てのコードを最新の状態に保つことに優れており、サポートページも適切に設計されています。プロジェクトが成熟し、より多くの人々が貢献するようになれば、サポートページは常に最新の情報が更新されて見やすくなるでしょう。もちろん、Python や Javascript などの主要なプログラミング言語にも対応しています。
Elasticsearch ツールのベスト 3
データを最大限に活用するためには、Elasticsearch を他のツールやソフトウェア、特に Hevo Data、Logstash、Apache Nifi と組み合わせて使用することをお勧めします。
Hevo Data
Hevo Data Elasticsearch は、Elasticsearch のデータを取り込み、クエリに変換し、クラスタノード上でイベントログとして実行するように設計された、無料でオープンソースの分散型検索エンジンです。Hevo Data Elasticsearch では、バックアップデー タだけでなく、リアルタイムデータに対してもリアルタイムに分析クエリを実行できます。
Logstash
Logstash は、Elasticsearch のツールです。Elasticsearch によって抽出されたデータをすぐに管理するためのルールを定義できます。取得したデータを即座に処理することで、Logstash はデータを最大限に活用するのに最適な分析・可視化ツールを提供します。
Apache NiFi
Apache Nifi は、Facebook の Core Location API や Twitter の REST API、さらには Yelp の In-App Feature API といった人気の高いオープンソース API を含むライブラリセットで、複数のデータソース間の「ディープリンク」を可能にします。Apache NiFi を使用すると、ユーザーは独自の API をリンクさせ、データセットの全情報を他のさまざまなソフトウェアで利用できるようになります。
Elasticsearch を検討している方へ
Elasticsearch の機能、インフラ、アーキテクチャについて解説しました。そのうえで、ビジネスにとって理想的なツールであるかどうかをご判断ください。