View a markdown version of this page

분석 도구를 사용하여 S3 Storage Lens 데이터 쿼리 - Amazon Simple Storage Service

분석 도구를 사용하여 S3 Storage Lens 데이터 쿼리

Amazon Athena 또는 Amazon EMR과 같은 AWS 분석 서비스를 사용하여 S3 Tables로 내보낸 S3 Storage Lens 데이터를 쿼리하려면 먼저 AWS 관리형 `aws-s3` 테이블 버킷에서 분석 통합을 활성화하고 AWS Lake Formation 권한을 구성해야 합니다.

중요

‘aws-s3’ 테이블 버킷에서 분석 통합을 활성화하는 것은 종종 놓치는 필수 단계입니다. 이 구성이 없으면 AWS 분석 서비스를 사용하여 S3 Storage Lens 테이블을 쿼리할 수 없습니다.

사전 조건

시작하기 전에 다음이 있는지 확인하세요.

  • S3 Tables 내보내기가 활성화된 S3 Storage Lens 구성입니다. 자세한 내용은 섹션을 참조하세요S3 Storage Lens 지표를 S3 테이블로 내보내기

  • Amazon Athena 또는 다른 분석 서비스에 대한 액세스입니다.

  • 첫 번째 데이터를 사용할 수 있도록 내보내기를 활성화한 후 24~48시간이 지났습니다.

통합 개요

사전 조건, IAM 역할 구성 및 step-by-step 절차를 포함하여 S3 Tables를 AWS 분석 서비스와 통합하는 방법에 대한 자세한 내용은 Amazon S3 Tables를 AWS 분석 서비스와 통합을 참조하세요.

S3 Tables 내보내기를 활성화하고 분석 통합을 설정한 후 Amazon Athena, Amazon Redshift, Amazon EMR과 같은 AWS 분석 서비스를 사용하여 S3 Storage Lens 데이터를 쿼리할 수 있습니다. 이를 통해 사용자 지정 분석을 수행하고, 대시보드를 생성하고, 표준 SQL을 사용하여 스토리지 데이터에서 인사이트를 도출할 수 있습니다.

Amazon Athena를 사용하여 쿼리

Amazon Athena는 표준 SQL을 사용하여 데이터를 쉽게 분석할 수 있도록 해주는 서버리스 대화형 쿼리 서비스입니다. 다음 단계에 따라 Athena에서 S3 Storage Lens 데이터를 쿼리합니다.

참고

모든 쿼리 예제에서 lens_my-config_exp를 실제 Storage Lens 구성 네임스페이스로 바꿉니다. 네임스페이스에 대한 자세한 내용은 S3 Storage Lens를 S3 Tables로 내보내기 위한 테이블 이름 지정 섹션을 참조하세요.

예: 상위 스토리지 소비자 쿼리

다음 쿼리는 스토리지 사용량별로 상위 10개 버킷을 식별합니다.

SELECT bucket_name, storage_class, SUM(storage_bytes) / POWER(1024, 3) AS storage_gb, SUM(object_count) AS objects FROM "s3tablescatalog/aws-s3"."lens_my-config_exp"."default_storage_metrics" WHERE report_time = ( SELECT MAX(report_time) FROM "s3tablescatalog/aws-s3"."lens_my-config_exp"."default_storage_metrics" ) AND record_type = 'BUCKET' AND bucket_name != '' GROUP BY bucket_name, storage_class ORDER BY storage_gb DESC LIMIT 10

예: 시간 경과에 따른 스토리지 증가 분석

다음 쿼리는 지난 30일 동안의 스토리지 증가를 분석합니다.

SELECT CAST(report_time AS date) AS report_date, SUM(storage_bytes) / POWER(1024, 3) AS total_storage_gb FROM "s3tablescatalog/aws-s3"."lens_my-config_exp"."default_storage_metrics" WHERE report_time >= current_date - interval '30' day AND record_type = 'ACCOUNT' GROUP BY CAST(report_time AS date) ORDER BY report_date DESC;

예: 미완료 멀티파트 업로드 식별

다음 쿼리는 7일 이상 된 불완전한 멀티파트 업로드가 있는 버킷을 찾습니다.

SELECT bucket_name, SUM(incomplete_mpu_storage_older_than_7_days_bytes) / POWER(1024, 3) AS wasted_storage_gb, SUM(incomplete_mpu_object_older_than_7_days_count) AS wasted_objects FROM "s3tablescatalog/aws-s3"."lens_my-config_exp"."default_storage_metrics" WHERE report_time = ( SELECT MAX(report_time) FROM "s3tablescatalog/aws-s3"."lens_my-config_exp"."default_storage_metrics" ) AND record_type = 'BUCKET' AND incomplete_mpu_storage_older_than_7_days_bytes > 0 GROUP BY bucket_name ORDER BY wasted_storage_gb DESC;

예: 콜드 데이터 후보 찾기

다음 쿼리는 핫 스토리지 계층에 저장된 지난 100일 동안 활동이 없는 접두사를 식별합니다.

WITH recent_activity AS ( SELECT DISTINCT bucket_name, record_value AS prefix_path FROM "s3tablescatalog/aws-s3"."lens_my-config_exp"."expanded_prefixes_activity_metrics" WHERE report_time >= current_date - interval '100' day AND record_type = 'PREFIX' AND all_request_count > 0 ) SELECT s.bucket_name, s.record_value AS prefix_path, s.storage_class, SUM(s.storage_bytes) / POWER(1024, 3) AS storage_gb FROM "s3tablescatalog/aws-s3"."lens_my-config_exp"."expanded_prefixes_storage_metrics" s LEFT JOIN recent_activity r ON s.bucket_name = r.bucket_name AND s.record_value = r.prefix_path WHERE s.report_time = ( SELECT MAX(report_time) FROM "s3tablescatalog/aws-s3"."lens_my-config_exp"."expanded_prefixes_storage_metrics" ) AND s.record_type = 'PREFIX' AND s.storage_class IN ('STANDARD', 'REDUCED_REDUNDANCY') AND s.storage_bytes > 1073741824 -- > 1GB AND r.prefix_path IS NULL -- No recent activity GROUP BY s.bucket_name, s.record_value, s.storage_class ORDER BY storage_gb DESC LIMIT 20;

예: 요청 패턴 분석

다음 쿼리는 요청 패턴을 분석하여 액세스 빈도를 이해합니다.

SELECT bucket_name, SUM(all_request_count) AS total_requests, SUM(get_request_count) AS get_requests, SUM(put_request_count) AS put_requests, ROUND(100.0 * SUM(get_request_count) / NULLIF(SUM(all_request_count), 0), 2) AS get_percentage, SUM(downloaded_bytes) / POWER(1024, 3) AS downloaded_gb FROM "s3tablescatalog/aws-s3"."lens_my-config_exp"."default_activity_metrics" WHERE report_time >= current_date - interval '7' day AND record_type = 'BUCKET' AND bucket_name != '' GROUP BY bucket_name HAVING SUM(all_request_count) > 0 ORDER BY total_requests DESC LIMIT 10;

Amazon EMR에서 Apache Spark로 쿼리

Amazon EMR은 Apache Spark를 사용하여 방대한 양의 데이터를 쉽게 처리할 수 있는 관리형 하둡 프레임워크를 제공합니다. Iceberg 커넥터를 사용하여 S3 Storage Lens 테이블을 직접 읽을 수 있습니다.

Spark를 사용하여 S3 테이블 읽기

다음 Python 코드를 사용하여 Spark에서 S3 Storage Lens 데이터를 읽습니다.

from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("S3StorageLensAnalysis") \ .config("spark.sql.catalog.s3tablescatalog", "org.apache.iceberg.spark.SparkCatalog") \ .config("spark.sql.catalog.s3tablescatalog.catalog-impl", "org.apache.iceberg.aws.glue.GlueCatalog") \ .getOrCreate() # Read S3 Storage Lens data df = spark.read \ .format("iceberg") \ .load("s3tablescatalog/aws-s3.lens_my-config_exp.default_storage_metrics") # Analyze data df.filter("record_type = 'BUCKET'") \ .groupBy("bucket_name", "storage_class") \ .sum("storage_bytes") \ .orderBy("sum(storage_bytes)", ascending=False) \ .show(10)

쿼리 최적화 모범 사례

쿼리 성능을 최적화하고 비용을 줄이려면 다음 모범 사례를 따르세요.

  • report_time을 기준으로 필터링 - 스캔되는 데이터의 양을 줄이기 위해 항상 날짜 필터를 포함합니다. 이는 보존 기간이 긴 테이블에서 특히 중요합니다.

    WHERE report_time >= current_date - interval '7' day
  • record_type 필터 사용 - 필요한 데이터만 쿼리하려면 적절한 집계 수준(ACCOUNT, BUCKET, PREFIX)을 지정합니다.

    WHERE record_type = 'BUCKET'
  • LIMIT 절 포함 - 탐색 쿼리에 LIMIT을 사용하여 결과 크기를 제어하고 쿼리 비용을 줄입니다.

    LIMIT 100
  • 빈 레코드 필터링 - 조건을 사용하여 빈 레코드 또는 0 값 레코드를 제외합니다.

    WHERE storage_bytes > 0
  • 최신 데이터 사용 - 현재 상태를 분석할 때 기록 데이터를 스캔하지 않도록 최신 report_time을 필터링합니다.

    WHERE report_time = (SELECT MAX(report_time) FROM table_name)

최적화된 쿼리 패턴의 예

다음 쿼리는 최적화 모범 사례를 보여 줍니다.

SELECT bucket_name, SUM(storage_bytes) / POWER(1024, 3) AS storage_gb FROM "s3tablescatalog/aws-s3"."lens_my-config_exp"."default_storage_metrics" WHERE report_time >= current_date - interval '7' day -- Date filter AND record_type = 'BUCKET' -- Record type filter AND storage_bytes > 0 -- Non-empty filter AND bucket_name != '' -- Non-empty filter GROUP BY bucket_name ORDER BY storage_gb DESC LIMIT 100; -- Result limit

문제 해결

쿼리가 결과를 반환하지 않음

문제: 쿼리가 성공적으로 완료되었지만 결과를 반환하지 않습니다.

해결 방법:

  • 최신 report_time을 확인하여 데이터를 사용할 수 있는지 확인합니다.

    SELECT MAX(report_time) AS latest_data FROM "s3tablescatalog/aws-s3"."lens_my-config_exp"."default_storage_metrics";
  • 올바른 네임스페이스 이름을 사용하고 있는지 확인합니다. SHOW TABLES IN `lens_my-config_exp`;를 사용하여 사용 가능한 테이블을 나열합니다.

  • 첫 번째 데이터를 사용할 수 있도록 S3 Tables 내보내기를 활성화한 후 24~48시간을 기다립니다.

액세스 거부 오류

문제: 쿼리를 실행할 때 액세스 거부 오류가 발생합니다.

해결 방법: AWS Lake Formation 권한이 올바르게 구성되었는지 확인합니다. 자세한 내용은 Integrating Amazon S3 Tables with AWS analytics services를 참조하세요.

다음 단계