본문 바로가기

Elasticsearch

Kibana로 한국지도에 데이터 분포 나타내기

위/경도를 기반데이터의 분포를 지도형식으로 출력해야 하는 경우 Elasticsearch + Kibana 조합으로 간단하게 구성할 수 있다.

Elasticsearch, Kibana 구성

싱글노드 클러스터를 구성하기 위해 AWS EC2 인스턴스에 docker-compose를 이용해서 ES, Kibana 컨테이너를 설정했고, 어드민 외에 일반 사용자는 Kibana 읽기권한만을 가질 수 있도록 X-Pack Security 설정도 진행했다.

X-Pack Security는 ElasticStack v6.8, 7.1 이상부터 무료로 사용가능 하도록 변경되었다. https://www.elastic.co/blog/security-for-elasticsearch-is-now-free

docker-compose.yml

version: '2.2'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.3.2
    container_name: elasticsearch
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    volumes:
      - /home/ec2-user/docker/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
      - /home/ec2-user/docker/config/jvm.options:/usr/share/elasticsearch/config/jvm.options
    network_mode: "host"
  kibana:
    image: docker.elastic.co/kibana/kibana:7.3.2
    container_name: kibana
    volumes:
      - /home/ec2-user/docker/config/kibana.yml:/usr/share/kibana/config/kibana.yml
    network_mode: "host"
  • jvm.options에는 G1GC,Xmx,Xms 옵션을 설정한다. ES 6.5버전 이상부터는 디폴트로 G1GC 옵션을 사용하고 있으며, 힙사이즈는 32GB를 초과하지 않는 범위에서 시스템의 절반을 설정한다.

elasticsearch.config

cluster.name: visualization-cluster

node.name: visualization-node

node.master: true
node.data: true
node.ingest: false

bootstrap.memory_lock: true

network.host: _eth0_
http.port: 9200

discovery.type: single-node

action.destructive_requires_name: true

reindex.remote.whitelist: $[source]
xpack.security.enabled: true
  • reindex.remote.whitelist에는 scheme(ex: http)를 제외한 URL정보와 port 정보를 입력해주어야 한다.
  • 여러개를 등록해야 할 경우 "otherhost:9200, another:9200, 127.0.10.:9200, localhost:" 식으로 등록한다.
  • Reference

패스워드 설정

  • elastic, apm_system, kibana, logstash_system, beats_system, remote_monitoring_user 관리자 패스워드를 interactive로 설정한다.
    docker exec -it elasticsearch /bin/bash
    ./bin/elasticsearch-setup-passwords interactive
    Initiating the setup of passwords for reserved users elastic,apm_system,kibana,logstash_system,beats_system,remote_monitoring_user.
    You will be prompted to enter passwords as the process progresses.
    Please confirm that you would like to continue [y/N]y
    Enter password for [elastic]:
    ...

kibana.yml

elasticsearch.hosts: [ "$[SCHEME:ES_HOST:PORT]" ]
elasticsearch.username: "kibana"
elasticsearch.password: "kibana"

xpack.security.enabled: true
xpack.security.encryptionKey: "$[something_at_least_32_characters]"

Kibana 설정

  • security 설정이 정상적으로 되었다면 키바나 메인페이지 호출 시 로그인 화면이 출력된다. kibana.yml에 등록한 ID/Password를 통해 로그인한다.
  • 지도 출력 대상이 될 인덱스의 패턴을 Management - Kibana - Index Patterns 메뉴에서 등록한다.

권한설정

  • Management - Security 메뉴에서 User와 Role을 설정할 수 있다.

Role 설정

 

  • Map Read 권한설정 뿐만 아니라 출력 대상이 되는 인덱스의 Read 권한도 설정해주어야 한다.

User 추가

  • User를 추가하고 위에서 설정한 Readonly Role을 설정한다.

분포도 표시

    • Kibana 7.3 버전에서는 레이어 구조로 맵에 데이터를 표시할 수 있다. (포토샵의 레이어 처럼 최상위 레이어부터 한 층씩 맵에 표시되는 방식)

    • 맵에 데이터를 출력하는 Data source에는 여러가지 방식이 있다.

Documents

  • 도큐먼트의 geo_point 필드를 읽어와서 각각의 위치를 지도에 출력하는 방식

Grid aggregation

  • 도큐먼트의 geo_point 필드를 읽어와서 가까운 위치에 있는 문서들을 aggregation 해서 보여주는 방식

Vector Shape

  • Elastic에서 제공하는 geojson의 region 기준으로 aggregation해서 맵에 표시한다. (ES에서는 기본적으로 한국 시/도별, 시/군/구별 두가지 타입을 제공함)
  • Map에 출력하기 위해서 위/경도 데이터를 Elastic에서 제공하는 GeoJson region_code로 매핑해서 색인하는 작업이 필요하다.
  • aggregation으로 해당되는 도큐먼트의 분포별 하이라이팅이 가능하다.

Upload GeoJson Vector File

  • 커스텀 GeoJson을 업로드하여 데이터를 aggregation한 뒤 지도에 출력한다.
  • 시/군/구 보다 더 세부적인 행정동 단위의 Aggreagation이 필요하거나 Elastic에서 제공하는 시/군/구 코드와 다른 기준으로 Aggregation 이 필요하다면 사용할 수 있는 기능이다.
  • 마찬가지로 Map에 출력하기 위해서 데이터의 위/경도를 Custom GeoJson의 코드와 매핑하는 가공작업이 필요하다. 
  • aggregation으로 해당되는 도큐먼트가 많은 지역의 하이라이팅이 가능하다.

참고