위/경도를 기반데이터의 분포를 지도형식으로 출력해야 하는 경우 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]"
- xpack.security.encryptionKey는 쿠키에서 자격 증명을 암호화하는 데 사용되는 임의의 32자 이상의 문자열이다.
- https://www.allkeysgenerator.com/Random/Security-Encryption-Key-Generator.aspx에서 256-bit로 key를 생성해서 설정한다.
- Reference
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으로 해당되는 도큐먼트가 많은 지역의 하이라이팅이 가능하다.