Endless Motivation

Elasticsearch에 csv import하기 + Kibana 시각화 본문

IT/Data Analysis

Elasticsearch에 csv import하기 + Kibana 시각화

Renesys 2020. 5. 5. 22:08

csv 파일을 elasticsearch에 넣고 Kibana로 표현하는 방법은 여러가지가 있는데 여기서는 직접 해 본 3가지 방법을 정리한다.

 

1. Kibana Data Visualizer 기능 사용

 

csv가 100mb 이하라면 키바나의 기본 제공 기능으로도 간단하게 Elasticserach에 데이터를 밀어넣을 수 있다. 100mb를 넘으면 아래 방법을 사용한다.

키바나 메뉴에서 Machine Learning 클릭 -> Select an Index pattern에서 csv 파일을 올리면 스스로 field 분석까지 끝내고 인덱스 패턴까지 만들어준다.

 

2. logstash 사용

Logstash를 사용하여 data pipeline을 구축하는 방법도 있다.

실시간 데이터라면 Filebeat을 사용하거나 logstash의 pipeline.conf를 설정하여 지속적으로 ES쪽에 쌓이도록 설정할 수 도 있지만 지금 만들고 있는 것은 단발성으로 데이터를 집어넣는 경우가 더 많아 명령어로 처리해본다.

 

명령어는

/usr/share/logstash/bin/logstash -f <설정파일>.conf

로 1회성 실행시키면 된다.

 

input{
	stdin{}
	file{
		path => "/home/renesys/work/defined_data.csv"
		start_position => "beginning"
	}
}

filter{
	csv{
		separator => ","
		columns => ["Time","Year","Month","Hour","Type","Data","Latitude","Longitude"]
		if "_csvparserfailure" in [tags]{
			drop{}
		}
		if [message] =~ /^\s*$/ {
			drop{}
		}
		convert => {
			"Data" => "integer"
			"Latitude" => "float"
			"Longitude" => "float"
		}
	}
	if [message] =~ /^\s*$/ {
		drop{}
	}
	date {
		match => ["Time", "YYYY-MM-dd HH:mm:ss"]
	}
}

output{
	elasticsearch{
		hosts => ["192.168.1.16:9200"]
		index => "mydata"
	}
	stdout{
		codec => rubydebug
	}
}

logstash 설정 스크립트.

최초 Elasticsearch에 데이터를 넣은 후 Kibana 세팅에서 index pattern을 생성해주면 된다.

 

3. python elasticsearch 패키지 사용

pip에서 elasticsearch 패키지를 다운받고 python 스크립트를 통해 직접 데이터를 저장한다.

pip install elasticsearch
python3 mysetting.py
from elasticsearch import helpers, Elasticsearch
import csv

document = {
	"mappings":{
		"dynamic": False,
		"properties":{
			"Time":{
				"type": "date"
			},
			"Year":{
				"type": "text",
				"fields": {
					"keyword":{
						"type": "keyword",
						"ignore_above": 256
					}
				}
			},
			"Month":{
				"type": "text",
				"fields": {
					"keyword":{
						"type": "keyword",
						"ignore_above": 256
					}
				}
			},
			"Hour":{
				"type": "text",
				"fields": {
					"keyword":{
						"type": "keyword",
						"ignore_above": 256
					}
				}
			},
			"Type":{
				"type": "text",
				"fields": {
					"keyword":{
						"type": "keyword",
						"ignore_above": 256
					}
				}
			},
			"Data":{
				"type": "integer"
			},
			"Latitude":{
				"type": "double"
			},
			"Longitude":{
				"type": "double"
			},
		}
	}
}

es = Elasticsearch(['192.168.1.16:9200'], port=9200)

if es.indices.exists(index="mydata"):
	pass
else:
	es.indices.create(index="mydata", body=document)

with open('/home/renesys/work/defined_data.csv') as f:
	reader = csv.DictReader(f)
	helpers.bulk(es, reader, index="mydata")

Elasticsearch에 데이터를 집어넣는 파이썬 스크립트

 

주의할 점은 index를 만들때 field타입을 별도로 지정해주지 않을 경우 모두 text로 지정되어버린다는 점. index body를 만들 때 dynamic 옵션을 해제하고 각 Field의 타입 또한 설정해준다.

또한 Kibana에서 aggregation이 가능하려면 keyword field를 같이 생성해주어야 한다. 원래는 elasticsearch에서 단어의 exact value를 구분하기 위해 있는 field type이라고 하는데 저 type이 없을 경우 키바나에서 visualization을 생성할 때 버킷에 텍스트 내가 생성한 type은 전부 보이지 않는 참사가 벌어진다.

 

python 스크립트로 elasticsearch에 데이터를 밀어 넣은 경우도 logstash와 마찬가지로 최초에는 Kibana 세팅에서 index pattern 생성이 필요하다.

 

 

데이터 집어넣고 index pattern까지 완성한 다음 visualization에서 데이터가 잘 보이는 것까지 확인.

Comments