top bar

글 목록

2015년 9월 3일 목요일

[Elasticsearch] Logstash를 이용한 bulk 데이터 인덱싱

들어가며..



이전 포스트에서 Logstash와 Elasticsearch를 연동하여 인덱싱하는 방법을 살펴보았다. 참고

오늘은 bulk format의 데이터를 Logstash를 이용해 인덱싱하는 방법을 정리하겠다. 하지만 기본적으로 Logstash는 bulk format을 처리하지 못한다. 왜 그런지 아래 예제를 보며 살펴보겠다.

일단 로그스태쉬 configuration은 아래와 같이 작성한다.
input {
        file {
                codec => json
                path => "/home/asuraiv/logstash_data/*.json"
        }
}

output {
        elasticsearch {
                host => "localhost"
                index => "school"
                index_type => "students"
                protocol => "http"
                template_name => "school"
        }
        stdout {
                codec => rubydebug {
                        metadata => true
                }
        }
}
input plugin은 'file'을 사용하였다. 'path' 값으로 설정된 경로안에 json 확장자 파일이 저장되면 Logstash의 file input plugin이 자동으로 그 파일을 읽어 output으로 보내준다.

아래와 같은 bulk format을 저장하여 인덱싱을 시도해보자
{ "index" : { "_index" : "school", "_type" : "students", "_id" : "1" }}
{ "address" : "newyork", "name" : "james", "class" : "A" }
하지만 결과는 아래와 같다
{
         "index" => {
        "_index" => "school",
         "_type" => "students",
           "_id" => "1"
    },
      "@version" => "1",
    "@timestamp" => "2015-09-03T08:03:14.064Z",
          "host" => "cweb02.ami",
          "path" => "/home1/irteam/logstash_data/data.json",
     "@metadata" => {
        "retry_count" => 0
    }
}
{
       "address" => "los engeles",
          "name" => "kim",
         "class" => "C",
      "@version" => "1",
    "@timestamp" => "2015-09-03T08:03:14.065Z",
          "host" => "cweb02.ami",
          "path" => "/home1/irteam/logstash_data/data.json",
     "@metadata" => {
        "retry_count" => 0
    }
}
원래 bulk format은 첫번째줄이 meta정보, 두번째줄이 source 데이터이다. 따라서 2줄이 하나의 event로 인식되야 하는것인데 지금은 각 라인이 서로 다른 event로 인식되어 따로따로 인덱싱이 되었다.

bulk format에서 첫째줄 메타정보에 인덱싱을 수행할 인덱스, 타입, id값등을 설정할 수 있지만 위와같은 결과가 나오면 이 메타정보가 아무 소용이 없다. 두번째 줄의 데이터가 인덱싱이 된것도 Logstash configuration에 'index'와 'index_type'이 명시되어있기 때문에 정상적으로 인덱싱이 된것이다.

따라서 bulk format을 정상적으로 인지하면서, 메타정보에 맞게 유동적으로 index, type, id등을 설정하여 인덱싱을 하려면 어떻게 해야할까?

es_bulk codec



input 단계에서 bulk format을 파싱하여 메타데이터와 source데이터를 하나의 이벤트로 묶어주는 codec이 있다.

Logstash 설치 폴더의 'bin' 에서 아래와 같은 명령어로 설치가 가능하다 (Logstash 1.4+)
$ ./plugin install logstash-codec-es_bulk
그리고 configuration 파일의 input 설정부분에 아래와 같이 작성한다
input {
        file {
                path => "/home/asuraiv/logstash_data/*.json"
                codec => es_bulk {
                }
        }
}
위의 하이라이트된 설정을 추가한다. es_bulk 코덱안에는 별다른 설정이 없는 그냥 비어있는 중괄호 { } 이다.

이 코덱을 적용하면 bulk format의 메타데이터 부분은 '@metadata' 로 넣어주고, filter나 output plugin에서 "{[@metadata][_index]}" 와 같은 방식으로 접근할 수 있다. 따라서, output pulgin을 아래와 같이 작성하면 bulk format에 메타데이터에 따라 유동적으로 인덱싱할 인덱스, 타입, id를 지정할 수 있다
elasticsearch {
        host => "localhost"
        index => "%{[@metadata][_index]}"
        index_type => "%{[@metadata][_type]}"
        document_id => "%{[@metadata][_id]}"
        protocol => "http"
        template_name => "school"
}



댓글 없음:

댓글 쓰기