케이스윔의 개발 블로그

[Django] Elasticsearch, Kibana와 연동하기 본문

Study

[Django] Elasticsearch, Kibana와 연동하기

kswim 2018. 7. 29. 21:33

요즘 장고로 웹서버를 구축해서 프로젝트를 진행하면서 다양한 것들을 시도해보는 같다. 중에 하나가 elasticsearch 연동하는 것이었는데! 정말정말 힘들었다. 일단 설치할 버전을 잘못골라서 거의 참고할 있는 문서가 영어로도 찾기가 힘들었다. 그래서 처음에 설치를 했다가 다시 지우고 버전을 깔고, 장고 프로젝트의 데이터베이스와 연동하는 작업을 했다. 내가 사용하고자 목적은 프로젝트에서 저장해야하는 데이터가 너무 많았기때문에 elasticsearch kibana 통해서 시각화하여서 데이터를 쉽게 분석해보고 싶었기때문이다. 거의 한글로 문서는 없었, 아니 0%라고 있을 같다! 안그래도 영어를 잘못하는데 열심히 읽어가며 따라서 했는데도 원하는 결과가 안나와서 너무 심난했던 일주일이었다. 비효율적으로 일주일을 사용한 끝에 그래도 연동에 성공하고 원하는 결과를 얻었다

언젠가 나처럼 장고에 elastic search 연동시키고 싶은 사람들에게 조금이나마 도움이 됐으면 하는 바람에 오늘도 글로 남긴다! 설치하고 찾아보고 연동을 시도할 때에는 자꾸 에러밖에 안나고 구글링해도 해결방법을 찾을 없었는데 해결하고 결과는 너무나 간단한 같다. 



1. Elasticsearch Kibana 설치한다.


나는 Mac os 리눅스에 설치를 했으니까 적어둬야겠다. 엘라스틱서치의 경우는 환경에 상관없이 설치하면 되고, kibana 자기에게 맞는 걸로 설치해주면 된다.


맞다! 우선 elasticsearch 환경을 만들고 싶다면 자바가 먼저 설치되어 있어야 한다. java8 설치하면 된다.

나는 homebrew 통해서 간단하게 설치했다.


$ brew cask install homebrew/cask-versions/java8



이제 엘라스틱서치와 키바나를 설치할건데 나는 관리하기 편하려고 장고프로젝트 상위디렉토리에 이 두개를 위한 디렉토리를 만들어줬다.


$ mkdir ELK

$ cd ELK


엘라스틱서치를 설치하도록 하겠다! 글을 보고 있는 사람은 나랑 같은 버전을 설치해주면 좋겠다!!!!!!! 이후에 작성할 코드들은 5.x 버전으로 작성했기때문에 만약 6.x 버전으로 설치하면 에러들만 ..예정이다.


$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.1.tar.gz

$ tar -xzvf elasticsearch-5.6.1.tar.gz


이렇게 압축을 풀면 엘라스틱서치 설치가 끝난다!

키바나도 마찬가지로 설치한다.


(Linux 기준)

$ wget https://artifacts.elastic.co/downloads/kibana/kibana-5.6.1-linux-x86_64.tar.gz

(Mac OS 기준)

$ wget https://artifacts.elastic.co/downloads/kibana/kibana-5.6.1-darwin-x86_64.tar.gz

$ tar -xzvf (다운받은 kibana)


이렇게 설치하면 설치가 끝난다!

엘라스틱서치와 키바나를 실행하는 방법도 되게 쉽다.

$ ./elasticsearch-5.6.1/bin/elasticsearch

$ ./(압축 키바나디렉토리)/bin/kibana


쓰고나니 이렇게 쉬운 것을 나는 3일이나 헤매고 6.x 버전을 깔았다가 후회하고 다시 설치했다. 

대부분이 디폴트로 설정된 것때문에 엘라스틱서치와 키바나는 알아서 연동되어 있었던 같다. 엘라스틱서치를 먼저 실행하고 키바나를 실행하면 된다. 

http://localhost:9200 통해서 엘라스틱서치를 확인할 있고 http://localhost:5601 통해서 키바나를 확인할 있다!



2. 관련 라이브러리를 설치한다.


연동시키기전에 필요한 몇개의 라이브러리를 설치해줘야한다. 이것도 엄청 헤맸던 brew pip 그냥 설치하니까 버전에 안맞아서 분명히 맞는 코드인데도 오류가 수밖에 없었고 하루종일 날린 적도 있다! 저렇게 버전정보와 함께해서 설치해야한다. 이건 메모를 완벽히 안해둬서 2개말고 다른 설치를 했었나 긴가민가한데 no module이라고 뜨면 설치하면 된다!


$ pip install django_elasticsearch_dsl

$ pip install 'elasticsearch-dsl>=5.0,<6.0'




3. Settings.py 수정하여 elasticsearch 연동시켜준다.


INSTALLED_APPS 에다가  django_elasticsearch_dsl 추가해준다.

아래와같은 설정도 추가해준다.


ELASTICSEARCH_DSL = {

    'default': {

        'host': 'localhost:9200'

    },

}



4. 기존의 장고프로젝트에서 사용중인 모델과 연동될 있도록 코드를 작성한다.


수정해야하는 파일은 기존의 models.py 이고, 나는 추가적으로 필요한 파일 utils.py와 bulks.py를 새로 만들어주었다. 같은 디렉토리에 만들면 된당!
우선 원래 작성되었던 모델을 기준으로 같은 디렉토리에 utils.py를 작성한다. 나는 date, integer 타입인 2개의 변수를 만들어줬는데 이외에도 Text(), Double() 등 여러 타입으로 선언할 수 있다. 이건 models.py에 작성했던 것을 기준으로 맞추면된다.


models.py

from django.db import models

class Test(models.Model):
name = models.DateTimeField('date_time')
count = models.IntegerField(default=0)


utils.py

from elasticsearch_dsl import Date
from elasticsearch_dsl import DocType
from elasticsearch_dsl import Integer

class TestIndex(DocType):
name = Date()
count = Integer()

class Meta:
index = 'test-index'

이렇게 기존의 models에 맞춰서 utils에 인덱스클래스를 만들어주면 된다. 이후에는 인덱싱을 위해 models.py를 다시 수정한다. 만약 모델에 클래스가 여러개라면 해당모델마다 indexing을 만들어준다.


models.py

from django.db import models

class Test(models.Model):
name = models.DateTimeField('date_time')
count = models.IntegerField(default=0)

def indexing(self):
obj = ReportIndex(meta={'id': self.id }, name=self.name, count=self.count)
return obj


이렇게 수정이 끝났다면 거의 다 끝났다. 장고 SQLite 등 각자 사용하는 데이터베이스에 저장된 데이터들을 엘라스틱서치로 옮길 수 있도록 bulk만 해주면 된다! bulks는 한번에 많이 indexing하는 것을 말한다.


bulks.py

from elasticsearch import Elasticsearch
from elasticsearch.helpers import bulk
from elasticsearch_dsl.connections import connections

from . import models
from .utils import TestIndex

connections.create_connection()

def bulk_test():

TestIndex.init()
es = Elasticsearch()
bulk(client=es, actions=(t.indexing() for t in models.Test.objects.all().iterator()))



이렇게 하면 끝이다! 엘라스틱서치와 키바나를 켜고 키바나에 내가 만든 index를 management에서 추가해준다. python manage.py shell을 통해서 from 해당앱명.bulks import * 를 하고나서 bulk_test()를 하면 기존의 데이터베이스가 모두 http://localhost:5601 에서 확인을 할 수 있다!
아직 나도 키바나를 잘 다룰 줄 몰라서 편한지를 느끼진 못하고 있지만 시각화하기에 좋은 것 같다는 생각은 많이 든다. 데이터가 많은 경우에는 눈으로 다양하게 확인할 수 있어서 좋은 것 같다. 이렇게 쓰고나니까 엄청 쉬워보이네..?!


Comments