Khóa học
Các giải pháp gốc đám mây ngày càng phổ biến trong nhiều ngành nhờ tính bảo mật, linh hoạt và khả năng mở rộng. Một trong những giải pháp đó là AWS Glue, giúp đơn giản hóa xử lý dữ liệu—một thành phần cốt lõi để đưa ra quyết định sáng suốt và tối ưu hóa hoạt động kinh doanh.
Trong hướng dẫn này, chúng ta sẽ dùng AWS Glue để minh họa một tác vụ ETL (Extract, Transform, Load) phổ biến: chuyển đổi các tệp CSV được lưu trong S3 bucket sang định dạng Parquet. Việc dùng Parquet giúp nâng cao hiệu quả xử lý dữ liệu và hiệu năng truy vấn.
Chúng tôi sẽ giới thiệu AWS Glue, các tính năng cốt lõi và lợi ích của việc tự động hóa chuẩn bị dữ liệu. Tiếp theo, chúng tôi sẽ hướng dẫn bạn thiết lập tài khoản AWS, tạo vai trò IAM và cấu hình quyền truy cập vào S3 bucket. Cuối cùng, chúng tôi sẽ hướng dẫn bạn tạo một Glue crawler để quét tập dữ liệu và tạo các tệp Parquet.
AWS Glue là gì?
Trước khi đi vào các bước thực hành, hãy cùng tìm hiểu AWS Glue là gì và vì sao nó hữu ích cho các tác vụ xử lý dữ liệu.
AWS Glue là dịch vụ ETL được quản lý hoàn toàn, giúp việc chuẩn bị và nạp dữ liệu cho phân tích trở nên dễ dàng. Nó cung cấp môi trường không máy chủ để tạo, chạy và giám sát các job ETL. AWS Glue tự động khám phá và lập hồ sơ dữ liệu của bạn thông qua AWS Glue Data Catalog, đề xuất và tạo mã ETL, đồng thời cung cấp bộ lập lịch linh hoạt để xử lý phụ thuộc, giám sát job và thử lại.
Vì sao nên dùng AWS Glue?
Hiểu được lợi ích của AWS Glue sẽ giúp bạn thấy rõ giá trị của nó trong quy trình xử lý dữ liệu. Có một số lý do thuyết phục để sử dụng AWS Glue, một vài điểm được minh họa dưới đây:

Vì sao chọn AWS Glue? Hình ảnh: tác giả
- Không máy chủ (Serverless): Không cần cấp phát hay quản lý máy chủ, giảm chi phí vận hành.
- Tự động tạo mã: AWS Glue có thể tự động tạo mã Python hoặc Scala cho các job ETL.
- Lập lịch và giám sát job tích hợp: Tính năng này giúp việc lập lịch và theo dõi các job ETL trở nên dễ dàng.
- Khám phá và lập danh mục dữ liệu: Các crawler của AWS Glue có thể tự động khám phá, lập danh mục và chuẩn bị dữ liệu cho phân tích.
- Tích hợp với các dịch vụ AWS khác: Hoạt động liền mạch với các dịch vụ như Amazon S3, Amazon RDS, và Amazon Redshift.
- Tiết kiệm chi phí: Bạn chỉ trả tiền cho tài nguyên được sử dụng trong thời gian job ETL chạy.
AWS Glue: Hướng dẫn từng bước
Phần thú vị đây rồi: hãy học cách dùng Glue cho một tác vụ xử lý dữ liệu rất phổ biến: chuyển đổi tệp CSV sang Parquet.
1. Thiết lập tài khoản AWS
Với những ai mới dùng AWS, bước đầu tiên là tạo tài khoản rồi đăng nhập vào bảng điều khiển quản trị.
- Truy cập AWS và đăng ký.
- Sau khi có tài khoản, đăng nhập vào AWS Management Console.
2. Tạo vai trò IAM
AWS Identity and Access Management (IAM) cho phép người dùng quản lý an toàn quyền truy cập vào các dịch vụ và tài nguyên AWS.
Chúng ta cần tạo một vai trò IAM để cho phép Glue truy cập các dịch vụ liên quan. Trong trường hợp này, dịch vụ chính mà chúng ta truy cập là S3, nơi lưu trữ các tệp CSV.
Bài Hướng dẫn Lưu trữ AWS là cách tuyệt vời để người dùng mới của AWS tìm hiểu thêm về các hệ thống như S3.
Các bước chính để tạo vai trò IAM đó được mô tả dưới đây, bắt đầu từ Management Console:
- Đi tới dịch vụ IAM.
- Nhấp "Roles" ở thanh bên trái, sau đó nhấp "Create role".
- Trong mục "Choose a use case," chọn "Glue" và nhấp "Next: Permissions."
- Tìm và chọn các chính sách sau:
AWSGlueServiceRoleAmazonS3FullAccess(Lưu ý: Trong môi trường production, bạn nên tạo chính sách hạn chế hơn).- Đặt tên cho vai trò (ví dụ: "GlueETLRole"), có thể thêm mô tả nhưng không bắt buộc. Cuối cùng, nhấp "Create role".

Các bước tạo vai trò IAM trong AWS console. Hình ảnh: tác giả
Bài Hướng dẫn Hoàn chỉnh về AWS IAM trình bày các bước dùng IAM để bảo mật môi trường AWS, quản lý truy cập với người dùng, nhóm và vai trò, cùng các thực hành tốt nhất để đạt bảo mật vững chắc.
3. Thiết lập S3 bucket
Chúng ta sẽ lưu cả các tệp CSV đầu vào và các tệp Parquet đầu ra trên Amazon S3.
Dữ liệu đầu vào cho ví dụ này được tạo nhằm mục đích minh họa và có thể tìm thấy trong kho GitHub của tác giả:
athletes.csv: Chứa thông tin về vận động viên, gồm ID, tên, quốc gia, môn thi đấu và tuổi.events.csv: Liệt kê các sự kiện, gồm ID sự kiện, môn thể thao, tên sự kiện, ngày và địa điểm.medals.csv: Ghi nhận thông tin huy chương, liên kết sự kiện và vận động viên với các huy chương họ giành được.
Giờ đây, chúng ta có thể thiết lập S3 bucket như sau:
- Vào dịch vụ S3 trong AWS Management Console.
- Nhấp "Create bucket" và đặt tên duy nhất (ví dụ: "my-glue-csv-etl-bucket").
- Giữ nguyên cài đặt mặc định của bucket cho đơn giản và tạo bucket.
- Tạo hai thư mục trong bucket: "input" và "output".

Luồng tạo bucket và thư mục S3. Hình ảnh: tác giả
Sau khi tạo hai thư mục, nội dung bucket của bạn sẽ trông như sau:

Giao diện các thư mục bên trong S3 bucket. Hình ảnh: tác giả
Giờ chúng ta có thể tải lên các tệp CSV đầu vào này vào thư mục "input".

Nội dung thư mục “input” của S3 bucket. Hình ảnh: tác giả
4. Tạo Glue crawler
Glue crawler được dùng để tự động khám phá và lập danh mục dữ liệu của chúng ta. Phần này giải thích cách tạo crawler quét toàn bộ các tệp CSV đầu vào.
Các bước chính được nêu dưới đây:
- Vào dịch vụ AWS Glue trong AWS Management Console.
- Ở thanh bên trái, dưới "Data catalog," nhấp "Crawlers."
- Nhấp "Create crawler".
- Đặt tên cho crawler (ví dụ: "CSV-to-Parquet-Crawler") và để trống phần mô tả, sau đó nhấp "Next."
- Chúng ta cần chỉ định “S3” làm nguồn dữ liệu, thực hiện bằng cách chọn "Add data source " làm loại nguồn crawler và nhấp "Next."

Luồng tạo AWS Glue crawler trong console - phần 1. Hình ảnh: tác giả
- Chọn "S3" làm kho dữ liệu và chỉ định đường dẫn S3 bucket của bạn, có thể thực hiện bằng cách chọn “Browse S3.” Sau đó nhấp "Next."
- Chọn “Crawl all sub-folders”
- Chọn “Add an S3 data source”, rồi nhấp "Next."
- Trước khi tiếp tục, kiểm tra kiểu dữ liệu “S3”, rồi “Next.”

Luồng tạo AWS Glue crawler trong console - phần 2. Hình ảnh: tác giả
Sau khi kết nối S3 bucket, chúng ta cần gắn vai trò IAM đã tạo trước đó để cho phép Glue truy cập các S3 bucket. Tên vai trò của chúng ta là “GlueETLRole.”
- Chọn tên vai trò trong trường “Existing IAM role”.
- Nhấp “Next.”

Luồng tạo AWS Glue crawler trong console - phần 3. Hình ảnh: tác giả
Bước tiếp theo là tạo cơ sở dữ liệu. Cơ sở dữ liệu “paris_olympics_db” mà chúng ta sẽ tạo đóng vai trò là kho trung tâm trong AWS Glue Data Catalog để lưu trữ và tổ chức siêu dữ liệu về các tệp CSV.
Catalog này sẽ giúp khám phá dữ liệu hiệu quả và đơn giản hóa quy trình ETL để kết hợp và chuyển đổi dữ liệu vận động viên, sự kiện và huy chương sang định dạng Parquet.
Hiện tại chúng ta chưa có cơ sở dữ liệu nào, các bước tạo được minh họa dưới đây:
- Chọn “Add database,” một cửa sổ mới sẽ mở để tạo cơ sở dữ liệu. Đặt tên “paris_olympics_db” và giữ nguyên các mục khác mặc định, rồi nhấp “Create database.”

Luồng tạo AWS Glue crawler trong console - phần 4. Hình ảnh: tác giả
Từ thẻ gốc nơi chúng ta kết nối cơ sở dữ liệu, làm mới mục “Target database” và chọn cơ sở dữ liệu vừa tạo. Sau đó nhấp “Next.”

Luồng tạo AWS Glue crawler trong console - phần 5. Hình ảnh: tác giả
Cuối cùng, rà soát lại mọi thứ và nhấp “Create crawler.”

Giao diện “Review and create” của AWS Glue crawler. Hình ảnh: tác giả
Sau thao tác tạo crawler ở trên, chúng ta sẽ thấy kết quả sau xác nhận việc tạo thành công:

Tạo Glue crawler thành công. Hình ảnh: tác giả
5. Chạy Glue crawler
Bây giờ chúng ta đã tạo crawler, hãy chạy nó và xem cách nó lập danh mục dữ liệu của chúng ta.

Nút “Run crawler” của Glue. Hình ảnh: tác giả
- Chọn crawler của bạn trong danh sách.
- Nhấp "Run crawler."
- Chờ crawler hoàn tất. Có thể mất vài phút.
- Sau khi xong, vào "Databases" dưới "Data catalog" ở thanh bên trái.
- Nhấp vào cơ sở dữ liệu đã được tạo.
- Bạn sẽ thấy một bảng đại diện cho cấu trúc dữ liệu CSV của mình.

Giao diện các bảng được tạo trong cơ sở dữ liệu từ việc chạy Glue crawler. Hình ảnh: tác giả
6. Tạo và chạy Glue job
Sau khi đã có data catalog, giờ chúng ta có thể tạo Glue job để kết hợp các tệp CSV và chuyển chúng sang định dạng Parquet. Phần này hướng dẫn bạn tạo Glue job và cung cấp mã Python cần thiết.
- Vào "Jobs" dưới mục "ETL" trong AWS Glue console ở thanh bên trái.
- Chọn Script editor để mở trình soạn thảo viết mã Python, và nhấp “Create script.”

Tạo và chạy Glue job - phần 1. Hình ảnh: tác giả
Hành động tạo script sẽ mở thẻ script sau, nơi chúng ta có thể đặt tên cho job, trong trường hợp này là “CS”.
- Trong phần mã, dán đoạn mã sau rồi nhấp “Save.”

Tạo và chạy Glue job - phần 2. Hình ảnh: tác giả
Mã Python tương ứng được đưa ra dưới đây:
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
# Initialize the Spark and Glue contexts
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
# Set Spark configurations for optimization
spark.conf.set("spark.sql.adaptive.enabled", "true")
spark.conf.set("spark.sql.adaptive.coalescePartitions.enabled", "true")
# Get job parameters
args = getResolvedOptions(sys.argv, ['JOB_NAME'])
# Set the input and output paths
input_path = "s3://glue-csv-etl-bucket/input/"
output_path = "s3://glue-csv-etl-bucket/output/"
# Function to read CSV and write Parquet
def csv_to_parquet(input_file, output_file):
try:
# Read CSV
df = spark.read.option("header", "true") \
.option("inferSchema", "true") \
.option("mode", "PERMISSIVE") \
.option("columnNameOfCorruptRecord", "_corrupt_record") \
.csv(input_file)
# Print schema for debugging
print(f"Schema for {input_file}:")
df.printSchema()
# Convert date column if it exists (assuming it's in the format M/d/yyyy)
if "date" in df.columns:
df = df.withColumn("date", to_date(col("date"), "M/d/yyyy"))
# Write Parquet
df.write.mode("overwrite").parquet(output_file)
print(f"Successfully converted {input_file} to Parquet at {output_file}")
print(f"Number of rows processed: {df.count()}")
except Exception as e:
print(f"Error processing {input_file}: {str(e)}")
# List of files to process
files = ["athletes", "events", "medals"]
# Process each file
for file in files:
input_file = f"{input_path}{file}.csv"
output_file = f"{output_path}{file}_parquet"
csv_to_parquet(input_file, output_file)
job.commit()
print("Job completed.")
Hãy cùng hiểu nhanh điều gì đang diễn ra trong đoạn mã:
- Import: Nhập các thư viện cần thiết từ AWS Glue, PySpark và thư viện chuẩn của Python.
- Khởi tạo: Khởi tạo các ngữ cảnh Spark và Glue, đồng thời thiết lập cấu hình Spark để tối ưu hóa.
- Tham số job: Lấy tham số job, cụ thể là tên job, từ đối số dòng lệnh.
- Đường dẫn: Xác định đường dẫn vào/ra cho tệp CSV và Parquet trong S3 bucket.
- Định nghĩa hàm: Định nghĩa hàm
csv_to_parquet()để đọc tệp CSV, in schema, chuyển đổi cột ngày nếu tồn tại và ghi dữ liệu dưới dạng Parquet. Xử lý ngoại lệ trong quá trình xử lý. - Xử lý tệp: Xử lý danh sách tệp (
athletes,events,medals) bằng cách gọi hàmcsv_to_parquet()cho từng tệp. - Cam kết job: Commit job và in thông báo hoàn tất.
Trước khi chạy job, chúng ta cần điền các cấu hình bổ sung sau trong phần “Job details”:
- Cung cấp vai trò IAM mà chúng ta đã tạo trước đó để cho phép thực thi job.
- Đặt “Type” của Job là “Spark,” giữ nguyên các trường còn lại mặc định và “Save”.
- Sau đó, chạy job!

Tạo và chạy Glue job - phần 3. Hình ảnh: tác giả
Sau khi chạy job thành công, chúng ta có thể xem chi tiết hơn về trạng thái thực thi:

Giao diện chi tiết lượt chạy AWS Glue job. Hình ảnh: tác giả
Truy cập và giám sát chi tiết lượt chạy rất quan trọng để duy trì các pipeline dữ liệu hiệu quả và đáng tin cậy. Những chỉ số này cung cấp thông tin giá trị và giúp chúng ta làm những việc sau:
- Tối ưu hiệu năng: Theo dõi thời gian thực thi để cải thiện hiệu quả job và phân bổ tài nguyên.
- Quản lý chi phí: Giám sát mức sử dụng tài nguyên (DPU, worker) để phù hợp ngân sách và tối ưu chi tiêu.
- Lập kế hoạch năng lực: Sử dụng số liệu thực thi để dự báo nhu cầu tài nguyên và lập kế hoạch mở rộng.
Việc chạy job thành công đã chuyển đổi mỗi tệp CSV thành tệp Parquet tương ứng và lưu chúng trong thư mục “output” như minh họa dưới đây:
- Bên trái là các thư mục có cùng tên với tệp CSV gốc.
- Bên phải tương ứng là các tệp Parquet cho từng tệp CSV.

Nội dung thư mục output bên trong S3 bucket. Hình ảnh: tác giả
Kết luận và Bước tiếp theo
Hướng dẫn này đã giới thiệu AWS Glue và các tính năng của nó. Tài liệu hướng dẫn bạn thiết lập môi trường AWS và khám phá giao diện AWS Glue. Tài liệu cũng chỉ cho bạn cách xây dựng và chạy Glue crawler để lập danh mục dữ liệu, tạo Glue job để chuyển đổi dữ liệu và chuyển đổi thành công các tệp CSV sang định dạng Parquet.
Bạn có thể mở rộng những gì đã học bằng cách thiết lập trigger để tự động hóa quy trình, triển khai xử lý lỗi và ghi log, cũng như tối ưu các tệp Parquet để có hiệu năng tốt hơn nữa. Bạn cũng có thể khám phá truy vấn dữ liệu với AWS Athena hoặc Amazon Redshift Spectrum.
Ngoài ra, hãy giám sát mức sử dụng và chi phí AWS của bạn và dọn dẹp tài nguyên khi không còn cần thiết để tránh phát sinh chi phí không cần thiết.
Các khóa học Introduction to AWS và AWS Cloud Technology and Services có thể là những bước tiếp theo tuyệt vời để học thêm!
Khóa đầu cung cấp nền tảng vững chắc về AWS và điện toán đám mây, lý tưởng cho người mới bắt đầu hoặc người muốn ôn lại khái niệm chính. Khóa thứ hai tập trung vào học qua thực hành, giúp bạn đào sâu kiến thức thực tiễn về các dịch vụ AWS.
Câu hỏi thường gặp
Một số thực tiễn tốt nhất để tối ưu hiệu năng tệp Parquet là gì?
Để tối ưu hiệu năng tệp Parquet, hãy cân nhắc điều chỉnh kích thước tệp (lý tưởng từ 128 MB đến 1 GB), phân vùng dữ liệu để truy vấn hiệu quả và thiết lập bộ mã nén phù hợp (như Snappy hoặc Gzip). Những chiến lược này giúp giảm I/O và cải thiện tốc độ truy vấn khi làm việc với bộ dữ liệu lớn trong các công cụ như AWS Athena.
Làm thế nào để tôi triển khai xử lý lỗi và ghi log trong các AWS Glue job?
AWS Glue tích hợp với Amazon CloudWatch, cho phép bạn theo dõi trạng thái job, lỗi và log tùy chỉnh. Bạn có thể cấu hình các Glue job để ghi log vào CloudWatch, giúp dễ dàng giám sát hiệu năng, khắc phục sự cố và đảm bảo quy trình ETL chạy trơn tru.
Ngoài chuyển đổi CSV sang Parquet, một số trường hợp sử dụng phổ biến của AWS Glue là gì?
AWS Glue rất linh hoạt và có thể xử lý các tác vụ như loại bỏ trùng lặp dữ liệu, làm giàu dữ liệu và chuyển đổi schema. Nó thường được dùng để tích hợp dữ liệu từ nhiều nguồn (ví dụ: RDS, S3, Redshift) vào một định dạng thống nhất, chuẩn bị dữ liệu cho mô hình học máy và thực hiện các chuyển đổi cho data lake.
AWS Glue so với các công cụ ETL khác như Apache Airflow hoặc Databricks thì thế nào?
AWS Glue là dịch vụ ETL được quản lý hoàn toàn và không máy chủ, trong khi Apache Airflow là công cụ điều phối workflow mã nguồn mở cần nhiều cấu hình và quản trị hạ tầng hơn. Databricks, mặt khác, được xây dựng cho phân tích dữ liệu quy mô lớn và học máy. AWS Glue phù hợp khi cần dễ sử dụng và tích hợp với các dịch vụ AWS khác, nhưng với workflow rất phức tạp, các công cụ như Airflow hoặc Databricks có thể mang lại tính linh hoạt cao hơn.
Làm thế nào để tự động hóa AWS Glue job bằng trigger?
Trigger trong AWS Glue cho phép bạn tự động hóa workflow ETL bằng cách lên lịch các job chạy vào thời điểm cụ thể hoặc sau một số sự kiện, chẳng hạn khi có dữ liệu mới đến trong S3 bucket. Bạn có thể thiết lập trigger dựa trên thời gian hoặc sự kiện thông qua AWS Glue console, cho phép xử lý dữ liệu liền mạch mà không cần can thiệp thủ công.
Nhà khoa học dữ liệu đa tài, yêu thích chia sẻ kiến thức và đóng góp cho cộng đồng, Zoumana là người sáng tạo nội dung trên YouTube và là cây bút công nghệ hàng đầu trên Medium. Anh yêu thích thuyết trình, lập trình và giảng dạy. Zoumana có hai bằng thạc sĩ: một về khoa học máy tính chuyên sâu Học máy tại Paris, Pháp, và một về Khoa học dữ liệu tại Texas Tech University, Hoa Kỳ. Anh bắt đầu sự nghiệp với vai trò Nhà phát triển phần mềm tại Groupe OPEN ở Pháp, sau đó chuyển sang IBM làm Tư vấn Học máy, nơi anh phát triển các giải pháp AI đầu-cuối cho các công ty bảo hiểm. Zoumana gia nhập Axionable, startup Trí tuệ nhân tạo Bền vững đầu tiên có trụ sở tại Paris và Montreal. Tại đây, anh làm Nhà khoa học dữ liệu và triển khai các sản phẩm AI, chủ yếu là các bài toán NLP, cho khách hàng tại Pháp, Montreal, Singapore và Thụy Sĩ. Ngoài ra, 5% thời gian của anh được dành cho Nghiên cứu và Phát triển. Hiện tại, anh làm việc với vai trò Nhà khoa học dữ liệu cao cấp tại IFC - Nhóm Ngân hàng Thế giới.
