0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ELK Stack(執筆中)

Posted at

はじめに

会社の取り組みでELK Stackについて触れる機会があったのでその時のメモ

ELK Stackとは

・Elasticsearch
・Logstash
・Kibana
の3つのオープンソースプロジェクトからなるスタック

Elasticsearchとは

Elasticsearchは、分散型で無料かつオープンな検索・分析エンジンです。テキスト、数値、地理空間情報を含むあらゆる種類のデータに、そして構造化データと非構造化データの双方に対応しています。

様々なデータを検索、分析できるソフトウェア

Logstashとは

Logstash は、軽量でオープンソースのサーバー側データ処理パイプラインです。さまざまなソースからデータを収集し、その場で変換して目的の宛先に送信できます。

いろいろなところから収集したデータを整形し転送できるソフトウェア
Elasticsearchとのデータパイプラインとしてよく利用される。

Kibanaとは

Kibana は、ログと時系列の分析、アプリケーションのモニタリング、オペレーショナルインテリジェンスのユースケースに使われる、オープンソースのデータの視覚化および調査ツールです。ヒストグラム、線グラフ、円グラフ、ヒートマップ、組み込み型の地理空間のサポートなど、強力で使いやすい機能を提供します。

検索・分析したデータをいい感じに可視化してくれるソフトウェア

Elasticsearch用語

単語 説明
ノード 1つのサーバのこと
クラスタ ノードの集合体のこと
インデックス データベース
タイプ テーブル
ドキュメント レコード

とりあえず触ってみる

githubにdocker-elkというプロジェクトがすでにあったのでそちらを使います。
PCにdockerとdocker-composeが事前にインストールされている必要があります。

適当に作業ディレクトリを作成&移動

mkdir elk
cd elk

プロジェクトをcloneして起動

git clone https://github.com/deviantony/docker-elk.git
cd docker-elk
docker-compose up

にアクセスするとKibanaのログイン画面が表示されます。

スクリーンショット 2021-01-28 15.22.09.png

ID: elastic
PW: changeme

ログインするとこのような画面が表示され、データを投入するように促されます。
今回はKibanaの公式サイトにあるチュートリアルを参考にデータの投入を行うので「Explore on my own」をクリックします。

スクリーンショット 2021-01-28 15.25.24.png

「Add data」をクリックするとすでに公式が用意しているサンプルデータの一覧が出てきます。
このサンプルデータを使うこともできるみたいです。

スクリーンショット 2021-01-28 15.27.44.png

サンプルデータの読み込み

公式のサイトのチュートリアルを元に進めます。

リンク先にあるデータをダウンロードし適当なディレクトリに移動しておきます。
また、accounts.zipとlogs.jsonl.gzは解凍しておきましょう。

unzip accounts.zip
gunzip logs.jsonl.gz

各データの型は以下のように定義されています。

shakespeare.jsonのデータ型
{
    "line_id": INT,
    "play_name": "String",
    "speech_number": INT,
    "line_number": "String",
    "speaker": "String",
    "text_entry": "String",
}
accounts.jsonのデータ型
{
    "account_number": INT,
    "balance": INT,
    "firstname": "String",
    "lastname": "String",
    "age": INT,
    "gender": "M or F",
    "address": "String",
    "employer": "String",
    "email": "String",
    "city": "String",
    "state": "String"
}

logs.jsonlは様々なデータがありますが、今回のチュートリアルで使用する主なデータの型は以下です。

logs.jsonlのデータ型(抜粋)
{
    "memory": INT,
    "geo.coordinates": "geo_point"
    "@timestamp": "date"
}

マッピング

shakespeare.jsonとlogs.jsonlはデータを読み込む前にフィールドのマッピングを行う必要があります。
マッピングを行い各フィールドの特性を定義します。
・どのフィールドに数字、日付、または地理的位置情報が含まれるか
・日付の形式
などです。RDBのカラム定義のような感じです。

サンプルのcurlでは認証情報がないので「elastic:changeme」(user:pass)を追加しています。

またバージョンの問題で
_default_→削除
string→text
not_analyzed→false
に変換しています。

$ curl -u elastic:changeme -H 'Content-Type: application/json' -XPUT http://localhost:9200/shakespeare -d '
{
 "mappings" : {
   "properties" : {
    "speaker" : {"type": "text", "index" : false},
    "play_name" : {"type": "text", "index" : false },
    "line_id" : { "type" : "integer" },
    "speech_number" : { "type" : "integer" }
   }
  }
}
';

$ {"acknowledged":true,"shards_acknowledged":true,"index":"shakespeare"}% 

・speakerフィールドとplay_nameフィールドは分析されないフィールドになります。

geo_point​タイプをログのフィールドに適用して、ログ内の緯度/経度ペアを地理的位置としてラベル付けするマッピングが必要です。

$ curl -u elastic:changeme -H 'Content-Type: application/json' -XPUT http://localhost:9200/logstash-2015.05.18 -d '
{
  "mappings": {
    "properties": {
      "coordinates": {
        "type": "geo_point"
      }
    }
  }
}
';

$ {"acknowledged":true,"shards_acknowledged":true,"index":"logstash-2015.05.18"}% 
$ curl -u elastic:changeme -H 'Content-Type: application/json' -XPUT http://localhost:9200/logstash-2015.05.19 -d '
{
  "mappings": {
    "properties": {
      "coordinates": {
        "type": "geo_point"
      }
    }
  }
}
';

$ {"acknowledged":true,"shards_acknowledged":true,"index":"logstash-2015.05.19"}% 
$ curl -u elastic:changeme -H 'Content-Type: application/json' -XPUT http://localhost:9200/logstash-2015.05.20 -d '
{
  "mappings": {
    "properties": {
      "coordinates": {
        "type": "geo_point"
      }
    }
  }
}
';

$ {"acknowledged":true,"shards_acknowledged":true,"index":"logstash-2015.05.20"}% 

accounts.jsonはマッピングを行う必要はありません。

ドキュメント(レコード)の投入

Bulk APIを利用することで大量のドキュメントをまとめて登録することが出来ます。

$ curl -u elastic:changeme -H 'Content-Type: application/x-ndjson' -XPOST 'localhost:9200/bank/account/_bulk?pretty' --data-binary @accounts.json
$ curl -u elastic:changeme -H 'Content-Type: application/x-ndjson' -XPOST 'localhost:9200/shakespeare/_bulk?pretty' --data-binary @shakespeare.json
$ curl -u elastic:changeme -H 'Content-Type: application/x-ndjson' -XPOST 'localhost:9200/_bulk?pretty' --data-binary @logs.jsonl

上記コマンドを入力した際、shakespeare.jsonとlogs.jsonlのデータ投入でエラーが発生しました。
どうやら処理出来るデータ量の何らかの値が上回っているためエラーになっているようです。少し調べてみたのですが、根本的な解決方法がわからないため、今回はjsonの中身を一部削除しファイル容量を減らした状態で登録を行いました。
おそらくelasticsearch.ymlなどに設定を記載することになると思うのです・・・分かる方居たらコメントで教えてください。

{
  "error" : {
    "root_cause" : [
      {
        "type" : "es_rejected_execution_exception",
        "reason" : "rejected execution of coordinating operation [coordinating_and_primary_bytes=0, replica_bytes=0, all_bytes=0, coordinating_operation_bytes=37723053, max_coordinating_and_primary_bytes=26843545]"
      }
    ],
    "type" : "es_rejected_execution_exception",
    "reason" : "rejected execution of coordinating operation [coordinating_and_primary_bytes=0, replica_bytes=0, all_bytes=0, coordinating_operation_bytes=37723053, max_coordinating_and_primary_bytes=26843545]"
  },
  "status" : 429
}

Index Patternの作成

参考

https://aws.amazon.com/jp/elasticsearch-service/the-elk-stack/
https://aws.amazon.com/jp/elasticsearch-service/the-elk-stack/logstash/
https://aws.amazon.com/jp/elasticsearch-service/the-elk-stack/kibana/

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?