본문 바로가기
Study/프로그래밍

CSV파일 데이터로 대시보드 만들기 (feat. ELK)

by 김카비 2021. 10. 15.

ELK란?

https://captcha.tistory.com/44

 

1. ELK(ElasticSearch, Logstash, Kibana) 란? ELK Stack 이란?

1. ELK 란? 현재 4차산업시대에서 데이터는 가장 중요한 자산중 하나로 손꼽힌다. 빅 데이터는 통상적으로 사용되는 데이터 수집, 관리 및 처리 소프트웨어의 수용 한계를 넘어서는 크기의 데이터

captcha.tistory.com

ELK는 위 그림과 같이, 분석 및 저장 기능을 담당하는 ElasticSearch, 수집 기능을 하는 Logstash, 이를 시각화하는 도구인 Kibana의 앞글자만 딴 단어이다. ELK는 접근성과 용이성이 좋아 최근 가장 핫한 Log 및 데이터 분석 도구이다.

 

쉽게 설명하면 logstash로 데이터를 가져올 길을 만들고, elasticsearch로 예쁘게 저장하고, kibana로 시각화해서 보여준다고 생각하면 될 거 같다.

 

1. ELK docker를 띄우기 위한 세팅

여기서는 docker-compose를 이용해 각 서비스를 도커로 띄울것이다.

물론 로컬 컴퓨터에 설치해서 사용해도 되지만, 도커를 쓰는게 훨씬 편함!

우리는 configuration만 설정해주면 뚝딱하고 대시보드를 만들 수 있다.

 

ELK에서 제공하는 기본 소스를 다운받자. 여기서 config등을 참고 할 수 있다.

https://github.com/deviantony/docker-elk

 

 

GitHub - deviantony/docker-elk: The Elastic stack (ELK) powered by Docker and Compose.

The Elastic stack (ELK) powered by Docker and Compose. - GitHub - deviantony/docker-elk: The Elastic stack (ELK) powered by Docker and Compose.

github.com

 

2. docker-compose.yml 파일 작성

- ELK_VERSION은 .env파일에 정의

ELK_VERSION=7.14.1

- docker-compose.yml

version: '3.6'
services:
  elasticsearch:
    build:
      context: elasticsearch/
      args:
        ELK_VERSION: $ELK_VERSION
    container_name: elasticsearch
    environment:
      ES_JAVA_OPTS: "-Xmx8g -Xms8g"
    volumes:
      - type: bind
        source: ./elasticsearch/config/elasticsearch.yml
        target: /usr/share/elasticsearch/config/elasticsearch.yml
        read_only: true
      - type: volume
        source: elasticsearch
        target: /usr/share/elasticsearch/data
    ports:
      - "9200:9200"
      - "9300:9300"
    networks:
      - elk
  logstash:
    build:
      context: logstash/
      args:
        ELK_VERSION: $ELK_VERSION
    container_name: logstash
    environment:
      LS_JAVA_OPTS: "-Xmx2g -Xms2g"
    volumes:
      - type: bind
        source: ./logstash/config/logstash.yml
        target: /usr/share/logstash/config/logstash.yml
        read_only: true
      - type: bind
        source: ./logstash/pipeline
        target: /usr/share/logstash/pipeline
        read_only: true
      - type: bind
        source: ./mydata
        target: /usr/share/mydata
    ports:
      - "5000:5000/tcp"
      - "5000:5000/udp"
      - "9600:9600"
    networks:
      - elk
    depends_on:
      - elasticsearch
  kibana:
    build:
      context: kibana/
      args:
        ELK_VERSION: $ELK_VERSION
    container_name: kibana
    volumes:
      - type: bind
        source: ./kibana/config/kibana.yml
        target: /usr/share/kibana/config/kibana.yml
        read_only: true
    ports:
      - "5601:5601"
    networks:
      - elk
    depends_on:
      - elasticsearch 
    
networks:
 elk:
  driver: bridge

volumes:
 elasticsearch:

 

 

3. Logstash Config 설정

~/logstash/pipline/logstash.conf

위의 docker-compose.yml에서 Logstash부분에 mydata폴더를 /usr/share/mydata 폴더로 바인딩 해두었다.

아래처럼 데이터 위치를 작성하여 폴더 안의 모든 csv파일을 읽어와보자!

 

또한 csv파일에 Year, Week, Count, Time Stamp 이렇게 4개의 컬럼이 있다고한다면,

filter 부분에서와 같이 colums를 통해 정의해주면 된다.

input {
    # 각 서비스들이 사용할 포트 정의해주기
    beats {
      port => 5044
    }
    tcp {
      port => 5000
  	}
    # 데이터 위치 정의해주기
    file {
      path => ["/usr/share/mydata/*.csv"]
      start_position => "beginning"
      sincedb_path => "/dev/null"
      codec => plain{ charset => "UTF-8" }
    }
}

filter  {
  csv {
    separator => ","
    columns => [
      "Year","Week","Count","Time Stamp"
      ]
    skip_empty_columns => "true"
    skip_header => "true"
    }

  mutate {convert => ["Week","string"]}
  mutate {convert => ["Year","string"]}
  mutate {convert => ["Count","string"]}

  # 기존 값을 묶어 새로운 Field 생성하기
  mutate {add_field => {"year-week" => "%{Year}-%{Week}"}}
  mutate {convert => ["year-week","string"]}
 
  # 시간 타입의 데이터를 특정 포맷으로 읽어오기
  date { match => ["Time Stamp", "yyyy-MM-dd HH:mm:ss.SSS", "yyyy-MM-dd HH:mm:ss"]}
}

output {
  elasticsearch {
    hosts => "elasticsearch:9200"
    index => "myindex"
  }
  # 로그 볼 수 있도록
  stdout {
    codec => rubydebug 
  }  
}

logstash/config/logstash.yml

## Default Logstash configuration from Logstash base image.
## https://github.com/elastic/logstash/blob/master/docker/data/logstash/config/logstash-full.yml
#
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://elasticsearch:9200" ]

config.reload.automatic: true
config.reload.interval: 3s
## X-Pack security credentials
#
xpack.monitoring.enabled: true
#xpack.monitoring.elasticsearch.username:
#xpack.monitoring.elasticsearch.password:

 

4. Elasticsearch config 설정

---
## Default Elasticsearch configuration from Elasticsearch base image.
## https://github.com/elastic/elasticsearch/blob/master/distribution/docker/src/docker/config/elasticsearch.yml
#
cluster.name: "docker-cluster"
network.host: 0.0.0.0
discovery.seed_hosts: ["127.0.0.1", "[::1]"]
discovery.type: single-node
## X-Pack settings
## see https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-xpack.html
#
xpack.license.self_generated.type: basic
xpack.security.enabled: false
xpack.monitoring.collection.enabled: false

 

5. Kibana  설정

server.name: kibana
server.host: 0.0.0.0
elasticsearch.hosts: [ "http://elasticsearch:9200" ]

elasticsearch.shardTimeout: 30000
kibana.autocompleteTerminateAfter: 10000000
#monitoring.ui.container.elasticsearch.enabled: true
## X-Pack security credentials

 

6. 백그라운드로 도커 서비스 실행하기

sudo docker-compose down
sudo docker-compose --env-file .env up -d

 

여기까지 했으면 http://localhost:9200을 통해 Kibana 대시보드에 접속할 수 있다.

Kibana는 시각화를 간단하게 해줄 수 있는 툴들을 제공하기 때문에 쉽게 내가 원하는 형식의 대시보드를 만들 수 있다~

댓글