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. 도큐먼트 1번 생성 (index)
    {"index":{"_index":"test", "_id":"1"}}
    {"field":"value one"}
    
  2. 도큐먼트 2번 생성 (index)
    {"index":{"_index":"test", "_id":"2"}}
    {"field":"value two"}
    
  3. 도큐먼트 2번 삭제 (delete)
    {"delete":{"_index":"test", "_id":"2"}}
    
  4. 도큐먼트 3번 생성 (create)
    {"create":{"_index":"test", "_id":"3"}}
    {"field":"value three"}
    
  5. 도큐먼트 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" }

🎯 추가 학습 추천

  1. Elasticsearch 인덱스 매핑 설정 (필드 타입 지정)
  2. 대량 데이터 삽입 성능 튜닝 (refresh_interval, replicas 설정)
  3. Scroll API 활용 (대량 데이터 검색 및 처리)

 

+ Recent posts