“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> 로 사용 가능.
앞으로 더 좋아집니다 (로드맵)
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
'빅데이터' 카테고리의 다른 글
드디어 나왔다! Apache Airflow 3.0 — 4년을 기다린 대형 업데이트의 모든 것 (0) | 2025.04.23 |
---|---|
HDFS도 Ceph도 넘는 성능? DeepSeek의 고성능 분산 파일 시스템 ‘3FS’ 완전 정복 (0) | 2025.04.23 |
데이터 인프라의 미래: 레이크하우스와 AI 중심 혁신 (0) | 2025.04.04 |
Apache Kafka 4.0 출시! 무엇이 바뀌었을까? (0) | 2025.03.31 |
데이터 품질을 점진적으로 향상시키는 메달리온 아키텍처란? (0) | 2025.03.05 |