Amazon EMR에서 구체화된 뷰 사용 - Amazon EMR

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

Amazon EMR에서 구체화된 뷰 사용

Amazon EMR 릴리스 7.12.0 이상은 AWS Glue 데이터 카탈로그에서 Apache Iceberg 구체화된 뷰 생성 및 관리를 지원합니다. 구체화된 뷰는 SQL 쿼리의 사전 계산된 결과를 Apache Iceberg 형식으로 저장하고 기본 소스 테이블이 변경될 때 증분 업데이트하는 관리형 테이블입니다. 구체화된 뷰를 사용하여 데이터 변환 파이프라인을 간소화하고 복잡한 분석 워크로드의 쿼리 성능을 가속화할 수 있습니다.

Amazon EMR에서 Spark를 사용하여 구체화된 뷰를 생성하면 뷰 정의와 메타데이터가 AWS Glue 데이터 카탈로그에 저장됩니다. 사전 계산된 결과는 AWS 계정 내의 Amazon S3 Tables 버킷 또는 Amazon S3 범용 버킷에 Apache Iceberg 테이블로 저장됩니다. AWS Glue 데이터 카탈로그는 관리형 컴퓨팅 인프라를 사용하여 소스 테이블을 자동으로 모니터링하고 구체화된 뷰를 새로 고칩니다.

구체화된 뷰가 Amazon EMR에서 작동하는 방식

구체화된 뷰는 Apache Spark의 Iceberg 지원을 통해 Amazon EMR과 통합됩니다. AWS Glue 데이터 카탈로그를 사용하도록 Spark 세션을 구성할 때 표준 SQL 구문을 사용하여 구체화된 뷰를 생성할 수 있습니다. Spark 옵티마이저는 더 나은 성능을 제공할 때 구체화된 뷰를 사용하도록 쿼리를 자동으로 재작성할 수 있으므로 애플리케이션 코드를 수동으로 수정할 필요가 없습니다.

AWS Glue 데이터 카탈로그는 다음을 포함하여 구체화된 뷰 유지 관리의 모든 운영 측면을 처리합니다.

  • Apache Iceberg의 메타데이터 계층을 사용하여 소스 테이블의 변경 사항 탐지

  • 관리형 Spark 컴퓨팅을 사용하여 새로 고침 작업 예약 및 실행

  • 데이터 변경을 기반으로 전체 새로 고침 수행 또는 증분 새로 고침 수행 여부 결정

  • 다중 엔진 액세스를 위해 사전 계산된 결과를 Apache Iceberg 형식으로 저장

일반 테이블에 사용하는 것과 동일한 Spark SQL 인터페이스를 사용하여 Amazon EMR에서 구체화된 뷰를 쿼리할 수 있습니다. Amazon Athena와 Amazon Redshift를 포함한 다른 서비스에서도 사전 계산된 데이터에 액세스할 수 있습니다.

사전 조건

Amazon EMR에서 구체화된 뷰를 사용하려면 다음이 필요합니다.

  • AWS 계정

  • 릴리스 7.12.0 이상을 실행하는 Amazon EMR 클러스터

  • AWS Glue 데이터 카탈로그에 등록된 Apache Iceberg 형식의 소스 테이블

  • AWS 소스 테이블 및 대상 데이터베이스에 대해 구성된 Lake Formation 권한

  • 구체화된 뷰 데이터를 저장하기 위해 Lake Formation에 AWS 등록된 S3 Tables 버킷 또는 S3 범용 버킷

구체화된 뷰를 사용하도록 Spark 구성

구체화된 뷰를 생성하고 관리하려면 필수 Iceberg 확장 및 카탈로그 설정으로 Spark 세션을 구성합니다. 구성은 소스 테이블과 구체화된 뷰가 S3 Tables 버킷을 사용하는지 아니면 S3 범용 버킷을 사용하는지에 따라 달라집니다.

S3 테이블 구성

구체화된 뷰에 S3 Tables 버킷을 사용하는 경우 소스 테이블과 구체화된 뷰에 대해 별도의 카탈로그 참조를 구성합니다.

spark-sql \ --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions \ --conf spark.sql.catalog.glue_catalog=org.apache.iceberg.spark.SparkCatalog \ --conf spark.sql.catalog.glue_catalog.type=glue \ --conf spark.sql.catalog.glue_catalog.warehouse=s3://amzn-s3-demo-bucket/warehouse \ --conf spark.sql.catalog.glue_catalog.glue.region=us-east-1 \ --conf spark.sql.catalog.glue_catalog.glue.id=111122223333 \ --conf spark.sql.catalog.glue_catalog.glue.account-id=111122223333 \ --conf spark.sql.catalog.glue_catalog.glue.lakeformation-enabled=true \ --conf spark.sql.catalog.s3t_catalog=org.apache.iceberg.spark.SparkCatalog \ --conf spark.sql.catalog.s3t_catalog.type=glue \ --conf spark.sql.catalog.s3t_catalog.glue.id=111122223333:s3tablescatalog/my-table-bucket \ --conf spark.sql.catalog.s3t_catalog.glue.account-id=111122223333 \ --conf spark.sql.catalog.s3t_catalog.glue.lakeformation-enabled=true \ --conf spark.sql.catalog.s3t_catalog.warehouse=s3://amzn-s3-demo-bucket/mv-warehouse \ --conf spark.sql.catalog.s3t_catalog.glue.region=us-east-1 \ --conf spark.sql.defaultCatalog=s3t_catalog \ // turn on automatic query rewrite (optional) --conf spark.sql.optimizer.answerQueriesWithMVs.enabled=true

S3 범용 버킷에 대한 구성

S3 범용 버킷을 사용하는 경우 단일 카탈로그 참조를 구성합니다.

spark-sql \ --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions \ --conf spark.sql.catalog.glue_catalog=org.apache.iceberg.spark.SparkCatalog \ --conf spark.sql.catalog.glue_catalog.type=glue \ --conf spark.sql.catalog.glue_catalog.warehouse=s3://amzn-s3-demo-bucket/warehouse \ --conf spark.sql.catalog.glue_catalog.glue.region=us-east-1 \ --conf spark.sql.catalog.glue_catalog.glue.id=111122223333 \ --conf spark.sql.catalog.s3t_catalog.glue.account-id=111122223333 \ --conf spark.sql.catalog.s3t_catalog.glue.lakeformation-enabled=true \ --conf spark.sql.defaultCatalog=glue_catalog \ // turn on automatic query rewrite (optional) --conf spark.sql.optimizer.answerQueriesWithMVs.enabled=true

증분 새로 고침 활성화

증분 새로 고침 최적화를 활성화하려면 Spark 세션에 다음 구성 속성을 추가합니다.

spark-sql \ --conf spark.sql.optimizer.incrementalMVRefresh.enabled=true \

구성 파라미터

다음 구성 파라미터는 구체화된 뷰 동작을 제어합니다.

  • spark.sql.extensions - 구체화된 뷰 지원에 필요한 Iceberg Spark 세션 확장을 활성화합니다.

  • spark.sql.optimizer.answerQueriesWithMVs.enabled - 구체화된 뷰를 사용하기 위한 자동 쿼리 재작성을 활성화합니다. 이 최적화를 활성화하려면 true로 설정합니다.

  • spark.sql.optimizer.incrementalMVRefresh.enabled - 증분 새로 고침 최적화를 활성화합니다. 새로 고침 작업 중에 변경된 데이터만 처리하려면 true로 설정합니다.

구체화된 뷰 생성

CREATE MATERIALIZED VIEW SQL 문을 사용하여 구체화된 뷰를 생성합니다. 뷰 정의는 변환 로직을 하나 이상의 소스 테이블을 참조하는 SQL 쿼리로 지정합니다.

DLLs

뷰 생성

{ CREATE OR REPLACE MATERIALIZED VIEW | CREATE MATERIALIZED VIEW [ IF NOT EXISTS ] } view_identifier [ view_clauses ] [ schedule_clauses ] AS [ select_statement ] view_clauses = { [ LOCATION location ] | [ PARTITIONED BY (col [, ...]) ] | [ COMMENT view_comment ] | [ SCHEDULE [ REFRESH ] schedule_clause ] } schedule_clause = { EVERY number { HOUR | HOURS | DAY | DAYS | WEEK | WEEKS } }
참고

view_clauses는 select_statement 앞에 나타나야 합니다.

기본 구체화된 뷰 생성

다음 예제에서는 고객별로 주문 데이터를 집계하는 구체화된 보기를 생성하고 보기 정의에서 세 부분으로 구성된 이름 지정 규칙과 함께 정규화된 테이블 이름을 사용합니다.

CREATE MATERIALIZED VIEW customer_orders AS SELECT customer_name, COUNT(*) as order_count, SUM(amount) as total_amount FROM glue_catalog.sales.orders GROUP BY customer_name;

자동 새로 고침을 사용하여 구체화된 뷰 생성

자동 새로 고침을 구성하려면 뷰 정의에서 세 부분으로 구성된 이름 지정 규칙과 함께 정규화된 테이블 이름을 사용하여 뷰를 생성할 때 새로 고침 일정을 지정합니다.

CREATE MATERIALIZED VIEW customer_orders SCHEDULE REFRESH EVERY 1 HOUR AS SELECT customer_name, COUNT(*) as order_count, SUM(amount) as total_amount FROM glue_catalog.sales.orders GROUP BY customer_name;

카탈로그 간 참조를 사용하여 구체화된 뷰 생성

소스 테이블이 구체화된 뷰와 다른 카탈로그에 있는 경우 뷰 이름과 뷰 정의 모두에서 3가지 부분으로 구성된 이름 지정 규칙으로 정규화된 테이블 이름을 사용합니다.

CREATE MATERIALIZED VIEW s3t_catalog.analytics.customer_summary AS SELECT customer_name, COUNT(*) as order_count, SUM(amount) as total_amount FROM glue_catalog.sales.orders GROUP BY customer_name;

구체화된 뷰 쿼리

구체화된 뷰를 생성한 후 표준 SQL SELECT 문을 사용하여 다른 테이블처럼 쿼리할 수 있습니다.

SELECT * FROM customer_orders;

자동 쿼리 재작성

자동 쿼리 재작성이 활성화되면 Spark 옵티마이저는 쿼리를 분석하여 성능을 개선할 수 있을 때 구체화된 뷰를 자동으로 사용합니다. 예를 들어 다음 쿼리를 실행하는 경우:

SELECT customer_name, COUNT(*) as order_count, SUM(amount) as total_amount FROM orders GROUP BY customer_name;

Spark 옵티마이저는 구체화된 뷰가 최신 상태인 경우 기본 주문 테이블을 처리하는 대신 customer_orders 구체화된 뷰를 사용하도록 이 쿼리를 자동으로 재작성합니다.

자동 쿼리 재작성 확인

쿼리가 자동 쿼리 재작성을 사용하는지 확인하려면 EXPLAIN EXTENDED 명령을 사용합니다.

EXPLAIN EXTENDED SELECT customer_name, COUNT(*) as order_count, SUM(amount) as total_amount FROM orders GROUP BY customer_name;

실행 계획의 BatchScan 작업에서 구체화된 뷰 이름을 찾습니다. 계획에 BatchScan glue_catalog.sales.orders 대신 BatchScan glue_catalog.analytics.customer_orders가 표시되면 구체화된 뷰를 사용하도록 쿼리가 자동으로 재작성된 것입니다.

참고

자동 쿼리 재작성에는 구체화된 뷰를 생성한 후 Spark 메타데이터 캐시가 채워지는 데 시간이 필요합니다. 이 프로세스는 일반적으로 30초 내에 완료됩니다.

구체화된 뷰 새로 고침

전체 새로 고침과 증분 새로 고침이라는 2가지 방법을 사용하여 구체화된 뷰를 새로 고칠 수 있습니다. 전체 새로 고침은 모든 기본 테이블 데이터에서 전체 구체화된 뷰를 다시 계산하는 반면, 증분 새로 고침은 마지막 새로 고침 이후 변경된 데이터만 처리합니다.

수동 전체 새로 고침

구체화된 뷰의 전체 새로 고침을 수행하려면

REFRESH MATERIALIZED VIEW customer_orders FULL;

이 명령을 실행한 후 구체화된 뷰를 쿼리하여 업데이트된 결과를 확인합니다.

SELECT * FROM customer_orders;

수동 증분 새로 고침

증분 새로 고침을 수행하려면 Spark 세션 구성에서 증분 새로 고침이 활성화되어 있는지 확인한 후 다음을 실행합니다.

REFRESH MATERIALIZED VIEW customer_orders;

AWS Glue 데이터 카탈로그는 보기 정의와 변경된 데이터의 양을 기반으로 증분 새로 고침을 적용할 수 있는지 여부를 자동으로 결정합니다. 증분 새로 고침이 불가능한 경우 작업은 전체 새로 고침으로 돌아갑니다.

증분 새로 고침 실행 확인

증분 새로 고침이 성공적으로 실행되었는지 확인하려면 다음 명령을 실행하여 lastRefreshType 테이블 속성을 확인할 수 있습니다.

SHOW TBLPROPERTIES <mvName>("lastRefreshType")

또한 Spark 로그 구성을 수정하여 디버그 로깅을 활성화하여 이를 달성할 수도 있습니다.

  1. Spark log4j 구성 파일을 엽니다.

    sudo vim /usr/lib/spark/conf/log4j2.properties
  2. 다음 로거 구성을 추가합니다.

    logger.spark.name = org.apache.spark.sql logger.spark.level = debug logger.inmemcache.name = org.apache.spark.sql.InMemMvMetadataCache logger.inmemcache.level = off
  3. 새로 고침 작업을 실행한 후 Spark 출력에서 다음 메시지를 검색합니다.

    DEBUG RefreshMaterializedViewExec: Executed Incremental Refresh

구체화된 뷰 관리

Amazon EMR은 구체화된 뷰의 수명 주기를 관리하기 위한 SQL 명령을 제공합니다.

구체화된 뷰 설명

정의, 새로 고침 상태, 마지막 새로 고침 타임스탬프를 포함하여 구체화된 뷰에 대한 메타데이터를 보려면:

DESCRIBE EXTENDED customer_orders;

구체화된 뷰 변경

기존 구체화된 뷰의 새로 고침 일정을 수정하려면

ALTER MATERIALIZED VIEW customer_orders ADD SCHEDULE REFRESH EVERY 2 HOURS;

자동 새로 고침을 제거하려면

ALTER MATERIALIZED VIEW customer_orders DROP SCHEDULE;

구체화된 뷰 삭제

구체화된 뷰를 삭제하려면

DROP MATERIALIZED VIEW customer_orders;

이 명령은 AWS Glue 데이터 카탈로그에서 구체화된 뷰 정의를 제거하고 S3 버킷에서 기본 Iceberg 테이블 데이터를 삭제합니다.

구체화된 뷰에 대한 권한

구체화된 뷰를 생성하고 관리하려면 AWS Lake Formation 권한을 구성해야 합니다. 구체화된 뷰를 생성하는 IAM 역할(정의자 역할)에는 소스 테이블 및 대상 데이터베이스에 대한 특정 권한이 필요합니다.

정의자 역할에 필요한 권한

정의자 역할에는 다음과 같은 Lake Formation 권한이 있어야 합니다.

  • 소스 테이블에서 - 행, 열 또는 셀 필터가 없는 SELECT 또는 ALL 권한

  • 대상 데이터베이스에서 - CREATE_TABLE 권한

  • Glue 데이터 카탈로그에서 AWS - GetTable 및 CreateTable API 권한

구체화된 뷰를 생성하면 정의자 역할의 ARN이 뷰 정의에 저장됩니다. AWS Glue 데이터 카탈로그는 자동 새로 고침 작업을 실행할 때이 역할을 수임합니다. 정의자 역할이 소스 테이블에 대한 액세스 권한을 상실하면 권한이 복원될 때까지 새로 고침 작업이 실패합니다.

구체화된 뷰에 대한 액세스 권한 부여

다른 사용자에게 구체화된 뷰를 쿼리할 수 있는 액세스 권한을 부여하려면 AWS Lake Formation을 사용하여 구체화된 뷰 테이블에 대한 SELECT 권한을 부여합니다. 사용자는 기본 소스 테이블에 직접 액세스할 필요 없이 구체화된 뷰를 쿼리할 수 있습니다.

Lake Formation 권한 구성에 대한 자세한 내용은 AWS Lake Formation 개발자 안내서의 데이터 카탈로그 리소스에 대한 권한 부여 및 취소를 참조하세요.

구체화된 뷰 작업 모니터링

AWS Glue 데이터 카탈로그는 구체화된 보기 새로 고침 작업에 대한 지표와 로그를 Amazon CloudWatch에 게시합니다. CloudWatch 지표를 통해 새로 고침 상태, 기간, 처리되는 데이터 볼륨을 모니터링할 수 있습니다.

새로 고침 지표 보기

구체화된 보기 새로 고침 지표를 보려면:

  1. CloudWatch 콘솔을 엽니다.

  2. 탐색 창에서 지표를 선택합니다.

  3. Glue 네임스페이스를 선택합니다.

  4. 구체화된 뷰 이름을 기준으로 지표를 필터링합니다.

경보 설정

새로 고침 작업이 실패하거나 예상 기간을 초과할 때 알림을 받으려면 구체화된 뷰 지표에 대한 CloudWatch 경보를 생성합니다. Amazon EventBridge 규칙을 구성하여 새로 고침 이벤트에 대한 자동 응답을 트리거할 수도 있습니다.

예제: 전체 워크플로

다음 예제에서는 Amazon EMR에서 구체화된 뷰를 생성하고 사용하기 위한 전체 워크플로를 보여줍니다.

  1. SSH를 사용하여 EMR 클러스터 프라이머리 노드에 연결합니다.

  2. 샘플 데이터가 포함된 기본 테이블을 생성합니다.

    spark-sql \ --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions \ --conf spark.sql.catalog.glue_catalog=org.apache.iceberg.spark.SparkCatalog \ --conf spark.sql.catalog.glue_catalog.type=glue \ --conf spark.sql.catalog.glue_catalog.warehouse=s3://amzn-s3-demo-bucket/warehouse \ --conf spark.sql.catalog.glue_catalog.glue.region=us-east-1 \ --conf spark.sql.catalog.glue_catalog.glue.id=111122223333 \ --conf spark.sql.catalog.glue_catalog.glue.account-id=111122223333 \ --conf spark.sql.catalog.glue_catalog.glue.lakeformation-enabled=true \ --conf spark.sql.defaultCatalog=glue_catalog \ --conf spark.sql.optimizer.answerQueriesWithMVs.enabled=true CREATE DATABASE IF NOT EXISTS sales; USE sales; CREATE TABLE orders ( id INT, customer_name STRING, amount DECIMAL(10,2), order_date DATE ); INSERT INTO orders VALUES (1, 'John Doe', 150.00, DATE('2024-01-15')), (2, 'Jane Smith', 200.50, DATE('2024-01-16')), (3, 'Bob Johnson', 75.25, DATE('2024-01-17'));
  3. 구체화된 뷰 생성:

    CREATE MATERIALIZED VIEW customer_summary AS SELECT customer_name, COUNT(*) as order_count, SUM(amount) as total_amount FROM glue_catalog.sales.orders GROUP BY customer_name;
  4. 구체화된 뷰를 쿼리합니다.

    SELECT * FROM customer_summary;
  5. 기본 테이블에 추가 데이터를 삽입합니다.

    INSERT INTO orders VALUES (4, 'Jane Smith', 350.00, DATE('2024-01-18')), (5, 'Bob Johnson', 100.25, DATE('2024-01-19'));
  6. 구체화된 뷰를 새로 고침:

    REFRESH MATERIALIZED VIEW customer_summary FULL;
  7. 업데이트된 결과를 확인합니다.

    SELECT * FROM customer_summary;

고려 사항 및 제한 사항

Amazon EMR에서 구체화된 뷰를 사용할 때는 다음 사항을 고려하세요.

  • 구체화된 뷰에는 Amazon EMR 릴리스 7.12.0 이상이 필요합니다.

  • 소스 테이블은 AWS Glue 데이터 카탈로그에 등록된 Apache Iceberg 테이블이어야 합니다. Apache Hive, Apache Hudi, Linux Foundation Delta Lake 테이블은 시작 시 지원되지 않습니다.

  • 소스 테이블은 구체화된 뷰와 동일한 AWS 리전 및 AWS 계정에 있어야 합니다.

  • 모든 소스 테이블은 AWS Lake Formation에서 관리해야 합니다. IAM 전용 권한과 하이브리드 액세스는 지원되지 않습니다.

  • 구체화된 뷰는 AWS Glue 데이터 카탈로그 뷰, 다중 언어 뷰 또는 기타 구체화된 뷰를 소스 테이블로 참조할 수 없습니다.

  • 뷰 정의자 역할에는 행, 열 또는 셀 필터가 적용되지 않은 모든 소스 테이블에 대한 전체 읽기 액세스 권한(SELECT 또는 ALL 권한)이 있어야 합니다.

  • 구체화된 뷰는 소스 테이블과 최종적으로 일관됩니다. 새로 고침 기간 동안 쿼리는 오래된 데이터를 반환할 수 있습니다. 즉각적인 일관성을 위해 수동 새로 고침을 실행합니다.

  • 최소 자동 새로 고침 간격은 1시간입니다.

  • 증분 새로 고침은 제한된 SQL 작업 하위 집합을 지원합니다. 뷰 정의는 단일 SELECT-FROM-WHERE-GROUP BY-HAVING 블록이어야 하며, 설정 작업, 하위 쿼리, SELECT 또는 집계 함수의 DISTINCT 키워드, 창 함수 또는 INNER JOIN 이외의 조인을 포함할 수 없습니다.

  • 증분 새로 고침은 사용자 정의 함수 또는 특정 내장 함수를 지원하지 않습니다. Spark SQL 내장 함수의 하위 집합만 지원됩니다.

  • 쿼리 자동 재작성은 증분 새로 고침 제한과 유사한 제한된 SQL 하위 집합에 정의가 속하는 구체화된 뷰만 고려합니다.

  • 전체 새로 고침 작업은 전체 테이블을 재정의하고 이전 스냅샷을 사용할 수 없게 만듭니다.

  • 영숫자와 밑줄 이외의 특수 문자가 포함된 식별자는 CREATE MATERIALIZED VIEW 쿼리에서 지원되지 않습니다.

  • __ivm 접두사로 시작하는 구체화된 뷰 열은 시스템용으로 예약되어 있습니다.는 향후 릴리스에서 이러한 열을 수정하거나 제거할 수 있는 권한을 AWS 보유합니다.

  • SORT BY, LIMIT, OFFSET, CLUSTER BY, ORDER BY 절은 구체화된 뷰 정의에서 지원되지 않습니다.

  • 교차 리전 및 교차 계정 소스 테이블은 지원되지 않습니다.

  • rand() 또는 current_timestamp()와 같은 비결정적 함수는 구체화된 뷰 정의에서 지원되지 않습니다.