시작하며
Kaggle에서 내려받은 CSV 데이터를 ElasticSearch에 적재하는 방법에는 두 가지 흐름이 있다. 소용량 파일이라면 Kibana의 Data Visualizer를 사용할 수 있고, 전처리가 필요하거나 100MB를 초과하는 경우에는 Logstash를 거쳐 적재해야 한다.

데이터 적재 흐름
Data Visualizer를 이용한 방법
Kibana Data Visualizer: CSV 파일을 ElasticSearch에 저장하는 GUI 도구로, 100MB 이하의 파일에 대해서만 사용 가능하다. CSV 파일을 Visualizer로 올리면 무난하게 적재되지만, JSON 중첩 구조와 같이 분석에 장애가 되는 데이터 형식이 포함된 경우에는 Logstash를 활용해 교정해야 한다.
Logstash를 이용한 방법
복잡한 전처리가 필요한 경우의 전체 데이터 흐름은 다음과 같다.
kaggle(csv) → logstash(ruby, csv filter) → elasticSearch(indexMapping, indexTemplate) → kibana
아래는 TMDB 5000 영화 데이터셋을 ElasticSearch에 적재하는 Logstash 파이프라인 예시이다.
input {
file {
path => "C:/Users/leeseungyeup/Desktop/archive/tmdb_5000_movies.csv"
start_position => "beginning"
sincedb_path => "nul"
}
}
filter {
csv {
separator => ","
columns => ["budget","genres","homepage","id","keywords","original_language","original_title","overview","popularity","production_companies","production_countries","_release_date","revenue",
"runtime","spoken_languages","status","tagline","title","vote_average","vote_count"]
remove_field => ["message","production_companies","production_countries","keywords","spoken_languages","@timestamp","path","@version","host"]
skip_header => true
}
date {
match => ["_release_date", "YYYY-MM-DD"]
target => "release_date"
timezone => "UTC"
remove_field => "_release_date"
}
ruby {
code => "
genres = JSON.parse( event.get('genres')).map{ |genre| genre['name'] }
event.set('genres', genres)
"
}
}
output {
elasticsearch {
index => "tmdb_5000_movie2"
}
}
파이프라인 필터 설명
- csv 필터: CSV 파일의 각 행을 파싱하고, 불필요한 필드를
remove_field로 제거한다.skip_header로 헤더 행을 건너뛴다. - date 필터: 문자열 형식의 날짜 필드를 ElasticSearch의 date 타입으로 변환한다.
remove_field로 원본 필드를 제거한다. - ruby 필터: Logstash 내부에서 각 이벤트를 처리할 때
get/set함수를 통해 필드 값을 읽고 변경할 수 있다. 위 예시에서는 genres 필드의 JSON 문자열을 파싱해 이름 목록 배열로 변환한다.
인덱스 템플릿 활용
index_template을 사용해 매핑하면 설정이 동일한 복수의 인덱스를 만들 때 유리하다. 예를 들어 날짜별로 인덱스를 파티셔닝하는 경우, 모든 인덱스에 동일한 매핑이 자동 적용된다.
정리하며
Kaggle 데이터를 Elastic Stack에 적재하는 핵심은 Logstash 파이프라인 설계에 있다. csv 필터로 구조를 잡고, date 필터로 시계열 데이터를 올바르게 변환하며, ruby 필터로 JSON 중첩 구조를 평탄화하는 조합이 효과적이다. 적재 전에 인덱스 템플릿으로 매핑을 미리 정의해두면 이후 Kibana 시각화도 더 원활하게 진행된다.