다음을 통해 공유


Fabric Spark에 대한 네이티브 실행 엔진

네이티브 실행 엔진은 Microsoft Fabric에서 Apache Spark 작업 실행을 위한 획기적인 향상된 기능입니다. 이 벡터화된 엔진은 Lakehouse 인프라에서 직접 실행하여 Spark 쿼리의 성능과 효율성을 최적화합니다. 엔진의 원활한 통합은 코드 수정이 필요하지 않으며 공급업체 잠금을 방지한다는 것을 의미합니다. Apache Spark API를 지원하고 런타임 1.3(Apache Spark 3.5)과 호환되며 Parquet 및 델타 형식 모두에서 작동합니다. OneLake 내의 데이터 위치 또는 바로 가기를 통해 데이터에 액세스하는 경우 네이티브 실행 엔진은 효율성과 성능을 최대화합니다.

네이티브 실행 엔진은 운영 비용을 최소화하면서 쿼리 성능을 크게 향상합니다. TPC-DS 1TB 벤치마크의 유효성을 검사한 기존 OSS(오픈 소스 소프트웨어) Spark에 비해 최대 4배 더 빠른 성능을 달성하는 놀라운 속도 향상을 제공합니다. 엔진은 일상적인 데이터 수집, 일괄 처리 작업 및 ETL(추출, 변환, 로드) 작업부터 복잡한 데이터 과학 분석 및 반응형 대화형 쿼리에 이르기까지 다양한 데이터 처리 시나리오를 관리하는 데 능숙합니다. 사용자는 가속화된 처리 시간, 향상된 처리량 및 최적화된 리소스 사용률의 이점을 누릴 수 있습니다.

네이티브 실행 엔진은 메타가 도입한 C++ 데이터베이스 가속 라이브러리인 Velox와 JVM 기반 SQL 엔진의 실행을 Intel이 도입한 네이티브 엔진으로 오프로드하는 중간 계층인 Apache Gluten(인큐베이팅)의 두 가지 주요 OSS 구성 요소를 기반으로 합니다.

참고 항목

네이티브 실행 엔진은 현재 공개 미리 보기로 제공됩니다. 자세한 내용은 현재 제한 사항을 참조하세요. 추가 비용 없이 워크로드에서 네이티브 실행 엔진을 사용하도록 설정하는 것이 좋습니다. 더 많은 비용을 지불하지 않고 더 빠른 작업 실행의 이점을 얻을 수 있습니다 - 효과적으로 동일한 작업에 대해 더 적은 비용을 지불합니다.

네이티브 실행 엔진을 사용하는 경우

네이티브 실행 엔진은 대규모 데이터 집합에서 쿼리를 실행하기 위한 솔루션을 제공합니다. 기본 데이터 원본의 네이티브 기능을 사용하고 기존 Spark 환경에서 일반적으로 데이터 이동 및 직렬화와 관련된 오버헤드를 최소화하여 성능을 최적화합니다. 엔진은 롤업 해시 집계, BNLJ(브로드캐스트 중첩 루프 조인) 및 정확한 타임스탬프 형식을 비롯한 다양한 연산자 및 데이터 형식을 지원합니다. 그러나 엔진의 기능을 완전히 활용하려면 최적의 사용 사례를 고려해야 합니다.

  • 엔진은 Parquet 및 Delta 형식으로 데이터를 작업할 때 효과적이며, 고유하고 효율적으로 처리할 수 있습니다.
  • 복잡한 변환 및 집계를 포함하는 쿼리는 엔진의 열 형식 처리 및 벡터화 기능에서 크게 도움이 됩니다.
  • 성능 향상은 쿼리가 지원되지 않는 기능이나 식을 방지하여 대체 메커니즘을 트리거하지 않는 시나리오에서 가장 주목할 만한 기능입니다.
  • 엔진은 단순 또는 I/O 바인딩보다는 계산 집약적인 쿼리에 적합합니다.

네이티브 실행 엔진에서 지원하는 연산자 및 함수에 대한 자세한 내용은 Apache Gluten 설명서를 참조 하세요.

네이티브 실행 엔진 사용

미리 보기 단계에서 네이티브 실행 엔진의 전체 기능을 사용하려면 특정 구성이 필요합니다. 다음 절차에서는 Notebook, Spark 작업 정의 및 전체 환경에 대해 이 기능을 활성화하는 방법을 보여 줍니다.

Important

네이티브 실행 엔진은 런타임 1.3(Apache Spark 3.5, Delta Lake 3.2)인 최신 GA 런타임 버전을 지원합니다. 런타임 1.3에서 네이티브 실행 엔진이 릴리스되면서 이전 버전인 런타임 1.2(Apache Spark 3.4, Delta Lake 2.4)에 대한 지원이 중단되었습니다. 모든 고객이 최신 런타임 1.3으로 업그레이드하는 것이 좋습니다. 런타임 1.2에서 네이티브 실행 엔진을 사용하는 경우 곧 네이티브 가속이 비활성화됩니다.

환경 수준에서 사용

균일한 성능 향상을 보장하려면 환경과 연결된 모든 작업 및 Notebook에서 네이티브 실행 엔진을 사용하도록 설정합니다.

  1. 환경 설정으로 이동합니다.

  2. Spark 컴퓨팅으로 이동합니다.

  3. 가속 탭으로 이동합니다.

  4. 네이티브 실행 엔진 사용으로 레이블이 지정된 확인란을 선택합니다.

  5. 변경 내용을 저장하고 게시 합니다.

    환경 항목 내에서 네이티브 실행 엔진을 사용하도록 설정하는 방법을 보여 주는 스크린샷

환경 수준에서 사용하도록 설정하면 모든 후속 작업 및 Notebook이 설정을 상속합니다. 이 상속을 통해 환경에서 만든 모든 새 세션 또는 리소스가 향상된 실행 기능의 이점을 자동으로 활용할 수 있습니다.

Important

이전에는 환경 구성 내에서 Spark 설정을 통해 네이티브 실행 엔진을 사용하도록 설정했습니다. 최신 업데이트(롤아웃 진행 중)를 통해 환경 설정의 가속 탭에 토글 단추를 도입하여 이를 간소화했습니다. 새 토글을 사용하여 네이티브 실행 엔진을 다시 사용하도록 설정합니다. 네이티브 실행 엔진을 계속 사용하려면 환경 설정의 가속 탭으로 이동하여 토글 단추를 통해 활성화하세요. 이제 UI의 새 토글 설정이 이전 Spark 속성 구성보다 우선합니다. 이전에 Spark 설정을 통해 네이티브 실행 엔진을 사용하도록 설정한 경우 UI 토글을 통해 다시 사용하도록 설정할 때까지 사용하지 않도록 설정됩니다.

Notebook 또는 Spark 작업 정의에 사용하도록 설정

단일 Notebook 또는 Spark 작업 정의에 대해 네이티브 실행 엔진을 사용하도록 설정하려면 실행 스크립트의 시작 부분에 필요한 구성을 통합해야 합니다.

%%configure 
{ 
   "conf": {
       "spark.native.enabled": "true", 
   } 
} 

Notebook의 경우 첫 번째 셀에 필요한 구성 명령을 삽입합니다. Spark 작업 정의의 경우 Spark 작업 정의의 최전방에 구성을 포함합니다. 네이티브 실행 엔진은 라이브 풀과 통합되므로 기능을 사용하도록 설정하면 새 세션을 시작할 필요 없이 즉시 적용됩니다.

Important

네이티브 실행 엔진의 구성은 Spark 세션이 시작되기 전에 수행해야 합니다. Spark 세션이 시작되면 spark.shuffle.manager 설정을 변경할 수 없게 되며 변경할 수 없습니다. 이러한 구성이 Notebook의 %%configure 블록 내에서 설정되었는지 또는 Spark 작업 정의에 대한 Spark 세션 작성기에서 설정되었는지 확인합니다.

쿼리 수준에서 제어

UI와 원활하게 통합된 테넌트, 작업 영역 및 환경 수준에서 네이티브 실행 엔진을 사용하도록 설정하는 메커니즘은 현재 개발 중입니다. 그 동안 특정 쿼리에 대해 네이티브 실행 엔진을 사용하지 않도록 설정할 수 있습니다. 특히 현재 지원되지 않는 연산자가 포함된 경우(제한 사항 참조) 사용하지 않도록 설정하려면 쿼리를 포함하는 특정 셀에 대해 Spark 구성 spark.native.enabled를 false로 설정합니다.

%%sql 
SET spark.native.enabled=FALSE; 

Notebook 내에서 네이티브 실행 엔진을 사용하지 않도록 설정하는 방법을 보여 주는 스크린샷

네이티브 실행 엔진이 비활성화된 쿼리를 실행한 후 spark.native.enabled를 true로 설정하여 후속 셀에 대해 다시 사용하도록 설정해야 합니다. Spark는 코드 셀을 순차적으로 실행하기 때문에 이 단계가 필요합니다.

%%sql 
SET spark.native.enabled=TRUE; 

엔진에서 실행하는 작업 식별

Apache Spark 작업의 연산자가 네이티브 실행 엔진을 사용하여 처리되었는지 확인하는 몇 가지 방법이 있습니다.

Spark UI 및 Spark 기록 서버

Spark UI 또는 Spark 기록 서버에 액세스하여 검사해야 하는 쿼리를 찾습니다. 인터페이스 내에 표시되는 쿼리 계획에서 접미사 Transformer, NativeFileScan 또는 VeloxColumnarToRowExec로 끝나는 노드 이름을 찾습니다. 접미사는 네이티브 실행 엔진이 작업을 실행했음을 나타냅니다. 예를 들어 노드는 RollUpHashAggregateTransformer, ProjectExecTransformer, BroadcastHashJoinExecTransformer, ShuffledHashJoinExecTransformer 또는 BroadcastNestedLoopJoinExecTransformer로 레이블이 지정될 수 있습니다.

접미사 Transformer로 끝나는 DAG 시각화를 확인하는 방법을 보여 주는 스크린샷

DataFrame 설명

또는 Notebook에서 df.explain() 명령을 실행하여 실행 계획을 볼 수 있습니다. 출력 내에서 동일한 Transformer, NativeFileScan 또는 VeloxColumnarToRowExec 접미사를 찾습니다. 이 메서드는 특정 작업이 네이티브 실행 엔진에서 처리되고 있는지 여부를 확인하는 빠른 방법을 제공합니다.

쿼리에 대한 실제 계획을 확인하고 네이티브 실행 엔진에서 쿼리가 실행되었는지 확인하는 방법을 보여 주는 스크린샷

대체 메커니즘

일부 경우에 네이티브 실행 엔진은 지원되지 않는 기능과 같은 이유로 인해 쿼리를 실행하지 못할 수 있습니다. 이러한 경우 작업은 기존 Spark 엔진으로 돌아갑니다. 이 자동 대체 메커니즘을 사용하면 워크플로가 중단되지 않습니다.

대체 메커니즘을 보여 주는 스크린샷

대체 메커니즘과 연결된 로그를 확인하는 방법을 보여 주는 스크린샷

엔진에서 실행한 쿼리 및 데이터 프레임 모니터링

네이티브 실행 엔진이 SQL 쿼리 및 DataFrame 작업에 적용되는 방식을 더 잘 이해하고 단계 및 연산자 수준으로 드릴다운하려면 Spark UI 및 Spark 기록 서버를 참조하여 네이티브 엔진 실행에 대한 자세한 정보를 확인할 수 있습니다.

네이티브 실행 엔진 탭

새 '글루텐 SQL/데이터 프레임' 탭으로 이동하여 글루텐 빌드 정보 및 쿼리 실행 세부 정보를 볼 수 있습니다. 쿼리 테이블은 네이티브 엔진에서 실행되는 노드 수와 각 쿼리에 대한 JVM으로 떨어지는 노드 수에 대한 인사이트를 제공합니다.

네이티브 실행 엔진 탭을 보여 주는 스크린샷

쿼리 실행 그래프

Apache Spark 쿼리 실행 계획 시각화에 대한 쿼리 설명을 클릭할 수도 있습니다. 실행 그래프는 단계 및 해당 작업 간에 네이티브 실행 세부 정보를 제공합니다. 배경색은 실행 엔진을 구분합니다. 녹색은 네이티브 실행 엔진을 나타내고 연한 파란색은 작업이 기본 JVM 엔진에서 실행 중임을 나타냅니다.

쿼리 실행 그래프를 보여 주는 스크린샷

제한 사항

네이티브 실행 엔진은 Apache Spark 작업에 대한 성능을 향상하지만 현재 제한 사항에 유의하세요.

  • 병합 작업, 검사점 검사 및 삭제 벡터를 포함하여 일부 델타 관련 작업은 지원되지 않습니다(아직 적극적으로 작업 중이므로).
  • 특정 Spark 기능 및 식은 SPARK 구조적 스트리밍뿐만 아니라 UDF(사용자 정의 함수) 및 array_contains 함수와 같은 네이티브 실행 엔진과 호환되지 않습니다. 이러한 호환되지 않는 작업 또는 함수를 가져온 라이브러리의 일부로 사용하면 Spark 엔진이 대체됩니다.
  • 프라이빗 엔드포인트를 활용하는 스토리지 솔루션의 검색은 지원되지 않습니다(아직 적극적으로 작업 중임).
  • 엔진은 ANSI 모드를 지원하지 않으므로 검색하고 ANSI 모드를 사용하도록 설정하면 자동으로 바닐라 Spark로 대체됩니다.

쿼리에서 날짜 필터를 사용하는 경우 성능 문제를 방지하기 위해 비교의 양쪽에 있는 데이터 형식이 일치하는지 확인해야 합니다. 데이터 형식이 일치하지 않으면 쿼리 실행이 향상되지 않을 수 있으며 명시적 캐스팅이 필요할 수 있습니다. 일치하지 않는 형식이 항상 자동으로 캐스팅되지 않으므로 비교의 LHS(왼쪽) 및 RHS(오른쪽)의 데이터 형식이 동일한지 항상 확인합니다. 형식 불일치가 불가피한 경우 명시적 캐스팅을 사용하여 데이터 형식과 일치합니다(예: CAST(order_date AS DATE) = '2024-05-20'.). 캐스팅이 필요한 데이터 형식이 일치하지 않는 쿼리는 네이티브 실행 엔진에 의해 가속화되지 않으므로 형식 일관성을 보장하는 것이 성능 유지에 매우 중요합니다. 예를 들어, order_dateDATETIME이고 문자열이 DATEorder_date = '2024-05-20' 대신 명시적으로 order_dateDATE로 캐스팅하여 일관된 데이터 유형을 보장하고 성능을 개선할 수 있습니다.