bulk API 개요
- 여러 개의 index, create, update, delete 작업을 한 번에 배치 실행할 수 있습니다.
- 성능 최적화를 위해 대량 데이터 입력 시 _bulk API를 사용하는 것이 권장됩니다.
- 트랜잭션 개념 없음: _bulk 작업이 중간에 실패하면 어디까지 실행되었는지 확인이 어렵습니다.
bulk API 사용 방법
- 요청 형식:
- _bulk API는 JSON 형식의 명령문과 데이터문을 한 줄씩 순서대로 입력합니다.
- delete 작업은 데이터 입력이 필요 없으며, 명령문만 포함됩니다.
- 반드시 줄바꿈 없이 한 줄씩 입력해야 합니다.
bulk API 예제
POST _bulk
{"index":{"_index":"test", "_id":"1"}}
{"field":"value one"}
{"index":{"_index":"test", "_id":"2"}}
{"field":"value two"}
{"delete":{"_index":"test", "_id":"2"}}
{"create":{"_index":"test", "_id":"3"}}
{"field":"value three"}
{"update":{"_index":"test", "_id":"1"}}
{"doc":{"field":"value two"}}
✅ 각 명령의 동작
- 도큐먼트 1번 생성 (index)
{"index":{"_index":"test", "_id":"1"}}
{"field":"value one"}
- 도큐먼트 2번 생성 (index)
{"index":{"_index":"test", "_id":"2"}}
{"field":"value two"}
- 도큐먼트 2번 삭제 (delete)
{"delete":{"_index":"test", "_id":"2"}}
- 도큐먼트 3번 생성 (create)
{"create":{"_index":"test", "_id":"3"}}
{"field":"value three"}
- 도큐먼트 1번 수정 (update)
{"update":{"_index":"test", "_id":"1"}}
{"doc":{"field":"value two"}}
인덱스 단위 _bulk 사용
- 동일한 인덱스에서 작업할 경우, _bulk API를 인덱스 단위로 호출 가능
POST test/_bulk
{"index":{"_id":"1"}}
{"field":"value one"}
{"index":{"_id":"2"}}
{"field":"value two"}
bulk API 실행 결과 예제
{
"took": 30,
"errors": false,
"items": [
{
"index": {
"_index": "test",
"_id": "1",
"_version": 1,
"result": "created"
}
},
{
"index": {
"_index": "test",
"_id": "2",
"_version": 1,
"result": "created"
}
},
{
"delete": {
"_index": "test",
"_id": "2",
"result": "deleted"
}
},
{
"create": {
"_index": "test",
"_id": "3",
"_version": 1,
"result": "created"
}
},
{
"update": {
"_index": "test",
"_id": "1",
"_version": 2,
"result": "updated"
}
}
]
}
- "errors": false → 모든 작업이 성공적으로 실행됨
- "result": "created" | "updated" | "deleted" → 각 작업의 결과 표시
bulk 명령을 파일에서 실행하기
✅ bulk.json 파일 생성
{"index":{"_index":"test","_id":"1"}}
{"field":"value one"}
{"index":{"_index":"test","_id":"2"}}
{"field":"value two"}
{"delete":{"_index":"test","_id":"2"}}
{"create":{"_index":"test","_id":"3"}}
{"field":"value three"}
{"update":{"_index":"test","_id":"1"}}
{"doc":{"field":"value two"}}
✅ 파일을 이용하여 _bulk 실행 (curl 명령어)
curl -XPOST "http://localhost:9200/_bulk" -H "Content-Type: application/json" --data-binary @bulk.json
- --data-binary @bulk.json: 파일 내용을 _bulk API에 전달하여 실행
bulk API의 장점과 주의사항
✅ 장점
항목 |
설명 |
속도 향상 |
개별 API 호출보다 훨씬 빠름 |
네트워크 부하 감소 |
여러 작업을 한 번에 처리하여 트래픽 감소 |
대량 데이터 처리 최적화 |
로그 저장, 데이터 마이그레이션 등에 유용 |
⚠ 주의사항
항목 |
설명 |
줄바꿈 필수 |
각 명령문과 데이터문은 반드시 줄바꿈해야 함 |
트랜잭션 없음 |
일부 작업이 실패해도 롤백되지 않음 |
메모리 사용량 주의 |
한 번에 너무 많은 데이터를 처리하면 OOM(Out of Memory) 발생 가능 |
✅ 정리
작업 |
HTTP 메서드 |
예제 |
_bulk API 실행 (여러 작업 한 번에 처리) |
POST |
POST _bulk |
파일에서 _bulk 실행 |
curl |
curl -XPOST "http://localhost:9200/_bulk" --data-binary @bulk.json |
_bulk 명령어 형식 |
JSON |
{ "index": { "_index": "test", "_id": "1" } } { "field": "value one" } |
🎯 추가 학습 추천
- Elasticsearch 인덱스 매핑 설정 (필드 타입 지정)
- 대량 데이터 삽입 성능 튜닝 (refresh_interval, replicas 설정)
- Scroll API 활용 (대량 데이터 검색 및 처리)