다디와 괴발개발

[OpenSearch] OpenSearch Dashboard에 location data Visualize를 위한 초기 설정 과정 본문

TroubleShooting

[OpenSearch] OpenSearch Dashboard에 location data Visualize를 위한 초기 설정 과정

아임다디 2022. 6. 7. 15:04

목적

OpenSearch Dashboard(Kibana Visualize)로 프로젝트에서 사용되는 각 트럭 별로 이동 경로 데이터 보기 위해 해야 할 초기 셋팅 작업

개념

  1. ElasticSearch Mapping
  • 데이터가 입력되어 자동으로 매핑이 생성되기 전에 미리 먼저 인덱스의 매핑을 정의 해 놓으면 정의 해 놓은 매핑에 맞추어 데이터가 입력된다
  • 이미 생성된 데이터에 대한 매핑은 불가하다
  • 즉, location 데이터가 들어오기 전에 매핑을 먼저 해줘야 한다
  1. Geo
  • Elasticsearch에서 제공하는 위치정보 저장 타입 중 하나
  • Geo Point 는 위도(latitude)와 경도(longitude) 두 개의 실수 값을 가지고 지도 위의 한 점을 나타내는 값이다
  • locationgeo_point로 매핑해놓으면 안에 들어있는 lat, lon을 자동으로 위도, 경도로 인식해준다
  1. Kibana Visualize
  • Kibana에서는 데이터 시각화를 제공해준다
  • 위치 정보를 보기 위한 Coordinate Map을 생성하고 데이터를 보기 위해서는 geo_point 타입이 필수이다

야크털 쉐이빙

Visualize 과정에서 가장 애먹었던 부분은 geo_point로 mapping 해주는 과정이었다.
기존에 Kinesis Data streams로 부터 데이터가 계속 들어와 있는 상태에서 타입을 재매핑해주려고 하니까 illegal_argument_exception 오류가 떴다. 🥲🥲

오류 내용

"type" : "illegal_argument_exception",
"reason" : "mapper [location] cannot be changed from type [long] to [geo_point]"

앞의 개념에서도 설명했듯이 이미 생성된 데이터에 대한 재매핑은 불가하므로 인덱스를 삭제해주고 다시 생성해서 매핑까지 한 뒤에 데이터를 받아야 한다

작업 과정 - Index Mapping

  1. 인프라를 모두 구축하고 아무런 데이터가 OpenSearch에 담기지 않은 상태
  2. OpenSearch Dashboard - DevTools을 통해 Index 생성 및 Mapping을 해준다
PUT drivers-log 
{ 
    "mappings": {
        "properties": {
            "location": {
                "type": "geo_point" 
			}
		}
	}
}

응답이 아래와 같이 오면 성공적으로 매핑된 것 (상태코드 : 200 - success)

{ 
  "acknowledged" : true, 
  "shards_acknowledged" : true, 
  "index" : "drivers-log" 
}

인덱스에 대한 정보를 다시 확인하고 싶다면 GET drivers-log를 해주면 된다

3. 이후 트럭 데이터들을 전송해주면 된다

+ 여담

프로젝트 초반 Kinesis Data Generator를 통해 OpenSearch에 데이터가 잘 도달하는지 테스트 하는 과정에서 OpenSearch에 미리 인덱스를 만들고 테스트를 했을 때 데이터가 도달하지 않아 생겼던 오해에서 비롯해 사용했던 방법

일단 위에서 도달하지 않았던 원인은 OpenSearch Backend-Role, Data Type 문제였다.

아무튼! 내가 처음에 사용했던 방법에 대해 후술해보자면,

  1. Kinesis Data Stream에 데이터를 보내기 위한 API Gateway 엔드포인트로 location이 들어가있지 않은 아무 테스트 데이터를 보내 인덱스를 생성해준다
  • 주의사항 : location이 담긴 데이터를 보내면 이미 생성된 데이터에 대한 매핑은 불가하므로 반드시 location이 없는 아무런 데이터나 보내도록 한다
    { "truckId": 11, "timestamp": 20220530021550 }
  1. OpenSearch Dashboard - DevTools을 통해 Index Mapping을 해준다
PUT drivers-log/_mapping 
{ 
	"properties": {
    	"location": {
        	"type": "geo_point"
		}
	}
}

작업과정 - Visualize

  1. OpenSearch Dashboard - StackManagement - Index Patterns 선택
  2. 보고자하는 인덱스의 인덱스 패턴 생성
  • geo_point으로 성공적으로 매핑이 됐다면 location의 타입이 geo_point으로 나온다!

  1. OpenSearch Dashboard의 Visualize 메뉴 선택
  2. New Visualize에서 Coordinate Map 선택

  1. 우측의 Buckets 탭에서 Add 선택
  2. Aggregation에서 Geohash 선택, field에서 location 선택
  3. 촘촘한 경로를 보고싶다면, Change precision on map zoom 해제 후 Precision 수치를 높여준다
  4. Point 색 변경을 원한다면 OptionsColor Schema 변경

+ 상단의 Add filter를 통해 원하는 데이터만 출력이 가능하다

결론

매핑은 최초에 한 번만 할 수 있으니 주의하자!
DevTools로 할 수 있는 일이 많으니 활용법을 잘 찾아보고 적재적소에 잘 활용하자!

레퍼런스

Elastic Geo
Kibana Map 사용법