[AWS] 데이터 & 분석

silver's avatar
Nov 26, 2025
[AWS] 데이터 & 분석

Amazon Athena

S3에 저장된 데이터를 SQL로 직접 쿼리하는 서버리스 서비스
[S3 Bucket] ← CSV, JSON, Parquet 파일 ↓ [Athena] ← SQL 쿼리 ↓ 결과 반환 (수 초)
특징:
  • 서버리스 (인프라 관리 불필요)
  • 표준 SQL 지원
  • 스캔한 데이터만큼만 과금 ($5/TB)
  • CSV, JSON, Parquet, ORC 지원

사용 방법

-- 1. 테이블 생성 (S3 데이터 연결) CREATE EXTERNAL TABLE logs ( timestamp STRING, level STRING, message STRING, user_id STRING ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' WITH SERDEPROPERTIES ('field.delim' = ',') LOCATION 's3://my-logs-bucket/logs/'; -- 2. 쿼리 실행 SELECT level, COUNT(*) as count, DATE(timestamp) as date FROM logs WHERE timestamp > '2024-11-01' GROUP BY level, DATE(timestamp) ORDER BY date DESC; -- 3. 파티션 활용 (비용 절감) CREATE EXTERNAL TABLE logs_partitioned ( timestamp STRING, level STRING, message STRING ) PARTITIONED BY (year STRING, month STRING, day STRING) STORED AS PARQUET LOCATION 's3://my-logs-bucket/partitioned/'; -- 파티션별 쿼리 (특정 날짜만 스캔) SELECT * FROM logs_partitioned WHERE year='2024' AND month='11' AND day='19';

성능 최적화

1. 파티셔닝

❌ 비효율적: s3://bucket/logs/log1.csv (1TB 전체 스캔) 비용: $5 ✅ 효율적: s3://bucket/logs/year=2024/month=11/day=19/log.csv 비용: $0.01 (필요한 날짜만)

2. 컬럼 형식 (Parquet/ORC)

CSV: 1GB 스캔 = $5/TB Parquet: 100MB 스캔 = $0.50/TB (10배 절감 + 빠름)
# CSV → Parquet 변환 import pandas as pd df = pd.read_csv('data.csv') df.to_parquet('data.parquet', compression='snappy')

3. 압축

압축 없음: 10GB Snappy 압축: 2GB (5배 감소) → 비용 5배 절감

실전 활용

# Python에서 Athena 쿼리 import boto3 import time athena = boto3.client('athena') def query_athena(query): # 쿼리 실행 response = athena.start_query_execution( QueryString=query, QueryExecutionContext={'Database': 'my_database'}, ResultConfiguration={'OutputLocation': 's3://my-results/'} ) query_id = response['QueryExecutionId'] # 완료 대기 while True: status = athena.get_query_execution(QueryExecutionId=query_id) state = status['QueryExecution']['Status']['State'] if state in ['SUCCEEDED', 'FAILED', 'CANCELLED']: break time.sleep(1) # 결과 가져오기 if state == 'SUCCEEDED': results = athena.get_query_results(QueryExecutionId=query_id) return results['ResultSet']['Rows'] # 사용 results = query_athena("SELECT * FROM logs WHERE level='ERROR' LIMIT 10")

Amazon Redshift

페타바이트 규모의 데이터 웨어하우스
[S3][Redshift] → 복잡한 분석 쿼리 [RDS] ↗ 초고속 응답
특징:
  • 컬럼 기반 스토리지
  • 대규모 조인 및 집계 최적화
  • Redshift Spectrum (S3 쿼리)
  • 노드 확장 가능
Athena vs Redshift:
특성
Athena
Redshift
모델
서버리스
클러스터 (프로비저닝)
비용
스캔 데이터 기반
노드/시간 기반
성능
빠름
매우 빠름
사용
임시 쿼리
반복적 분석
데이터
S3
Redshift 내부

사용 방법

-- 테이블 생성 CREATE TABLE sales ( sale_id INT, product_id INT, user_id INT, amount DECIMAL(10,2), sale_date DATE ) DISTKEY(user_id) SORTKEY(sale_date); -- S3에서 데이터 로드 (COPY) COPY sales FROM 's3://my-bucket/sales-data/' IAM_ROLE 'arn:aws:iam::account:role/RedshiftRole' FORMAT AS PARQUET; -- 복잡한 분석 쿼리 SELECT DATE_TRUNC('month', sale_date) as month, product_id, SUM(amount) as total_sales, COUNT(DISTINCT user_id) as unique_customers FROM sales WHERE sale_date >= '2024-01-01' GROUP BY month, product_id ORDER BY month, total_sales DESC;

Redshift Spectrum

S3 데이터를 직접 쿼리 (Athena와 비슷)
-- External 테이블 생성 CREATE EXTERNAL SCHEMA s3_data FROM DATA CATALOG DATABASE 's3_database' IAM_ROLE 'arn:aws:iam::account:role/RedshiftRole'; -- S3 + Redshift 조인 SELECT r.user_id, r.total_purchases, s.total_clicks FROM redshift_table r JOIN s3_data.clickstream s ON r.user_id = s.user_id;

OpenSearch (구 ElasticSearch)

전문 검색 및 로그 분석 엔진
[Application][OpenSearch] ↓ 검색, 필터링, 집계 ↓ [Kibana] ← 시각화
사용 사례:
  • 전문 검색 (풀텍스트)
  • 로그 분석
  • 실시간 분석
  • 보안 모니터링

사용 방법

from opensearchpy import OpenSearch client = OpenSearch( hosts=[{'host': 'search-domain.region.es.amazonaws.com', 'port': 443}], http_auth=('username', 'password'), use_ssl=True ) # 문서 인덱싱 client.index( index='products', id='1', body={ 'title': 'iPhone 15 Pro', 'description': 'Latest Apple smartphone', 'price': 999, 'category': 'Electronics' } ) # 검색 response = client.search( index='products', body={ 'query': { 'match': { 'description': 'smartphone' } }, 'aggs': { 'avg_price': { 'avg': {'field': 'price'} } } } )

EMR (Elastic MapReduce)

Hadoop, Spark, Presto 등 빅데이터 프레임워크를 실행하는 관리형 클러스터
[EMR Cluster] ├─ Master Node (조정) ├─ Core Nodes (데이터 저장 + 처리) └─ Task Nodes (처리만)
사용 사례:
  • 대규모 데이터 처리 (ETL)
  • 머신러닝 학습
  • 로그 분석
  • 데이터 과학

Spark 예시

from pyspark.sql import SparkSession spark = SparkSession.builder.appName("DataAnalysis").getOrCreate() # S3에서 데이터 읽기 df = spark.read.parquet("s3://my-bucket/data/") # 데이터 처리 result = df.filter(df['amount'] > 100) \ .groupBy('category') \ .sum('amount') \ .orderBy('sum(amount)', ascending=False) # 결과 저장 result.write.parquet("s3://my-bucket/results/")

QuickSight

서버리스 BI (Business Intelligence) 서비스
데이터 소스: [S3, RDS, Redshift, Athena][QuickSight] → 대시보드
특징:
  • 서버리스
  • ML 인사이트
  • 임베딩 가능
  • 모바일 앱

사용 예시

대시보드 구성: 1. 데이터셋 연결 (Athena/Redshift) 2. 시각화 생성 - 선 그래프: 시간별 매출 - 막대 그래프: 제품별 판매량 - 파이 차트: 카테고리 비율 3. 필터 추가 (날짜, 지역 등) 4. 공유 또는 임베딩

AWS Glue

서버리스 ETL (Extract, Transform, Load) 서비스
[데이터 소스][Glue Crawler][Data Catalog][Glue ETL Job][대상 저장소]
주요 기능:
  1. Glue Crawler: 데이터 스키마 자동 발견
  1. Data Catalog: 메타데이터 저장소
  1. Glue ETL: 데이터 변환 작업

실습

1. Crawler로 스키마 발견

# Crawler 생성 aws glue create-crawler \ --name my-s3-crawler \ --role arn:aws:iam::account:role/GlueRole \ --database-name my_database \ --targets '{ "S3Targets": [{ "Path": "s3://my-bucket/data/" }] }' # Crawler 실행 aws glue start-crawler --name my-s3-crawler

2. ETL Job 작성

import sys from awsglue.transforms import * from awsglue.utils import getResolvedOptions from pyspark.context import SparkContext from awsglue.context import GlueContext from awsglue.job import Job # Glue Job 초기화 glueContext = GlueContext(SparkContext.getOrCreate()) spark = glueContext.spark_session job = Job(glueContext) # 데이터 읽기 datasource = glueContext.create_dynamic_frame.from_catalog( database="my_database", table_name="raw_data" ) # 변환 # 1. 불필요한 컬럼 제거 transformed = DropFields.apply( frame=datasource, paths=["temp_column"] ) # 2. 데이터 타입 변경 transformed = ApplyMapping.apply( frame=transformed, mappings=[ ("id", "string", "id", "int"), ("timestamp", "string", "timestamp", "timestamp"), ("amount", "string", "amount", "decimal(10,2)") ] ) # 3. 필터링 transformed = Filter.apply( frame=transformed, f=lambda x: x["amount"] > 0 ) # 결과 저장 (Parquet) glueContext.write_dynamic_frame.from_options( frame=transformed, connection_type="s3", connection_options={"path": "s3://my-bucket/processed/"}, format="parquet" ) job.commit()

Lake Formation

데이터 레이크를 쉽게 구축하고 보안 관리하는 서비스
[Lake Formation] ├─ 데이터 수집 (S3, RDS, etc.) ├─ 데이터 카탈로그 (Glue) ├─ 보안 및 접근 제어 └─ 데이터 공유 ↓ [Athena, Redshift, EMR] ← 분석
주요 기능:
  • 중앙화된 권한 관리
  • 컬럼/행 수준 보안
  • 데이터 공유 (Cross-Account)

Kinesis Data Analytics

실시간 스트리밍 데이터를 SQL로 분석
[Kinesis Data Streams][Kinesis Data Analytics] ← SQL 쿼리 ↓ [결과 스트림] → Lambda, S3, Redshift

예시

-- 실시간 이동 평균 CREATE OR REPLACE STREAM "DESTINATION_STREAM" ( stock_symbol VARCHAR(4), avg_price DOUBLE ); CREATE OR REPLACE PUMP "STREAM_PUMP" AS INSERT INTO "DESTINATION_STREAM" SELECT STREAM stock_symbol, AVG(price) OVER ( PARTITION BY stock_symbol RANGE INTERVAL '1' MINUTE PRECEDING ) as avg_price FROM "SOURCE_STREAM" WHERE price > 0;

MSK (Managed Streaming for Apache Kafka)

Apache Kafka의 관리형 서비스
[Producer][MSK Cluster][Consumer][Topic: orders] [Topic: events]
Kinesis vs MSK:
특성
Kinesis
MSK
관리
완전 관리형
일부 관리 필요
보존
최대 365일
무제한
처리량
샤드별 제한
높음
생태계
AWS 전용
Kafka 생태계

빅데이터 파이프라인 예시

시나리오: 실시간 전자상거래 분석

[웹사이트/앱] (클릭, 주문) ↓ [Kinesis Data Streams] ├─→ [Kinesis Data Analytics] → 실시간 대시보드 ├─→ [Lambda][DynamoDB] ← 실시간 추천 └─→ [Kinesis Firehose][S3: Raw Data][Glue Crawler][Data Catalog][Glue ETL Job] ├─ 데이터 정제 ├─ 파티셔닝 └─ Parquet 변환 ↓ [S3: Processed Data][Athena] ← 임시 분석 [Redshift] ← 정기 리포트 [QuickSight] ← 대시보드

비용 최적화

Athena

1. Parquet/ORC 형식 사용 (10배 절감) 2. 파티셔닝 (필요한 데이터만 스캔) 3. 컬럼 선택 (SELECT *) 4. 압축 (Snappy, Gzip) 예시: CSV 10TB 스캔: $50 Parquet 1TB 스캔: $5 (90% 절감)

Redshift

1. Reserved Instances (75% 할인) 2. Pause/Resume (사용하지 않을 때) 3. Concurrency Scaling (burst만) 4. Spectrum (자주 쓰지 않는 데이터는 S3)

EMR

1. Spot Instances (70-90% 할인) 2. Task 노드만 Spot 사용 3. S3 기반 (EMRFS) - 클러스터 종료 가능 4. Auto Scaling

 
💡
AWS 분석 서비스는 소규모부터 페타바이트급까지 모든 규모의 데이터를 처리 가능
서비스 선택:
  • 임시 쿼리 (S3 데이터) → Athena
  • 데이터 웨어하우스 → Redshift
  • 전문 검색 → OpenSearch
  • 빅데이터 처리 → EMR
  • ETL → Glue
  • 시각화 → QuickSight
  • 실시간 분석 → Kinesis Analytics
  • 일반적 아키텍처 - 수집: Kinesis/MSK - 저장: S3 - 카탈로그: Glue - 변환: Glue ETL - 분석: Athena/Redshift/EMR - 시각화: QuickSight
Share article

silver