본문 바로가기

빅데이터

ElasticSearch에도 드디어 JOIN이 생겼다? LOOKUP JOIN 기능 소개

728x90
반응형

“JOIN은 무조건 느리고, Elasticsearch에서는 안 되는 줄 알았는데… 이젠 가능하다고?”
네, 맞습니다. 드디어 Elasticsearch에서도 JOIN이 됩니다. 그리고 생각보다 훨씬 간단하고 쓸만합니다.


LOOKUP JOIN이 뭔가요?

Elasticsearch 8.18에서 도입된 LOOKUP JOIN은 말 그대로 SQL 스타일의 JOIN 기능입니다.
정확히는 LEFT OUTER JOIN 구조로 동작하며, 기존의 복잡한 ENRICH 방식보다 훨씬 쉽게 데이터를 조합할 수 있게 도와줍니다.

핵심 개념은 이렇습니다:

  • JOIN을 하기 위해서는 새로운 인덱스가 필요합니다. 이름하여 lookup index.
  • 이 lookup index는 JOIN 시 '우측 테이블' 역할을 하며, 단일 샤드로 구성됩니다.
  • ES|QL 쿼리 안에서 LOOKUP JOIN 문법으로 쉽게 연결할 수 있습니다.

즉, 복잡한 정책 없이도 "이 IP에 어떤 환경(environment)이 매핑돼 있는지", "이 호스트를 어느 팀이 소유하고 있는지" 같은 분석을 쉽게 할 수 있게 된 거죠.

반응형

어디에 쓸 수 있나요?

LOOKUP JOIN의 진가는 실무에서 발휘됩니다. 아래 예시들을 보시면 감이 오실 거예요.

1. 웹 로그 + 환경 정보 병합

FROM kibana_sample_data_logs
| WHERE response.keyword != "200"
| LOOKUP JOIN envs_lkp ON clientip
| STATS COUNT(*) by response, environment

→ 클라이언트 IP에 따라 환경(dev, QA, prod 등)을 조인해서, 어느 환경에서 에러가 많이 나는지 분석할 수 있습니다.


2. 보안 이벤트 + 자산/직원 정보 매칭

보안 로그에 기록된 host나 user 필드를 통해, 해당 장비나 계정이 어느 팀 소속인지, 중요 자산인지, 또는 위협 인텔리전스에 등록된 객체인지 등을 쉽게 확인할 수 있습니다.

FROM kibana_sample_data_logs
| WHERE response.keyword != "200"
| LOOKUP JOIN teams_lkp ON host
| STATS num = COUNT(*) by host, response.keyword, team
| SORT num DESC

→ 어떤 팀이 운영하는 서버에서 에러가 많이 나는지도 파악 가능.


3. Enrich로는 불가능했던 분석

기존 Enrich는 결과가 배열 형태로 들어오기 때문에, 집계나 통계 분석에 부적합했습니다. 반면 LOOKUP JOIN은 조인된 결과가 행 단위로 분리되어 집계까지 가능합니다.


LOOKUP JOIN이 좋은 이유

간단히 말해, Enrich보다 더 쉽고, 더 실시간이고, 더 분석 친화적입니다.

비교 항목 Enrich 방식 LOOKUP JOIN
설정 방식 사전 정책 필요 없음 (즉시 사용)
데이터 변경 반영 정책 재실행 필요 인덱스만 수정하면 즉시 반영
다중 매칭 처리 배열 반환 → 후처리 필요 행으로 분리 → 집계/분석에 용이
통계 분석 적합성 부적합 최적화됨
적합한 데이터 유형 변경이 거의 없는 정적 데이터 자주 변경되는 동적 데이터 포함 가능

또한, JOIN 후 STATS, SORT, WHERE 등 다양한 ES|QL 문법과 함께 쓸 수 있어, 유연한 분석이 가능해졌습니다.


어떻게 시작하나요?

LOOKUP JOIN을 사용하려면, 우선 lookup 인덱스를 만들어야 합니다. 방법은 아주 간단합니다.

1. Kibana UI로 생성

Stack Management → Index Management → Create Index
→ 인덱스 생성 시 lookup 모드로 설정

2. REST API로 생성

PUT mylookupindex
{
  "settings": {
    "index.mode": "lookup"
  }
}

3. CSV 업로드로 생성 (GUI 방식)

머신러닝 File Upload 기능을 사용해 CSV 파일을 드래그앤드롭하면, 인덱스를 생성할 수 있습니다.
이 때도 lookup 모드 선택만 해주면 끝.


주의사항과 팁

LOOKUP JOIN은 아주 강력한 기능이지만, 아래 사항은 꼭 알아두세요:

  • JOIN은 무거운 연산입니다. 매번 실시간 JOIN하기보다, 자주 쓰는 필드는 Enrich + ingest-time denormalization도 고려해보세요.
  • lookup index는 단일 샤드입니다. 따라서 최대 20억 문서까지 저장 가능하다는 제한이 있습니다.
  • data stream은 지원하지 않음 → Logstash, Elastic Agent를 통해 데이터 입력은 가능하지만 data stream 기반은 아님.
  • lookup index도 일반 쿼리처럼 직접 조회 가능합니다:
    FROM <lookup_index> 로 사용 가능.
728x90

앞으로 더 좋아집니다 (로드맵)

LOOKUP JOIN은 현재 기술 프리뷰(Tech Preview) 상태이지만, Elastic은 다음과 같은 기능들을 곧 지원할 예정입니다:

  • INNER JOIN, SUBQUERY 기능
  • 일반 인덱스 간 JOIN 지원
  • Kibana Discover에서 CSV 드래그앤드롭 → 자동 lookup index 생성
  • GUI 기반 Lookup 인덱스 수정 및 관리 기능

→ 정식 릴리즈가 되면, 분석 툴로서의 Elasticsearch는 한층 더 강력해질 겁니다.

https://www.elastic.co/blog/esql-lookup-join-elasticsearch

 

ES|QL Joins are here! Yes, Joins!

Elasticsearch 8.18 includes our first SQL-style JOIN: ES|QL’s LOOKUP JOIN command. It is now available in tech preview and enables data correlation and enrichment with easily updatable lookup datasets...

www.elastic.co

728x90
반응형