카테고리 없음

병렬 인덱싱 함수 오버라이드: OpenSearch 성능 최적화

넹넹선생님 2025. 1. 22. 16:18
728x90
반응형

인덱싱은 데이터베이스나 검색 엔진에서 데이터를 빠르게 검색할 수 있도록 준비하는 과정을 말합니다.

그렇다면 대규모 데이터를 인덱싱할 때, 대량의 데이터를 인덱싱할 때, 단일 처리 방식으로는 시간이 많이 걸릴 수 있습니다. 이를 해결하기 위한 방법이 바로 병렬 인덱싱입니다.

 

OpenSearch의 경우 인덱싱 시, 효율적 인덱싱이 가능하다고 합니다.

병렬 인덱싱이란?

병렬 인덱싱은 여러 작업을 동시에 처리하여 인덱싱 속도를 크게 향상시키는 기법입니다. 이를 통해 데이터의 양이 많을 때도 빠르게 인덱싱할 수 있으며, 시스템의 자원을 효율적으로 활용할 수 있습니다.

 

- 병렬 인덱싱의 이점

  • 속도 향상: 여러 작업을 동시에 처리하여 데이터 인덱싱 속도가 크게 향상됩니다.
  • 효율성: 대규모 데이터셋을 처리할 때, 병렬 처리는 성능 최적화에 큰 도움이 됩니다.

이렇게 병렬 인덱싱을 활용하면, 대용량 데이터 처리 시 효율적이고 빠른 성능을 경험할 수 있습니다.

 

코드에서 병렬 인덱싱 구현하기

AWS AI/ML 워크숍에서 제공하는 opensearch.py 코드를 살펴보겠습니다. 이 코드에서는 OpenSearch에 이미지를 효율적으로 인덱싱하기 위한 기능을 구현하고 있습니다. 병렬 인덱싱을 구현하기 위해 concurrent.futures 모듈을 활용하여 여러 프로세스를 동시에 실행하고 있습니다.

1. index_documents 함수

먼저, 여러 문서를 한 번에 인덱싱하는 index_documents 함수가 있습니다. 이 함수는 여러 개의 인덱싱 작업을 동시에 실행하기 위해 ThreadPoolExecutor를 사용합니다.

import concurrent.futures

def index_documents(client, documents):
    # 병렬로 인덱싱 작업을 처리
    with concurrent.futures.ThreadPoolExecutor() as executor:
        # 여러 문서를 동시에 인덱싱
        futures = [executor.submit(index_document, client, doc) for doc in documents]
        # 모든 작업이 완료될 때까지 기다림
        concurrent.futures.wait(futures)

이 함수에서는 ThreadPoolExecutor를 사용하여 문서 인덱싱 작업을 병렬로 실행합니다. 각 문서마다 index_document 함수가 호출되고, submit을 통해 비동기적으로 작업을 큐에 제출합니다. concurrent.futures.wait를 사용하여 모든 작업이 끝날 때까지 기다립니다.

2. index_document 함수

index_document 함수는 단일 문서를 OpenSearch에 인덱싱하는 작업을 수행합니다. 병렬 인덱싱에서는 이 함수가 병렬로 여러 번 호출되어 각 문서를 동시에 인덱싱합니다.

def index_document(client, document):
    # OpenSearch에 문서를 인덱싱
    response = client.index(
        index='my-index',
        body=document
    )
    return response

이 함수는 OpenSearch 클라이언트를 사용하여 문서를 인덱싱하는 작업을 처리합니다. 각 문서마다 인덱싱 작업을 병렬로 처리하므로, 대량의 데이터를 빠르게 인덱싱할 수 있습니다.

3. 병렬 인덱싱 구현의 이점

  • 속도 향상: 병렬 인덱싱을 통해 여러 작업을 동시에 처리할 수 있어, 단일 작업에 비해 훨씬 빠른 속도로 데이터를 인덱싱할 수 있습니다.
  • 자원 최적화: 여러 스레드 또는 프로세스를 활용해 시스템 자원을 효율적으로 사용할 수 있습니다. 이를 통해 더 많은 데이터를 동시에 처리할 수 있습니다.
  • 대규모 데이터 처리: 이미지, 비디오와 같은 대규모 멀티미디어 데이터를 처리할 때 병렬 인덱싱은 필수적인 기술입니다. 이 방법을 사용하면 데이터의 양에 관계없이 인덱싱 속도를 크게 개선할 수 있습니다.

병렬 인덱싱 적용 시 고려 사항

병렬 인덱싱을 구현할 때 몇 가지 중요한 사항을 고려해야 합니다.

  1. 스레드 수 조절: 너무 많은 스레드를 사용하면 시스템의 자원을 초과할 수 있습니다. 적절한 스레드 수를 설정하여 시스템의 과부하를 방지해야 합니다.
  2. 오류 처리: 병렬 작업 중 오류가 발생할 수 있으므로, 각 작업의 오류를 적절히 처리할 수 있는 로직을 구현해야 합니다.
  3. 리소스 모니터링: 병렬 작업을 실행할 때 시스템 리소스를 모니터링하여, 필요시 리소스 할당을 조정할 수 있어야 합니다.

결론

병렬 인덱싱을 활용하면 대량의 데이터를 빠르게 처리하고, OpenSearch와 같은 검색 엔진의 성능을 극대화할 수 있습니다. opensearch.py 코드에서 보여준 것처럼, Python의 concurrent.futures 모듈을 활용하여 여러 스레드나 프로세스를 동시에 실행함으로써, 데이터 인덱싱 속도를 향상시킬 수 있습니다. 이러한 기술은 멀티미디어 데이터를 처리하는 시스템에서 특히 유용하게 사용될 수 있습니다.

 

 

참고 링크: https://github.com/aws-samples/aws-ai-ml-workshop-kr/blob/master/genai/aws-gen-ai-kr/20_applications/06_multi_modal_image_search/search_utils/opensearch.py

728x90
반응형