Uncategorized

Kiến Trúc Apache Parquet: Bản Chất Định Dạng & Tối Ưu Query

Trong kỷ nguyên bùng nổ dữ liệu lớn (Big Data) và sự trỗi dậy của các kiến trúc hồ dữ liệu hiện đại (Modern Data Lakehouse), việc lựa chọn định dạng tệp lưu trữ quyết định trực tiếp tới hơn 80% hiệu năng truy vấn và chi phí hóa đơn điện toán đám mây. Được phát triển dựa trên công trình nghiên cứu hệ thống phân tích Dremel huyền thoại của Google, Apache Parquet đã khẳng định vị thế là định dạng tệp dữ liệu phân tích dạng cột (Columnar Storage) tiêu chuẩn của ngành công nghiệp phần mềm toàn cầu.

Đối với phần lớn các kỹ sư dữ liệu, việc sử dụng Parquet thường chỉ dừng lại ở cú pháp quen thuộc như df.write.parquet() trong Apache Spark hoặc read_parquet() trong DuckDB. Tuy nhiên, việc mổ xẻ cấu trúc vật lý bên dưới đĩa cứng — từ cơ chế phân đoạn Row Group, cấu trúc phân cấp Page, cho đến ma thuật đằng sau phần Metadata đặt ở cuối file — mới là chìa khóa then chốt giúp tối ưu hóa triệt để tốc độ thực thi các câu lệnh SQL phức tạp.

1. Kiến Trúc Phân Cấp: File, Row Group, Column Chunk Và Page

Khác biệt hoàn toàn với các định dạng hướng dòng truyền thống như CSV hay JSON (nơi mỗi bản ghi được ghi liên tục từ đầu đến cuối dòng), Apache Parquet tổ chức dữ liệu theo một mô hình phân cấp lai (Hybrid Layout) cực kỳ chặt chẽ:

  • Magic Number (PAR1): Mỗi tệp Parquet luôn bắt đầu và kết thúc bằng chuỗi 4 byte đặc biệt 0x50 0x41 0x52 0x31 (tương ứng với ký tự mã ASCII “PAR1”) để hệ thống tệp nhận diện định dạng hợp lệ.
  • Row Group (Nhóm dòng): Phân vùng logic theo chiều ngang của toàn bộ dữ liệu tệp. Kích thước khuyến nghị tiêu chuẩn của một Row Group thường dao động từ 128MB đến 512MB (thậm chí 1GB), cho phép tải trọn vẹn vào bộ nhớ RAM của một luồng xử lý mà không gây tràn bộ nhớ.
  • Column Chunk (Khối cột): Dữ liệu của từng cột cụ thể nằm bên trong một Row Group. Toàn bộ các giá trị của một cột trong một Row Group được lưu trữ liền kề nhau trên đĩa, mở đường cho tốc độ đọc tuần tự (sequential I/O) siêu tốc.
  • Page (Trang dữ liệu): Đơn vị vật lý nguyên tử nhỏ nhất bên trong một Column Chunk (thường có dung lượng xấp xỉ 1MB). Đây là nơi dữ liệu thực sự được nén và mã hóa. Có hai loại trang chính: Data Page (chứa dữ liệu giá trị) và Dictionary Page (chứa từ điển giải mã).


💡 Đơn vị Page — Ranh giới tối thiểu của giải nén (Decompression):


Nhiều kỹ sư nhầm tưởng rằng định dạng cột cho phép đọc chính xác từng ô giá trị đơn lẻ. Trên thực tế, Page là đơn vị không thể chia cắt khi giải nén. Kể cả khi truy vấn chỉ cần lấy đúng một giá trị số nguyên tại hàng thứ 50, Query Engine vẫn bắt buộc phải tải và giải mã toàn bộ Page dung lượng 1MB chứa giá trị đó. Do đó, việc tinh chỉnh kích thước Page đóng vai trò sống còn trong việc cân bằng giữa chi phí bộ nhớ đệm và hiệu suất I/O.

2. Vì Sao Metadata Của Parquet Lại Được Đặt Ở Cuối Tệp (Footer)?

Hầu hết các định dạng tệp thông thường (như PNG, MP4, SQLite hay tar) đều đặt phần thông tin mô tả (Header Metadata) ngay tại những byte đầu tiên. Tuy nhiên, Apache Parquet lại đưa toàn bộ siêu dữ liệu cốt lõi (FileMetaData) về phía đuôi tệp (Footer). Thiết kế này mang tính toán công nghệ mang tính cách mạng cho tính toán phân tán:

  • Tối ưu hóa quá trình ghi tuần tự (One-pass Writing): Khi các tiến trình phân tán (như Spark Executor) tiến hành ghi dữ liệu xuống đĩa hoặc Amazon S3, kích thước thực tế sau khi nén, các giá trị thống kê Min/Max và vị trí byte offset của từng Row Group là những ẩn số chưa thể biết trước. Việc đặt Footer ở cuối cho phép hệ thống ghi dữ liệu liên tục một chiều mà không bao giờ cần seek ngược lại đầu file để cập nhật thông số.
  • Chiến lược đọc thông minh (Seek-to-End): Khi một Query Engine (Trino, DuckDB, ClickHouse) mở tệp Parquet, hành động đầu tiên không phải đọc từ byte 0, mà là nhảy thẳng tới cuối file (thực hiện lệnh Seek) để đọc 4 byte Magic Number và 4 byte xác định độ dài Footer.
  • Tải toàn bộ bản đồ tệp trong 1 I/O: Chỉ với một thao tác đọc vài chục Kilobyte siêu dữ liệu ở đuôi, công cụ truy vấn đã nắm giữ toàn bộ cấu trúc Schema, danh sách vị trí phân bổ các cột, cùng chỉ số thống kê của hàng triệu dòng dữ liệu.

3. Sức Mạnh Tối Ưu Truy Vấn: Column Projection & Predicate Pushdown

Sự kết hợp giữa kiến trúc lưu trữ dạng cột và siêu dữ liệu trong Footer kích hoạt hai kỹ thuật tăng tốc truy vấn mạnh mẽ nhất của hệ sinh thái Big Data:

— Câu lệnh truy vấn phân tích điển hình trên bảng có 100 cột và 1 tỷ dòng dữ liệu
SELECT customer_id, SUM(order_amount)
FROM fact_orders
WHERE order_date >= ‘2026-01-01’
GROUP BY customer_id;
  • Column Projection (Chiếu cột có chọn lọc): Thay vì quét toàn bộ 100 cột dữ liệu như định dạng dòng, Query Engine chỉ trích xuất đúng 3 cột cần thiết: customer_id, order_amount, và order_date. Tiết kiệm tới 97% băng thông mạng và đĩa lưu trữ.
  • Predicate Pushdown & Min/Max Pruning: Bên trong Footer của mỗi Row Group đều lưu trữ giá trị min_value và max_value của cột order_date. Nếu một Row Group ghi nhận max_value = '2025-12-31', trình thông dịch sẽ lập tức bỏ qua toàn bộ Row Group đó mà không cần đọc một byte dữ liệu nào từ đĩa cứng.

4. Nghệ Thuật Mã Hóa & Nén Dữ Liệu: Dictionary, RLE & ZSTD

Do dữ liệu trong cùng một cột sở hữu kiểu dữ liệu đồng nhất (homogeneous) và thường có tính lặp lại cao, Parquet đạt được tỷ lệ nén vượt trội hơn bất kỳ định dạng hàng nào nhờ sự phối hợp giữa hai giai đoạn: Mã hóa (Encoding) và Nén khối (Compression).

  • Dictionary Encoding (Mã hóa từ điển): Thay vì lưu lặp lại hàng triệu chuỗi ký tự dài (ví dụ: tên quốc gia “VIETNAM”), Parquet lưu một bảng từ điển nhỏ ở đầu Column Chunk và thay thế dữ liệu thực tế bằng các số nguyên siêu nhỏ (0, 1, 2…).
  • Run-Length Encoding (RLE) & Bit-Packing: Khi một giá trị lặp lại nhiều lần liên tiếp (ví dụ: cờ trạng thái status = 1 xuất hiện 1.000 lần liên tục), RLE chỉ lưu cấu trúc (1000, 1). Bit-packing sau đó chỉ sử dụng số bit tối thiểu cần thiết để biểu diễn giá trị thay vì cấp phát nguyên 32 bit hoặc 64 bit chuẩn.
  • Thuật toán nén Snappy vs Zstandard (ZSTD): Snappy ưu tiên tốc độ giải nén siêu tốc với mức sử dụng CPU thấp, trong khi Zstandard (ZSTD) cung cấp tỷ lệ nén vượt trội hơn 20-30% với hiệu năng giải nén gần như tương đương, hiện đang trở thành tiêu chuẩn mặc định trên các nền tảng Databricks và Snowflake.

5. Thuật Toán Dremel: Xử Lý Dữ Liệu Lồng Ghép (Nested / Repeated Data)

Điểm làm nên sự khác biệt kinh điển của Parquet so với các giải pháp lưu trữ cột sơ khai chính là khả năng biểu diễn các cấu trúc dữ liệu lồng ghép phức tạp (JSON, Protobuf, mảng đa chiều) mà không cần phải làm phẳng (flatten) bảng dữ liệu:

Thuật toán Record Shredding của Google sử dụng hai thông số định lượng chuẩn xác:

  • Definition Level (Mức độ định nghĩa): Xác định xem một trường dữ liệu tùy chọn (optional field) có thực sự xuất hiện trong cây dữ liệu hay mang giá trị NULL, bao gồm cả vị trí của phần tử cha trong cấu trúc cây.
  • Repetition Level (Mức độ lặp): Xác định phần tử mảng hiện tại bắt đầu lặp lại từ nhánh tổ tiên nào trong cây dữ liệu.

Nhờ hai chỉ số nguyên này, Parquet có thể xé nhỏ (shred) một đối tượng JSON sâu thành các luồng cột phẳng độc lập và sau đó tái tạo lại nguyên vẹn (reassemble) cấu trúc cây phân cấp ban đầu với tốc độ cực cao.

6. Bảng So Sánh Các Định Dạng Tệp Dữ Liệu Lớn Hiện Nay

Bảng phân tích toàn diện giữa Apache Parquet và các định dạng tệp phổ biến trong kỹ thuật xử lý dữ liệu:

Tiêu chí so sánh Apache Parquet Apache Avro CSV / JSON thuần
Mô hình lưu trữ Columnar (Dạng cột) Row-based (Dạng hàng) Row-based dạng văn bản thô
Hiệu năng phân tích (OLAP) Tối ưu tối đa (Projection + Pruning) Trung bình (phải quét cả hàng) Rất chậm, tốn băng thông quét
Hiệu năng ghi luồng (Streaming/OLTP) Cần gom nhóm (batching) trong bộ nhớ Rất nhanh, ghi tức thời từng bản ghi Chậm do chi phí serialize ký tự
Khả năng nén dung lượng Rất cao (giảm 75% – 90% dung lượng) Khá tốt (nén nhị phân) Kém, dung lượng phình to
Hỗ trợ Schema Evolution Có (hỗ trợ thêm/bớt cột linh hoạt) Xuất sắc thông qua Schema Registry Dễ gãy pipeline nếu đổi cấu trúc


⚠️ Cảnh báo thực chiến: Cạm bẫy “Small Files Problem” và Sắp xếp dữ liệu (Sorting):


Đừng bao giờ để Spark hay Flink tạo ra hàng chục nghìn tệp Parquet kích thước chỉ vài Megabyte. Khi tệp quá nhỏ, chi phí đọc siêu dữ liệu Footer và kết nối I/O sẽ triệt tiêu toàn bộ lợi thế của định dạng cột. Kích thước tệp lý tưởng trên Data Lake là từ 128MB đến 512MB. Ngoài ra, việc chủ động sắp xếp dữ liệu (Sort hoặc áp dụng Z-Ordering) theo các cột thường xuyên lọc trước khi ghi sẽ giúp các khoảng Min/Max trong Footer không bị chồng chéo, nâng hiệu suất lọc dữ liệu lên gấp 10 lần.

7. Thiết Bị & Công Cụ Tối Ưu Năng Suất Cho Kỹ Sư Dữ Liệu (Data Engineer)

Làm việc với các tập dữ liệu Parquet khổng lồ trên môi trường cục bộ (sử dụng DuckDB, Polars, Docker hóa Spark) đòi hỏi tốc độ truyền tải dữ liệu cực nhanh và không gian hiển thị rộng rãi để theo dõi các luồng pipeline phức tạp:

1. Ổ Cứng Di Động SSD Samsung T9 1TB / 2TB (USB 3.2 Gen 2×2 2.000 MB/s)

Xuất xứ & Công nghệ: Samsung Hàn Quốc. Sử dụng giao thức USB 3.2 Gen 2×2 đạt tốc độ truyền tải dữ liệu tuần tự lên tới 2.000 MB/s, tích hợp công nghệ tản nhiệt Dynamic Thermal Guard và lớp vỏ silicon chống sốc an toàn từ độ cao 3 mét.

Lý do khuyến nghị: Cung cấp tốc độ đọc/ghi dữ liệu tương đương ổ cứng gắn trong máy, giúp kỹ sư dữ liệu phân tích, nén và kiểm thử các tập tin Parquet dung lượng hàng chục Gigabyte trên máy trạm cá nhân chỉ trong chớp mắt mà không lo thắt nút cổ chai I/O.

Giá bán tham khảo: 3.290.000 VNĐ – 5.490.000 VNĐ (Bảo hành 36 tháng chính hãng).

2. Màn Hình Đồ Họa Siêu Rộng LG UltraWide 34WN80C-B (34 Inch WQHD IPS)

Xuất xứ & Công nghệ: LG Electronics. Tấm nền IPS chuẩn màu chuyên nghiệp sRGB 99%, độ phân giải siêu nét WQHD (3440 x 1440), tỷ lệ 21:9 mở rộng không gian, tích hợp cổng kết nối USB Type-C truyền dữ liệu và sạc đồng thời 60W.

Lý do khuyến nghị: Chiều rộng 34 inch là giải pháp hoàn hảo để mở song song bảng đồ thị DAG của Apache Airflow, bảng điều khiển truy vấn SQL và mã nguồn biến đổi dữ liệu dbt mà không cần chuyển qua lại giữa nhiều màn hình.

Giá bán tham khảo: 11.500.000 VNĐ – 12.500.000 VNĐ.

3. Bàn Phím Cơ Không Dây Công Thái Học Logitech MX Mechanical Mini

Xuất xứ & Công nghệ: Logitech Thụy Sĩ. Trang bị switch cơ học Low-Profile êm ái (Tactile Quiet), công nghệ Easy-Switch kết nối linh hoạt 3 thiết bị đồng thời (macOS, Linux, Windows), thời lượng pin ấn tượng lên đến 10 tháng khi tắt đèn nền.

Lý do khuyến nghị: Độ nảy chính xác cao cùng góc nghiêng công thái học hạn chế tối đa tình trạng mỏi khớp tay trong các phiên viết mã dữ liệu phức tạp kéo dài liên tục nhiều giờ liền.

Giá bán tham khảo: 2.890.000 VNĐ – 3.250.000 VNĐ.

8. Lời Kết: Trụ Cột Vững Chắc Của Kiến Trúc Hồ Dữ Liệu Hiện Đại

Apache Parquet không đơn thuần chỉ là một phần mở rộng tệp .parquet, mà là sự hội tụ tinh hoa của kiến trúc tính toán dữ liệu hiện đại: từ lưu trữ dạng cột, thuật toán nén thông minh, cho đến cơ chế lọc siêu dữ liệu đỉnh cao. Khi bước vào kỷ nguyên của các định dạng bảng mở tiên tiến như Apache Iceberg hay Delta Lake, Parquet vẫn tiếp tục đóng vai trò là lớp tệp lưu trữ nền tảng không thể thay thế. Thấu hiểu bản chất vật lý của Parquet chính là vũ khí giúp bạn xây dựng những hệ thống dữ liệu có khả năng mở rộng không giới hạn với chi phí tối ưu nhất.

Back to top button