성능 개선을 위한 주요 중점 영역 - Amazon EMR

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

성능 개선을 위한 주요 중점 영역

Trino는 쿼리 병렬 처리 및 메모리 최적화를 극대화합니다. 이 아키텍처는 효율적으로 규모를 조정하면서 다양한 여러 데이터 소스를 쿼리할 수 있도록 하여 유연성을 제공합니다. Trino에서 성능 개선의 주요 영역에는 아래 나열된 영역이 포함됩니다.

메모리 최적화

Trino의 메모리 관리는 특히 크고 복잡한 쿼리를 실행할 때 고성능과 안정성을 달성하는 데 매우 중요합니다. Trino는 분산 메모리 모델을 사용합니다. 이 모델에서는 작업, 집계, 조인 및 기타 작업을 처리하기 위해 워커 노드에 메모리가 할당됩니다. 다음 목록은 이러한 설정 모음을 소개합니다.

  • query.max-memory – 전체 클러스터에서 단일 쿼리에 사용할 수 있는 최대 메모리를 설정합니다. 이는 하드 제한입니다. 쿼리가 이 메모리를 초과하면 실패합니다.

  • query.max-memory-per-node - 쿼리가 각 워커 노드에서 사용할 수 있는 최대 메모리를 정의합니다. 이를 설정하면 단일 쿼리가 워커의 리소스를 독점하지 않습니다.

  • JVM 힙 크기 - JVM 수준에서 구성되며 각 노드에서 Trino 서버 프로세스의 최대 힙 크기를 설정합니다. 이 값은 일반적으로 Trino의 메모리 관련 구성(query.max-memory-per-nodememory.heap-headroom-per-node의 합계)보다 커야 JVM 수준에서 시스템의 메모리 부족을 방지할 수 있습니다.

  • memory.heap-headroom-per-node - 쿼리가 아닌 작업의 경우 JVM 힙 크기를 벗어나도록 메모리의 버퍼 양을 지정합니다. 이는 내부 작업 및 가비지 수집을 위한 충분한 오버헤드를 보장하는 데 매우 중요합니다.

동적 필터링

Trino의 동적 필터링은 특히 조인 중에 처리되는 데이터의 양을 줄여 쿼리 성능을 개선하는 최적화 기법입니다. 필터 조건을 동적으로 적용하여 다른 쪽에서 볼 수 있는 데이터를 기반으로 조인의 한쪽에서 스캔하는 데이터를 제한합니다. 이는 조인의 한쪽이 매우 선택적인(즉, 작은 데이터 하위 집합을 포함하는) 쿼리에 특히 유용합니다. Amazon EMR에서 기본적으로 활성화됩니다. 다음은 쿼리의 예입니다.

SELECT orders.order_id, orders.total_amount FROM orders JOIN customers ON orders.customer_id = customers.customer_id WHERE customers.country = 'France';

동적 필터링이 없는 경우 Trino는 조인에서 전체 주문 테이블을 스캔하지만, 일부 고객(프랑스)만 관련이 있습니다. 이 방법은 주문 테이블의 모든 행을 읽어 I/O 및 처리 비용이 높습니다. 동적 필터링을 사용하면 Trino는 처음에 더 작은 customers 테이블을 스캔하고 프랑스의 고객에 대해서만 customer_id 값을 검색한 다음이 하위 집합을 주문에 필터로 적용합니다. 즉, customer_id가 필터링된 하위 집합과 일치하는 orders의 관련 행만 스캔되므로 처리된 레코드가 크게 줄어듭니다.

디스크에 유출

Trino에서 디스크 유출을 사용하면 중간 쿼리 결과를 디스크로 오프로드할 수 있으므로 query_max_memory 또는 query_max_memory_per_node에서 설정한 메모리 제한을 초과하더라도 메모리 집약적인 쿼리를 완료할 수 있습니다. 기본적으로 Trino는 이러한 제한을 적용하여 공정한 메모리 할당을 보장하고 클러스터 교착 상태를 방지합니다. 그러나 대규모 쿼리가 이러한 제한을 초과하면 종료될 위험이 있습니다. 디스크 유출은 revocable memory를 사용하여 이 문제를 해결하므로 다른 곳에서 리소스가 필요한 경우 취소할 수 있는 추가 메모리를 쿼리에서 빌릴 수 있습니다. 메모리가 취소되면 중간 데이터가 디스크로 유출되어 메모리 제한을 초과하지 않고 쿼리를 계속 처리할 수 있습니다. 강제로 디스크로 유출되는 쿼리는 실행 시간이 길어질 수 있으므로 기본적으로 비활성화되어 있습니다. Amazon EMR에서 유출을 활성화하려면 다음 구성을 사용합니다.

  • spill-enabled=true - 메모리 사용량이 사용 가능한 임계값을 초과할 때 디스크 유출을 활성화합니다.

  • spill-paths - 유출된 데이터가 저장되는 spill-paths=/mnt/spill 디렉터리를 정의합니다.