분석 도구를 사용하여 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를 참조하세요.
다음 단계
-
S3 Storage Lens 테이블에서 AI 어시스턴트 사용에 대해 알아봅니다.
-
지표 정의는 Amazon S3 스토리지 렌즈 지표 용어집 섹션을 검토하세요.
-
더 많은 분석 아이디는 Amazon S3 스토리지 렌즈 지표 사용 사례 섹션을 살펴보세요.
-
서버리스 쿼리를 위한 Amazon Athena에 대해 알아보기