logstash JDBC input plugin

상세한 내용은 도큐먼트 참고 : https://www.elastic.co/guide/en/logstash/5.2/plugins-inputs-jdbc.html
설명 : DB -> logstash 를 연동해주는 플러그인.
특이한 점 : 
- JDBC 드라이버 및 클래스 위치를 직접 지정해 주어야 한다.
- sql_last_value 값을 사용하여 추가적으로 생성되는 값을 업데이트 할 수 있다.  마지막 레코드의 특정 칼럼 값이나 마지막 작업 시간이 파일에 저장되어 logstash 수행시에 sql_last_value 변수 저장되어 statement에 사용될 수 있다. 
아쉬운점 : 
- 스케줄 지정 시 crontab 구문을 사용하는데, crontab 문법이 분/시/일/월/요일 방식으로 지정되기 때문에 초 단위 수행을 지정할 방법이 없다.(아직 찾지 못한 걸까?)
주의사항 : 페이징 작업 또는 레코드 업데이트시 stastement에 sql_last_value 조건을 주어야 한다. 처음에 알아서 변경분을 처리해 줄것을 기대하고 .... 삽질한 뒤 제대로 사용하게 되었다. 역시 도큐먼트를 읽고 또 읽는 작업은 중요하다.

주소 파라메터 및 설정 

input {
   jdbc {
        # JDBC driver 위치
        jdbc_driver_library => "/usr/share/java/mysql-connector-java-5.1.12.jar”

        # JDBC dricer class
        jdbc_driver_class => “com.mysql.jdbc.Driver”

        # db host & database
        jdbc_connection_string => "jdbc:mysql://{db_host}/{data_base}”

 # 한글 데이터 사용시

        # jdbc_connection_string => "jdbc:mysql://{db_host}/{data_base}?useUnicode=true&characterEncoding=utf8


        jdbc_pool_timeout => 3000
        jdbc_paging_enabled => true
        dbc_page_size => 100000
        jdbc_user => “{user}"
        jdbc_password => “{pass_word}”

        # 스케쥴 
        # linux crontab 문법을 따름
        # 매분 마다 실행 
        schedule => "* * * * *”
        # 데이터 트레킹을 위해 마지막 데이터 기록시 사용
        tracking_column_type => “numeric"

        # false 타임스탬프 사용, true 숫자 사용
        use_column_value => true

        # 트레킹에 사용할 컬럼
        tracking_column => id
        
        # 마지막 컬럼값 기록 여부, true시 0 또는 1970년 1월 1일 부터 시작된다.
        # clean_run => false
        
        # 인코딩
        charset => "UTF-8"
     
        # 쿼리
        # sql_last_value는 마지막 레코드 중 설정된 필드값(기본값 시간)
        # sql_last_value 사용해서 마지막 값만 가져올수 있도록 SQL 명령어를 짜야한다.
        statement => " SELECT id, name, c_date FROM elk_jdbc_test WHERE id > :sql_last_value "

 # sql_last_value 값 저장 경로. 기본값은 "~/.logstash_jdbc_last_run"
 last_run_metadata_path => “{last_run_path}"
    }
}

filter {

}

output {
     amazon_es {
          hosts => [“{host}"]
          region => "ap-northeast-1"
          index => "elk_jdbc_test"
     }
}



 카디날리티 집계(Cardinality Aggregation)?

엘라스틱서치 에서 제공하는 approximation aggregation으로 필드에서 고유한 값의 대략적인 개수를 계산한다.

 

HyperLogLog++(HLL) algorithm (확률적 자료구조 기반 알고리즘)

엘라스텍서치의 cardinality 는 HLL 알고리즘을 기반한다.

(wiki : https://en.wikipedia.org/wiki/HyperLogLog)


HLL 알고리즘의 특징 : 

  • 정확도(precision) 설정 가능
    단, 정확도를 올릴 수록, 메모리 사용량이 증가
  • cardinality가 낮은 집합일 수록 정확도가 높아진다.
  • 메모리 사용량이 고정적
  • 메모리 사용량은 정확도에 비례

정확도 설정

  • precision_threshold (0 ~ 40,000)
  • 일반적으로 cardinality가 precision 보다 적다면 거의 항상 100% 정확
  • 메모시 사용률 =  precision_threshold * 8 bytes

 그래프.1 threshold 에 따른 에러율 


 

성능 향상을 위한 방안

  • cardinality 대상 필드를 hash 로 정의한다.
  • 단 cardinality 가 크거나 string 인 경우만 효과적이다.

좀 더 자세히 


'생활데이타 > ElasticSearch' 카테고리의 다른 글

[logstash] JDBC input plugin  (0) 2017.03.31
[ElasticSearch] 검색/집계 (Aggregation)  (0) 2016.06.05


집계(aggregation) 

  • 검색 결과에 다양한 연산 적용
  • RDBMS 의 groupby 와 유사
  • 집계 종류에는 매트릭(metric), 버킷(bucket), 파이프라인(pipeline) 등이 있다.

0. 참고

본 포스트는 elastic search 버전 2.3 으로 작성되었습니다.
참고) https://www.elastic.co/

1. 종류

1) 매트릭 (metric)

  • 도큐먼트를 계산해서 처리된 값을 구한다.
  • 타입 리스트
    • Avg Aggregation
    • Cardinality Aggregation
    • Extended Stats Aggregation
    • Geo Bounds Aggregation
    • Geo Centroid Aggregation
    • Max Aggregation
    • Min Aggregation
    • Percentiles Aggregation
    • Percentile Ranks Aggregation
    • Scripted Metric Aggregation
    • Stats Aggregation
    • Sum Aggregation
    • Top hits Aggregation
    • Value Count Aggregation

2) 버킷 (bucket)

  • 조건에 해당하는 도큐먼트를 버킷이라는 저장소 단위로 구분해 담아 새로운 집합을 생성한다.
  • 타입 리스트
    • Children Aggregation
    • Date Histogram Aggregation
    • Date Range Aggregation
    • Filter Aggregation
    • Filters Aggregation
    • Geo Distance Aggregation
    • GeoHash grid Aggregation
    • Global Aggregation
    • Histogram Aggregation
    • IPv4 Range Aggregation
    • Missing Aggregation
    • Nested Aggregation
    • Range Aggregation
    • Reverse nested Aggregation
    • Sampler Aggregation
    • Significant Terms Aggregation
    • Terms Aggregation

3) 파이프라인 (pipeline)

  • 집계의 결과를 다른 집계에 활용한다.
  • 레벨에 따라 부모/자식 집계로 나뉜다.
  • buckets_path 지정 필수
  • 타입 리스트
    • Avg Bucket Aggregation

    • Derivative Aggregation

    • Max Bucket Aggregation

    • Min Bucket Aggregation

    • Sum Bucket Aggregation

    • Stats Bucket Aggregation

    • Extended Stats Bucket Aggregation

    • Percentiles Bucket Aggregation

    • Moving Average Aggregation

    • Cumulative Sum Aggregation

    • Bucket Script Aggregation

    • Bucket Selector Aggregation

    • Serial Differencing Aggregation

2. 매트릭 집계 구조

GET /{index_name}/_search?pretty

   "size": 0,

   "aggs": { // 집계 

      "my_aggs": { // 집계 명 (사용자 정의)

         "{metric_arrgs_type}": { // 집계 타입 

            "field": "{file_name}" // 집계 대상 필드

             "order" : { "{field_name}" : "desc" } // 정렬

         }

      }

   }


!!) 매트릭 집계중 카디날리티 집계(Cardinality Aggregation)은 근사 집계로 정확한 값이 대신 유사값을 구한다.

(카디날리티 집계(Cardinality Aggregation) 포스트 참고 )



3. 버킷 집계 구조

GET /{index_name}/_search?pretty

   "size": 0,

   "aggs": { // 집계 

      "my_aggs": { // 집계 명 (사용자 정의)

         "{bucket_arrgs_type}": { // 집계 타입 

            "field": "{file_name}" // 집계 대상 필드

             "order" : { "{field_name}" : "desc" } // 정렬

         }

      }

   }



4. 파이프라인 집계 구조

GET /hotels/_search?pretty

{

   "size": 0,

   "aggs": {

      "{parent_aggs_name}": { // 부모 집계 이름 (사용자 정의)

         "{bucket_type_name}": { // 버킷 집계 타입 이름

            "field": "{field_name}" // 버킷 집계 대상 필드

         },

         "aggs": {

            "{aggs_name}": { // 집계 이름 (사용자 정의)

               "{metric_aggs_type}": { // 매트릭 집계 타입

                  "field": "{field_name}" // 매트릭 집계 대상 필드

               }

            }

         }

      },

      "{pipe_arrgs_name}": { // 파이프라인 집계 이름(사용자정의)

         "{pipe_arrgs_type}": { // 파이프라인 집계 타입 

            "buckets_path": "{parent_aggs_name} >{aggs_name}" // 경로

         }

      }

   }

} 




+ Recent posts