Ngôn ngữ hiển thị:
Dữ liệu đổ về liên tục nhưng insights thì luôn chậm hơn thực tế vài tiếng — câu hỏi đặt ra là tại sao kiến trúc truyền thống không theo kịp nữa, và Data Lakehouse có thực sự là câu trả lời hay chỉ là buzzword tiếp theo?
Data Lake lưu tất cả mọi thứ ở dạng raw — JSON, Parquet, CSV, log file đủ loại — với chi phí lưu trữ rất thấp. Nghe thì hay, nhưng khi muốn query bạn phải biết dữ liệu có format gì, schema ra sao, cột nào null, cột nào không. Đây là bài toán schema-on-read: linh hoạt nhưng đắt về mặt compute khi không có metadata.
Data Warehouse lại ngược lại — schema cứng, dữ liệu đã transform sẵn, query nhanh nhưng chi phí lưu trữ cao và ETL pipeline cứng nhắc. Mỗi lần thêm nguồn dữ liệu mới là một sprint riêng.
Data Lakehouse cố gắng lấy điểm tốt của cả hai: lưu raw trên object storage giá rẻ (S3), nhưng thêm một lớp metadata và governance ở giữa (Glue Data Catalog), rồi cho phép query trực tiếp bằng SQL chuẩn mà không cần move dữ liệu đi đâu (Athena). Trên AWS, ba dịch vụ này đã được tích hợp native với nhau — bạn không cần setup thêm bất kỳ infrastructure nào.
Mình thường khuyên khách hàng dùng S3 + Glue + Athena khi họ rơi vào một trong ba tình huống sau:
Dữ liệu không đồng nhất: log từ 5 hệ thống khác nhau, format khác nhau, tần suất khác nhau. Việc cố ép tất cả vào một relational schema ngay từ đầu là tự làm khó mình. S3 nhận tất cả, Glue crawl và tạo catalog, Athena query khi cần.
Chi phí là ưu tiên hàng đầu: S3 Standard đang ở mức ~$0.023/GB/tháng. So với Redshift hay RDS Reserved Instance, tiết kiệm được rất đáng kể với dữ liệu lịch sử ít truy cập. Athena chỉ tính phí khi bạn query ($5/TB data scanned) — không có idle cost.
Team nhỏ, không muốn ops nặng: Không có server nào cần maintain. Glue Job là serverless, Athena là serverless, S3 lifecycle policy tự archive dữ liệu cũ sang Glacier. DevOps overhead gần như bằng 0.
Mình sẽ đi theo luồng thực tế: data ingest vào S3 → Glue crawl tạo schema → Glue ETL transform → Athena query kết quả.
Đây là bước bị bỏ qua nhiều nhất và gây đau đầu nhất về sau. S3 không có khái niệm folder thực sự — chỉ là prefix trong object key. Nhưng cách bạn đặt prefix ảnh hưởng trực tiếp đến hiệu suất và chi phí Athena query.
Cấu trúc mình hay dùng:
s3://your-datalake/
├── raw/
│ ├── events/year=2026/month=07/day=10/
│ └── orders/year=2026/month=07/day=10/
├── curated/
│ ├── events_cleaned/
│ └── orders_enriched/
└── analytics/
└── daily_summary/Tại sao dùng partition kiểu year=YYYY/month=MM/day=DD? Vì Athena hiểu partition pruning — khi bạn query WHERE year='2026' AND month='07', nó chỉ scan đúng folder đó thay vì toàn bộ bucket. Giảm cost và tăng tốc đáng kể.
Bật S3 Intelligent-Tiering từ đầu cho raw layer — dữ liệu cũ tự động chuyển sang tier rẻ hơn mà không cần can thiệp thủ công.
Glue Crawler là robot tự động quét S3, đọc sample dữ liệu và tạo schema trong Data Catalog. Tạo crawler:
aws glue create-crawler \
--name my-datalake-crawler \
--role AWSGlueServiceRole \
--database-name datalake_db \
--targets S3Targets=[{Path="s3://your-datalake/raw/events/"}] \
--schedule "cron(0 6 * * ? *)"Chạy crawler lần đầu để tạo table definition:
aws glue start-crawler --name my-datalake-crawlerSau khi crawler chạy xong, vào Glue Console → Databases → datalake_db → Tables, bạn sẽ thấy schema được tạo tự động. Đây chính là metadata layer của Lakehouse — thứ biến S3 từ một đống file câm thành dữ liệu có cấu trúc.
Mẹo xương máu: Set Glue Crawler chạy vào 6 giờ sáng thay vì realtime. Crawl quá thường xuyên vừa tốn tiền vừa không cần thiết với batch workload. Nếu schema thay đổi thường xuyên (schema evolution), cân nhắc dùng AWS Glue Schema Registry.
Raw data thường lộn xộn: null values, duplicate records, kiểu dữ liệu không nhất quán. Glue Job dùng PySpark để clean và transform:
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
from pyspark.sql.functions import col, to_date
args = getResolvedOptions(sys.argv, ['JOB_NAME'])
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)
# Đọc từ Glue Data Catalog (không cần hardcode S3 path)
datasource = glueContext.create_dynamic_frame.from_catalog(
database="datalake_db",
table_name="events"
)
# Chuyển sang DataFrame để xử lý linh hoạt hơn
df = datasource.toDF()
# Loại bỏ duplicates và null ở cột quan trọng
df_clean = df.dropDuplicates(['event_id']) \
.filter(col('user_id').isNotNull()) \
.withColumn('event_date', to_date(col('timestamp')))
# Ghi ra curated layer dưới dạng Parquet (nén tốt, query nhanh)
df_clean.write \
.mode('overwrite') \
.partitionBy('event_date') \
.parquet('s3://your-datalake/curated/events_cleaned/')
job.commit()Parquet là định dạng cột (columnar) — khi Athena query chỉ cần 3 cột trong table 50 cột, nó chỉ đọc 3 cột đó thay vì toàn bộ row. Tiết kiệm 70-80% data scanned là chuyện bình thường.
Sau khi crawler chạy lại trên curated layer, bạn có thể query ngay trong Athena:
-- Query top 10 events theo ngày
SELECT event_date,
event_type,
COUNT(*) as event_count
FROM datalake_db.events_cleaned
WHERE event_date BETWEEN DATE '2026-07-01' AND DATE '2026-07-10'
GROUP BY event_date, event_type
ORDER BY event_date DESC, event_count DESC
LIMIT 10;Athena tính phí theo data scanned — không phải theo thời gian chạy. Một query scan 1TB tốn $5, scan 10GB chỉ tốn $0.05. Đây là lý do tổ chức partition và dùng Parquet quan trọng đến vậy.
Nếu bạn dùng Athena thường xuyên cho cùng một query, bật Query Result Reuse (30 phút mặc định) — Athena cache kết quả và không tính phí scan lại cho cùng query trong khoảng thời gian đó.
"HIVE_PARTITION_SCHEMA_MISMATCH": Xảy ra khi schema của partition mới khác với table definition trong Glue Catalog. Thường gặp khi upstream thêm cột mới vào log mà không báo. Fix: vào Glue Console → chạy lại crawler với option "Update all new and existing partitions" hoặc dùng MSCK REPAIR TABLE table_name trong Athena.
Athena query timeout hoặc quá chậm: Nguyên nhân 90% là thiếu partition và dùng CSV thay vì Parquet. Convert dữ liệu sang Parquet và thêm partition là bước đầu tiên. Nếu vẫn chậm, xem xét dùng Athena CTAS (Create Table As Select) để tạo materialized view.
Glue Job OOM (Out of Memory): Khi xử lý file quá lớn, PySpark bị tràn bộ nhớ. Tăng --worker-type lên G.2X hoặc dùng repartition() để chia nhỏ trước khi write. Thêm vào job parameters: --conf spark.sql.shuffle.partitions=200.
S3 permission denied từ Glue/Athena: IAM role của Glue cần có s3:GetObject, s3:PutObject, s3:ListBucket trên bucket. Athena cần thêm quyền ghi vào S3 output location (nơi lưu query results). Lỗi này thường xuất hiện sau khi tạo bucket mới mà quên update policy.
Q: Glue ETL so với Lambda + S3 Event — cái nào nên dùng?A: Lambda phù hợp với real-time processing, file nhỏ, latency thấp (dưới 15 phút timeout). Glue phù hợp với batch processing, dữ liệu lớn, cần Spark ecosystem. Nếu bạn xử lý log theo giờ/ngày với volume lớn, Glue là lựa chọn rõ ràng hơn. Nếu cần trigger ngay khi file drop vào S3, Lambda + Glue Trigger là combo hay.
Q: Athena có thể thay thế hoàn toàn Redshift không?A: Không hoàn toàn. Athena tỏa sáng với ad-hoc query và exploratory analysis. Redshift mạnh hơn với concurrent workload cao, BI dashboards cần sub-second response, và complex join trên dữ liệu đã được tổ chức tốt. Nhiều team dùng cả hai: Athena cho data exploration, Redshift cho production dashboards.
Q: Chi phí thực tế cho 1TB data mỗi tháng là bao nhiêu?A: Ước tính thô: S3 lưu trữ ~$23/TB/tháng, Glue Crawler ~$2-5 (tuỳ tần suất), Athena query cost phụ thuộc hoàn toàn vào bao nhiêu data bạn scan. Nếu dùng Parquet + partition tốt, 1TB raw data có thể chỉ scan 50-100GB per query → ~$0.25-0.50/query. So với Redshift dc2.large reserved ($0.25/hr × 730h = $182/tháng), tiết kiệm đáng kể với workload thưa.
Q: Schema evolution xử lý thế nào khi upstream thêm cột mới?A: Athena và Glue đều hỗ trợ schema evolution với Parquet và ORC nếu bạn bật tùy chọn phù hợp. Cách an toàn nhất: thêm cột mới ở cuối schema (không xóa/rename cột cũ), chạy lại crawler, rồi dùng
ALTER TABLE ADD COLUMNStrong Athena. Tránh đổi kiểu dữ liệu của cột hiện có — đây là nguồn gốc của SCHEMA_MISMATCH error.
Mình từng nghĩ Data Lakehouse là thứ chỉ dành cho team data engineering lớn với budget khủng. Thực tế sau khi triển khai cho vài dự án, mình thấy chi phí setup ban đầu thấp hơn nhiều so với kỳ vọng, và overhead vận hành gần như không có gì đáng kể.
Điểm mấu chốt là tổ chức S3 đúng ngay từ đầu — partition strategy quyết định 80% chi phí và tốc độ Athena về sau. Sai partition format ở bước 1 thì về sau sửa rất tốn công. Còn lại — Glue crawl tự động, Athena query serverless — là phần dễ nhất.
Khổ nỗi là phần "dễ" đó lại thường được làm trước, còn phần quan trọng nhất (thiết kế storage layer) lại bị bỏ qua. Nếu bạn đang bắt đầu với dự án mới, hãy dành 1-2 buổi thiết kế S3 bucket structure kỹ trước khi viết bất kỳ dòng code ETL nào.