개요

Eland는 Elasticsearch와 연동하여 데이터 분석 및 머신러닝을 수행할 수 있는 Python 라이브러리다. Elastic 공식 프로젝트로, Pandas와 유사한 DataFrame API를 제공하여 Elasticsearch 인덱스를 친숙한 방식으로 다룰 수 있게 한다.

Eland의 핵심 장점은 데이터 처리를 로컬 메모리가 아닌 Elasticsearch에서 수행한다는 점이다. 이를 통해 대용량 데이터를 메모리 제약 없이 처리할 수 있으며, scikit-learn, XGBoost, PyTorch 등으로 학습한 모델을 Elasticsearch에 배포할 수 있다.

주요 기능

1. DataFrame API

Elasticsearch 인덱스를 Pandas DataFrame처럼 다룰 수 있는 API를 제공한다. 데이터는 Elasticsearch에 저장되며, 모든 연산은 Elasticsearch에서 실행된다.

주요 특징:

  • Pandas API와 유사한 인터페이스
  • 필터링, 그룹화, 집계 연산 지원
  • 로컬 메모리 제약 없이 대용량 데이터 처리
  • Elasticsearch 쿼리를 자동 생성

2. 머신러닝 모델 배포

다양한 머신러닝 프레임워크에서 학습한 모델을 Elasticsearch에 배포할 수 있다.

지원 프레임워크:

  • scikit-learn: 회귀, 분류 모델
  • XGBoost: 그래디언트 부스팅 모델
  • LightGBM: 경량 그래디언트 부스팅
  • PyTorch: BERT 등 트랜스포머 기반 NLP 모델

3. Hugging Face 모델 통합

eland_import_hub_model 스크립트를 통해 Hugging Face Model Hub의 사전 학습된 트랜스포머 모델을 Elasticsearch에 직접 가져올 수 있다.

지원 NLP 과제:

  • Named Entity Recognition (NER) - 개체명 인식
  • Text Classification - 텍스트 분류
  • Text Embedding - 텍스트 임베딩
  • Question Answering - 질의응답
  • Fill Mask - 마스크 언어 모델링
  • Text Similarity - 텍스트 유사도
  • Zero-shot Classification - 제로샷 분류
  • Text Expansion - 텍스트 확장 (ELSER 등)

설치

# 기본 설치
pip install eland
 
# Elasticsearch 8.x용
pip install "eland>=8,<9"
 
# Elasticsearch 7.x용
pip install "eland>=7,<8"

요구사항:

  • Python 3.9, 3.10, 3.11, 3.12
  • Pandas 1.5 또는 2.0
  • Elasticsearch 8+ (권장: 8.16 이상)

사용 예시

DataFrame으로 데이터 조회

import eland as ed
from elasticsearch import Elasticsearch
 
# Elasticsearch 연결
es = Elasticsearch(
    "http://localhost:9200",
    basic_auth=("elastic", "password")
)
 
# Eland DataFrame 생성
df = ed.DataFrame(es, es_index_pattern="flights")
 
# 데이터 필터링 및 집계
filtered = df[df.Carrier != "Kibana Airlines"]
result = filtered.groupby("Carrier").mean()
 
print(result.head())

Pandas DataFrame을 Elasticsearch로 전송

import pandas as pd
import eland as ed
 
# Pandas DataFrame 생성
pd_df = pd.DataFrame({
    "name": ["Alice", "Bob", "Charlie"],
    "age": [25, 30, 35],
    "city": ["Seoul", "Busan", "Incheon"]
})
 
# Elasticsearch 인덱스로 저장
ed.pandas_to_eland(
    pd_df,
    "http://localhost:9200",
    "users",
    es_if_exists="replace",
    es_refresh=True
)

Elasticsearch에서 Pandas로 변환

import eland as ed
 
# Eland DataFrame 생성
ed_df = ed.DataFrame("http://localhost:9200", es_index_pattern="users")
 
# Pandas DataFrame으로 변환
pd_df = ed.eland_to_pandas(ed_df)
 
# CSV로 저장
pd_df.to_csv("output.csv", index=False)

Hugging Face 모델 가져오기

# 명령줄에서 모델 가져오기
eland_import_hub_model \
  --url http://localhost:9200 \
  --hub-model-id elastic/distilbert-base-cased-finetuned-conll03-english \
  --task-type ner \
  --start
 
# 인증이 필요한 경우
eland_import_hub_model \
  --url https://elastic:password@hostname:9200 \
  --hub-model-id sentence-transformers/msmarco-MiniLM-L-12-v3 \
  --task-type text_embedding \
  --start
 
# Docker로 실행
docker run -it --rm docker.elastic.co/eland/eland \
  eland_import_hub_model \
  --url $ELASTICSEARCH_URL \
  --hub-model-id elastic/distilbert-base-uncased-finetuned-conll03-english \
  --start

오프라인 환경에서 모델 가져오기

네트워크가 제한된 환경에서는 모델을 로컬로 먼저 다운로드한 후 가져올 수 있다.

# 1. 로컬에 모델 복제 (Git LFS 필요)
git lfs install
git clone https://huggingface.co/elastic/distilbert-base-cased-finetuned-conll03-english
 
# 2. 로컬 모델을 Elasticsearch에 가져오기
eland_import_hub_model \
  --url http://localhost:9200 \
  --hub-model-id ./distilbert-base-cased-finetuned-conll03-english \
  --task-type ner \
  --start

주요 활용 사례

1. 대용량 데이터 분석

로컬 메모리 제약 없이 Elasticsearch에 저장된 대용량 데이터를 Pandas와 유사한 방식으로 분석할 수 있다.

적용 분야:

  • 로그 분석
  • 시계열 데이터 분석
  • 비즈니스 인텔리전스
  • 사용자 행동 분석

2. 시맨틱 검색

Hugging Face의 문장 임베딩 모델(Sentence Transformers)을 Elasticsearch에 배포하여 의미 기반 검색을 구현할 수 있다.

예시:

eland_import_hub_model \
  --url http://localhost:9200 \
  --hub-model-id sentence-transformers/all-MiniLM-L6-v2 \
  --task-type text_embedding \
  --start

3. 개체명 인식 (NER)

사전 학습된 NER 모델을 배포하여 텍스트에서 인명, 지명, 기관명 등을 자동으로 추출할 수 있다.

활용:

  • 문서 자동 태깅
  • 정보 추출
  • 콘텐츠 분류

4. 텍스트 분류

감성 분석, 주제 분류 등의 텍스트 분류 모델을 Elasticsearch에 배포하여 실시간 분류 작업을 수행할 수 있다.

활용:

  • 고객 리뷰 감성 분석
  • 스팸 필터링
  • 뉴스 카테고리 분류

5. ETL 파이프라인

Pandas DataFrame과 Elasticsearch 간의 변환을 통해 데이터 ETL(Extract, Transform, Load) 파이프라인을 구축할 수 있다.

장점

  • 친숙한 API: Pandas 경험이 있다면 쉽게 사용 가능
  • 확장성: 로컬 메모리 제약 없이 대용량 데이터 처리
  • 성능: 데이터 처리를 Elasticsearch에 위임하여 효율적
  • 통합성: Elasticsearch 생태계와 완벽히 통합
  • 유연성: 다양한 머신러닝 프레임워크 지원
  • 접근성: Hugging Face 모델을 명령어 하나로 배포

제약사항

  • Pandas API 완전 호환 아님: 모든 Pandas 기능을 지원하지 않음
  • 실시간 학습 불가: 모델은 사전에 학습된 것만 배포 가능
  • Elasticsearch 의존성: Elasticsearch 클러스터가 필수
  • 일부 연산 제약: 복잡한 데이터 조작은 Pandas로 변환 후 수행 필요

Elasticsearch ML과의 관계

Eland는 Elasticsearch의 머신러닝 기능을 활용하기 위한 Python 클라이언트 역할을 한다:

  1. 모델 배포: Eland로 모델을 Elasticsearch에 업로드
  2. 추론 실행: Elasticsearch의 인제스트 파이프라인이나 검색 시점에 모델 사용
  3. 결과 조회: Eland DataFrame으로 추론 결과 분석

이를 통해 검색과 머신러닝을 통합한 강력한 애플리케이션을 구축할 수 있다.

OpenSearch 지원

Eland는 Elasticsearch 전용 라이브러리이며 OpenSearch와는 호환되지 않는다. OpenSearch를 사용하는 경우 대신 **opensearch-py-ml**을 사용해야 한다.

opensearch-py-ml은 Eland의 오픈소스 포크로, OpenSearch를 위한 데이터 분석 및 머신러닝 도구를 제공한다. Eland와 유사한 DataFrame API와 ML 모델 배포 기능을 제공하며, OpenSearch의 ML Commons 플러그인과 긴밀하게 통합되어 있다.

자세한 내용은 opensearch-py-ml 문서를 참고하라.

참고 자료