Elasticsearch を使用する

Prev Next

VPC環境で利用できます。

Elasticsearchは、非定型データを JSON構造で保存し、検索に特化したデータストレージです。REST APIを使用してクエリできます。

Elasticsearchアプリの詳細情報を確認

アプリの作成が完了すると、詳細情報を確認できます。アプリの詳細情報の StatusStableの場合、アプリが正常に起動されたことを意味します。
アプリの詳細情報を確認する方法は、次の通りです。

  1. NAVERクラウドプラットフォームコンソールの VPC環境で、i_menu > Services > Big Data & Analytics > Data Forestメニューを順にクリックします。
  2. 左側の Data Forest > Appsメニューをクリックします。
  3. アプリを所有するアカウントを選択します。
  4. 詳細情報を確認するアプリをクリックします。
  5. アプリの詳細情報を確認します。
    df-es_2-1_updated_ko
    • Quick links
      • elasticsearch.hosts: Elasticsearch REST APIアドレス(外部ネットワーク)
      • shell-es-coord-0: コーディネーターノードのウェブシェル URL
      • supervisor-es-ingest-0: インジェストノードプロセスを管理できる supervisor URL。このノードはデフォルト値の0個が作成されるため、別に指定しない場合はアクセス不可
      • shell-es-master-0: マスターノードのウェブシェル URL
      • supervisor-es-coord-0: コーディネーターノードプロセスを管理できる supervisor URL
      • supervisor-es-data-0: データノードプロセスを管理できる supervisor URL
      • shell-es-data-0: データノードのウェブシェル URL
      • shell-es-ingest-0: インジェストノードのウェブシェル URL。このノードはデフォルト値の0個が作成されるため、別に指定しない場合はアクセス不可
      • supervisor-es-master-0: マスターノードプロセスを管理できる supervisor URL
    • Connection String
      • elasticsearch.hosts.inside-of-cluster: Elasticsearch REST APIアドレス(内部ネットワーク)
    • コンポーネント: デフォルトで指定された値が推奨リソースです。
      • es-master: esサーバでマスターのロールを実行するコンポーネント
      • es-data: esサーバでデータを保存するロールを実行するコンポーネント
      • es-ingest: esサーバでインジェストパイプラインのロールを実行するコンポーネント
      • es-coord: esサーバでコーディネーターノードのロールを実行するコンポーネント

REST APIアドレスリスト

Elasticsearchの HTTP REST APIアドレスは2つあります。状況に応じて適切な APIアドレスを使用します。

  • elasticsearch.hosts: Data Forest外部ネットワークから Elasticsearchにアクセスする際に使用します。
  • elasticsearch.hosts.inside-of-cluster: Data Forestアプリから Elasticsearchにアクセスする際に使用します。例) Kibanaで Elasticsearchと連携時
状況 使用するアドレス
Kibanaアプリから Elasticsearchアプリにアクセスする場合 elasticsearch.hosts.inside-of-cluster
Devアプリで構築した開発環境から Elasticsearchアプリにアクセスする場合 elasticsearch.hosts.inside-of-cluster
自分のサーバで実行される Logstash elasticsearch.hosts
Data Forest以外のサーバで実行する curl elasticsearch.hosts
参考

elasticsearch.hostsアドレスは HTTPプロキシサーバです。elasticsearch.hosts.inside-of-clusterを使用できる環境であれば、HTTPプロキシサーバを使用するより elasticsearch.hosts.inside-of-clusterを使用することをお勧めします。

Elasticsearchアプリコンテナ数の変更

コンテナ数を調整する方法は、次の通りです。

  1. NAVERクラウドプラットフォームコンソールの VPC環境で、i_menu > Services > Big Data & Analytics > Data Forestメニューを順にクリックします。
  2. 左側の Data Forest > Appsメニューをクリックします。
  3. アプリを所有するアカウントを選択します。
  4. 詳細情報を確認するアプリをクリックし、[Flex] ボタンをクリックします。
  5. Flexの変更画面が表示されたら、コンテナ数を修正して [修正] ボタンをクリックします。
    df-es_4-1_vpc_updated_ko
参考
  • es-masterと es-dataコンポーネントは Flex機能をサポートしません。他のコンポーネントは自由に Flexできます。

Elasticsearchアプリ使用時の注意事項

ノード障害

Elasticsearchアプリは、1つの物理的なノードに1つのデータノードのみ起動します。そのため、replica=1の場合、1つのデータノードに障害が発生してもデータは消失しません(replica=1は、ソース1 + replica 1という意味)。 es-dataは、最低2台必要です。

参考
  • Elasticsearch 7.3のデフォルト値は shard 1つ、replica 1つです。Index settings、または Index creation no longer defaults to five shardsをご参照ください。
  • Elasticsearch 6.7のデフォルト値は shard 5つ、replica 1つです。

Out of Memory

Elasticsearchアプリの作成時、必要なリソース(resource/memory)を指定します。指定されたメモリより多くのメモリを使用する場合、OSの Out of Memory(OOM) Killerが Elasticsearchプロセスを終了させます。supervisorで Elasticsearchプロセスを管理しているため、OOMによりプロセスが終了すると、supervisorが Elasticsearchプロセスを再実行することになりますが、OOMが発生した場合、再び OOMが発生する可能性が高いです。
このような状況が発生した場合、Elasticsearchコンテナ数を増やした後、shardを分割して個々のノードの負荷を減少させるか、コンテナのリソースを増加させる必要があります。ただし、既に実行中の Elasticsearchアプリリソースは変更できません。リソースを変更したい場合、メモリを増加させた Elasticsearchアプリを作成し直し、repository-hdfsを参照して HDFSにバックアップしてから復旧するか、Reindex from remote機能を使用してインデックスを新しい Elasticsearchアプリに移行できます。

Elasticsearchプロセスが OOMにより終了した後、再起動されたかを確認する方法は、次の通りです。

  • cerebroでノードの uptime情報を確認します。他のノードに比べて uptimeが短い場合、Elasticsearchプロセスが再起動した可能性が高いです。
  • このノードの supervisord.logをご確認ください。(ログ/設定を確認する)ログに以下のような内容がある場合、OOMにより Elasticsearchプロセスが再起動された可能性が高いです。
    # SIGKILLで Elasticsearchプロセスが終了
    2020-04-22 14:44:35,390 INFO exited: elasticsearch (terminated by SIGKILL; not expected)
    
    # supervisorが Elasticsearchを再実行
    2020-04-22 14:44:36,395 INFO spawned: 'elasticsearch' with pid 508
    2020-04-22 14:44:37,396 INFO success: elasticsearch entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
    

supervisorのログは Elasticsearchプロセスが SIGKILLにより終了したことを意味しますが、SIGKILLが発生した理由は不明です。OOM Killerは SIGKILLを使用しているため、OOM Killerにより終了したものと思われます。

  • dmesgコマンドで OOMの発生有無を確認できます。

    [magnum@ac3m8x2240.bdp ~]$ dmesg
    
    ...
    [13460863.662062] elasticsearch[e invoked oom-killer: gfp_mask=0x50, order=0, oom_score_adj=1000
    [13460863.662066] elasticsearch[e cpuset=aceca4b30ed9b4af3b3fab0ada711021f05dfecf68ebfdcfcdaa54a0ab516842 mems_allowed=0-1
    [13460863.662069] CPU: 14 PID: 27043 Comm: elasticsearch[e Not tainted 3.10.0-862.14.4.el7.x86_64 #1
    [13460863.662071] Hardware name: HPE ProLiant DL380 Gen10/ProLiant DL380 Gen10, BIOS U30 09/12/2019
    [13460863.662072] Call Trace:
    [13460863.662080]  [<ffffffffb7f13754>] dump_stack+0x19/0x1b
    [13460863.662085]  [<ffffffffb7f0e91f>] dump_header+0x90/0x229
    [13460863.662091]  [<ffffffffb799a7e6>] ? find_lock_task_mm+0x56/0xc0
    [13460863.662096]  [<ffffffffb7a0f678>] ? try_get_mem_cgroup_from_mm+0x28/0x60
    [13460863.662098]  [<ffffffffb799ac94>] oom_kill_process+0x254/0x3d0
    [13460863.662101]  [<ffffffffb7a13486>] mem_cgroup_oom_synchronize+0x546/0x570
    [13460863.662103]  [<ffffffffb7a12900>] ? mem_cgroup_charge_common+0xc0/0xc0
    [13460863.662105]  [<ffffffffb799b524>] pagefault_out_of_memory+0x14/0x90
    [13460863.662108]  [<ffffffffb7f0cac1>] mm_fault_error+0x6a/0x157
    [13460863.662112]  [<ffffffffb7f20846>] __do_page_fault+0x496/0x4f0
    [13460863.662113]  [<ffffffffb7f208d5>] do_page_fault+0x35/0x90
    [13460863.662115]  [<ffffffffb7f1c758>] page_fault+0x28/0x30
    [13460863.662118] Task in /yarn/container_e62_1584425817444_92362_01_000002/aceca4b30ed9b4af3b3fab0ada711021f05dfecf68ebfdcfcdaa54a0ab516842 killed as a result of limit of /yarn/container_e62_1584425817444_92362_01_000002/aceca4b30ed9b4af3b3fab0ada711021f05dfecf68ebfdcfcdaa54a0ab516842
    [13460863.662121] memory: usage 2097152kB, limit 2097152kB, failcnt 1448215
    [13460863.662122] memory+swap: usage 2097152kB, limit 4194304kB, failcnt 0
    [13460863.662123] kmem: usage 0kB, limit 9007199254740988kB, failcnt 0
    [13460863.662124] Memory cgroup stats for /yarn/container_e62_1584425817444_92362_01_000002/aceca4b30ed9b4af3b3fab0ada711021f05dfecf68ebfdcfcdaa54a0ab516842: cache:332KB rss:2096820KB rss_huge:0KB mapped_file:320KB swap:0KB inactive_anon:546160KB active_anon:1550660KB inactive_file:8KB active_file:0KB unevictable:0KB
    [13460863.662138] [ pid ]   uid  tgid total_vm      rss nr_ptes swapents oom_score_adj name
    [13460863.662272] [25374] 20033 25374     3151       67      12        0             0 bash
    [13460863.662274] [25813] 20033 25813    29910     2391      62        0             0 supervisord
    [13460863.662276] [25818] 20033 25818   178152     1221      20        0             0 gotty
    [13460863.662279] [26644] 20033 26644     3184      108      12        0             0 bash
    [13460863.662282] [26703] 20033 26703   954936   519887    1130        0          1000 java
    [13460863.662285] Memory cgroup out of memory: Kill process 27043 (elasticsearch[e) score 1993 or sacrifice child
    [13460863.663561] Killed process 26703 (java) total-vm:3819744kB, anon-rss:2079548kB, file-rss:0kB, shmem-rss:0kB
    

データ保存

Elasticsearchアプリのデータは /home1/{USER} の下位に保存され、ユーザーがアプリを停止したり、別の問題によりアプリが終了した場合でもデータは削除されません。

以下のような特定の状況ではデータが消失する可能性があります。
停止したアプリをユーザーが削除(destroy)する場合にはデータが削除されます。停止したアプリを再起動すると、既存データが存在していたノードで起動され、データが復旧されます。ただし、これまで起動していたノードのリソースを他のタスクが占有したり、ノードが障害によって除外されている場合、yarn.service.placement-history.timeout.ms(デフォルト値: 1時間)以降には既存のノードで実行されず、別のノードで実行されます。そのため、yarn.service.placement-history.timeout.msで設定された時間以内に実行されなかった Elasticsearchアプリのデータは消失する恐れがあります。重要なデータの場合は、repository-hdfsを参照して HDFSにバックアップしてください。

参考

サービスに直接影響する場合は、できるだけ専用のキューで Elasticsearchアプリを実行してください。共用キューは複数のユーザーが一緒に使用するため、希望する時点に必要なリソースを確保できない場合があります。