본문 바로가기
서버구축 (WEB,DB)

Elasticsearch Bulk 통한 indexing 중 Limit of total fields 오류 해결

by 날으는물고기 2024. 1. 30.

Elasticsearch Bulk 통한 indexing 중 Limit of total fields 오류 해결

elasticsearch7.helpers.errors.BulkIndexError: ('26 document(s) failed to index.', 이하생략

이 오류는 Elasticsearch에 문서를 색인하려고 할 때 발생한 문제로, 총 필드 수 제한을 초과했다는 것을 나타냅니다. 에러 메시지에서 "Limit of total fields [10000] has been exceeded while adding new fields [2]"라고 나와 있습니다. Elasticsearch에서는 기본적으로 한 인덱스 내 전체 필드 수를 10000개로 제한하고 있으며, 현재 추가하려는 문서에서는 2개의 새로운 필드를 추가하려다가 이 제한을 초과하게 되었습니다.

 

이 문제를 해결하기 위해서는 몇 가지 방법이 있습니다.

  1. 필드 수 줄이기: 현재의 색인 구조를 재평가하고 필요 없는 필드를 줄이거나 삭제함으로써 필드 수를 줄일 수 있습니다.
  2. 동적 매핑 비활성화: Elasticsearch는 색인 생성 시에 자동으로 매핑을 생성하는데, 이때 동적 매핑이 사용됩니다. 동적 매핑을 비활성화하여 필드를 명시적으로 매핑하면 필드 수를 더욱 효과적으로 제어할 수 있습니다.
  3. 인덱스 설정 수정: Elasticsearch 클러스터의 index.mapping.total_fields.limit 설정을 수정하여 필드 제한을 늘릴 수 있습니다. 다만, 필드 수가 많아질수록 클러스터의 성능에 영향을 미칠 수 있으므로 신중하게 결정해야 합니다.

    예를 들어, 필드 수 제한을 20000개로 늘리려면 다음과 같이 설정을 변경할 수 있습니다.
    PUT /your_index/_settings
    {
      "index.mapping.total_fields.limit": 20000
    }

위 방법 중 하나를 선택하여 문제를 해결해 보세요. 필요에 따라 Elasticsearch 클러스터 및 색인에 대한 추가적인 조정이 필요할 수 있습니다.

 

BulkIndexError와 관련된 "Limit of total fields [10000] has been exceeded" 오류는 Elasticsearch 인덱스의 전체 필드 수 제한을 초과했기 때문에 발생한 것입니다. 이는 특정 한 항목 때문이라기보다는 인덱스에 추가된 전체 필드의 수가 많기 때문에 발생한 문제입니다. Elasticsearch에서 각 인덱스는 일정 수의 필드를 가질 수 있으며, 이는 index.mapping.total_fields.limit 설정으로 정의됩니다. 기본적으로 이 값은 1000으로 설정되어 있습니다. 이 한계는 인덱스에 존재할 수 있는 필드의 총 개수를 제한하는 것으로, 여기서 필드란 인덱스의 모든 문서에 있는 모든 필드 이름을 의미합니다.

 

예를 들어, 하나의 문서에 10개의 고유한 필드가 있고 다른 문서에 다른 10개의 고유한 필드가 있다면, 총 필드 수는 20개가 됩니다. 이렇게 계산했을 때 전체 필드 수가 설정된 제한을 초과하면 오류가 발생합니다. 이 문제를 해결하기 위해서는 위에서 제안한 방법들을 고려해야 합니다. 가장 간단한 해결책은 index.mapping.total_fields.limit 설정을 증가시키는 것이지만, 이는 장기적으로 성능 문제를 야기할 수 있으므로 주의해서 접근해야 합니다. 더 나은 접근 방법은 필요하지 않은 필드를 제거하거나 데이터 모델을 재구성하는 것입니다.

 

Elasticsearch 인덱스에는 기본적으로 최대 1000개의 필드만 허용되며, 이것이 index.mapping.total_fields.limit 설정으로 제어됩니다. 이 한계를 초과하면 BulkIndexError가 발생합니다.

 

이 문제를 해결하기 위해 추가적인 방법은 다음과 같습니다.

  1. 인덱스 설계 재검토: 인덱스 설계를 재검토하여 데이터 구조를 더 효율적으로 만드는 것도 좋은 방법입니다. 예를 들어, 비슷한 유형의 여러 필드를 하나의 필드로 병합하거나 중첩된 필드를 사용하는 등의 방법이 있습니다.
  2. 샤딩과 인덱스 분할: 데이터를 여러 인덱스로 분할하거나 샤딩을 사용하여 데이터를 더 효율적으로 관리할 수 있습니다.

이러한 해결 방법을 적용할 때는 시스템의 전반적인 성능과 관리 용이성을 고려해야 합니다. 변경을 적용하기 전에는 항상 백업을 수행하고, 가능한 경우 테스트 환경에서 먼저 시도하는 것이 좋습니다.

 

Elasticsearch에서 특정 인덱스에 현재 생성된 필드 목록을 확인하는 방법은 인덱스의 매핑 정보를 조회하는 것입니다. 이를 통해 인덱스에 정의된 모든 필드와 그에 대한 설정을 볼 수 있습니다.

 

Elasticsearch의 매핑 정보를 조회하는 방법은 다음과 같습니다.

  1. HTTP GET 요청을 사용하여 매핑 정보 조회
    Elasticsearch의 REST API를 사용하여 특정 인덱스의 매핑 정보를 조회할 수 있습니다. 다음 명령은 curl을 사용하여 이를 수행하는 예시입니다. 여기서 your_index_name은 조회하고자 하는 인덱스의 이름입니다.이 명령은 해당 인덱스의 매핑 정보를 JSON 형식으로 반환합니다. 여기서 pretty 파라미터는 JSON 출력을 보기 좋게 포맷하는 데 사용됩니다.
    curl -X GET "localhost:9200/your_index_name/_mapping?pretty"
  2. Kibana Dev Tools 사용
    Elasticsearch와 함께 제공되는 Kibana의 Dev Tools를 사용하여도 매핑 정보를 조회할 수 있습니다. Kibana의 Dev Tools에서 다음 쿼리를 실행하면 됩니다:이 쿼리는 특정 인덱스의 매핑 정보를 보여줍니다.
    GET /your_index_name/_mapping

위 방법들을 사용하면 인덱스에 정의된 모든 필드와 해당 필드의 데이터 타입, 설정 등의 정보를 확인할 수 있습니다. 이를 통해 어떤 필드가 많이 사용되고 있는지, 필드의 구성이 어떻게 되어 있는지 분석할 수 있습니다.

728x90

댓글