0

Greenplum Database Bài học 21: Kiến trúc gpfdist: Phá vỡ nút thắt cổ chai ở Master bằng cách nạp song song trực tiếp vào các Segment

Ở Bài học 20, chúng ta đã thấy lệnh COPY truyền thống giúp nạp dữ liệu nhanh hơn INSERT rất nhiều, nhưng lại mắc phải một "tử huyệt" chí mạng: Toàn bộ tệp dữ liệu khổng lồ bắt buộc phải đi qua Master Node. Master Node phải gánh vác toàn bộ công việc phân tích, tính toán hàm băm (Hash) và phân phối xuống các Segment, nhanh chóng trở thành nút thắt cổ chai phần cứng khi đối mặt với dữ liệu hàng chục Gigabyte.

Để phá vỡ hoàn toàn nút thắt cổ chai này và khai thác tối đa sức mạnh nạp dữ liệu song song của kiến trúc MPP, Greenplum cung cấp một tiện ích độc quyền cực kỳ mạnh mẽ mang tên gpfdist. Trong bài học này, chúng ta sẽ mổ xẻ kiến trúc hoạt động của gpfdist và cách nó giúp nạp hàng Terabyte dữ liệu chỉ trong vài phút.

1. Vấn đề cốt lõi: Làm sao để nạp dữ liệu không qua Master?

Trong một cụm Greenplum chuẩn, các máy chủ Segment (sdw1, sdw2...) mới là những "công nhân" sở hữu ổ cứng dung lượng lớn, card mạng tốc độ cao và sức mạnh tính toán thực sự.

Nếu chúng ta có một tệp dữ liệu log nặng 100 GB nằm trên máy chủ ETL bên ngoài, mục tiêu lý tưởng nhất là:

  • Không đẩy toàn bộ 100 GB đó dồn cục vào Master.

  • Thay vào đó, chia nhỏ tệp dữ liệu ra và cho phép tất cả các Segment Hosts đồng loạt chủ động kết nối vào nguồn dữ liệu, mỗi Segment tự đọc phần việc của mình, tự băm Hash và tự ghi thẳng xuống đĩa của nó.

Đó chính xác là sứ mệnh sinh ra của gpfdist.

2. Giải phẫu kiến trúc gpfdist (Greenplum File Distribution Program)

gpfdist là một tiến trình máy chủ HTTP/File Server siêu nhẹ, được viết bằng ngôn ngữ C, chạy trực tiếp trên máy chủ chứa tệp dữ liệu (có thể là máy chủ ETL riêng biệt hoặc chính máy Master).

┌────────────────────────────────────────────────────────────────────────┐
│                        KIẾN TRÚC NẠP DỮ LIỆU GPFDIST                     │
└───────────────────────────┬────────────────────────┬───────────────────┘
                            │                        │
       [ Máy chủ chứa File CSV (ETL Server) ]        │
       • Chạy tiến trình: gpfdist (Cổng 8080)        │
       • Chia nhỏ file thành nhiều luồng đọc         │
                            │                        │
            ┌───────────────┴───────────────┐        │
            ▼                               ▼        │
    ┌───────────────┐               ┌───────────────┐│
    │ Segment Host 1│               │ Segment Host 2││
    │ (Segment 0, 1)│               │ (Segment 2, 3)││
    └───────────────┘               └───────────────┘│
     (Đồng loạt kết nối song song tới gpfdist qua HTTP)

Cơ chế hoạt động của gpfdist:

  1. Khởi động Server: DBA bật tiến trình gpfdist trỏ vào thư mục chứa các file dữ liệu trên máy chủ ETL (ví dụ: chạy ở cổng 8080).

  2. Khai báo External Table: Trên cơ sở dữ liệu Greenplum, DBA tạo một bảng ngoài (READABLE EXTERNAL TABLE) trỏ đến địa chỉ của tiến trình gpfdist đó.

  3. Đọc dữ liệu song song (Parallel Stream Reading): Khi bạn chạy câu lệnh SELECT hoặc INSERT INTO target_table SELECT * FROM external_table, tất cả các tiến trình Segment trên toàn cụm sẽ đồng loạt mở kết nối HTTP song song trực tiếp đến gpfdist.

  4. Không qua Master: gpfdist tự động chia nhỏ file dữ liệu, phân phát các khối khác nhau cho các Segment đang yêu cầu. Mỗi Segment tự nhận dữ liệu, tự phân tích định dạng và ghi thẳng vào ổ cứng của nó. Master lúc này chỉ đóng vai trò giám sát, hoàn toàn không bị vướng vào luồng dữ liệu thô!

3. Các ưu điểm vượt trội của gpfdist

  • Tốc độ đọc/ghi đạt ngưỡng phần cứng (Line-rate speed): Vì sử dụng nhiều luồng kết nối song song từ tất cả các Segment cùng một lúc, gpfdist tận dụng triệt để băng thông mạng và tốc độ đọc của ổ cứng, loại bỏ hoàn toàn hiện tượng nghẽn cổ chai.

  • Cơ chế cân bằng tải tự động (Load Balancing): Nếu một Segment hoàn thành việc đọc phần dữ liệu của nó nhanh hơn các Segment khác, gpfdist sẽ tự động cấp phát tiếp các khối dữ liệu tiếp theo cho Segment đó, đảm bảo không có máy nào phải ngồi chơi.

  • Xử lý lỗi thông minh (Fault Tolerance): gpfdist cho phép cấu hình giới hạn số lượng dòng dữ liệu bị lỗi định dạng (bad rows). Nếu tệp CSV có một vài dòng bị lệch cột, Greenplum có thể ghi nhận các dòng lỗi đó ra một bảng log riêng (LOG ERRORS) mà không làm gián đoạn toàn bộ tiến trình nạp dữ liệu hàng triệu dòng.

4. Cú pháp thực chiến: Sử dụng gpfdist và External Tables

Để nạp dữ liệu bằng gpfdist, chúng ta thực hiện qua 3 bước đơn giản:

Bước 1: Khởi động tiến trình gpfdist trên máy chủ chứa file dữ liệu

Đăng nhập vào máy chủ chứa các file CSV (ví dụ thư mục /data/etl_files) và chạy lệnh:

Bash

gpfdist -d /data/etl_files -p 8080 &

Bước 2: Tạo External Table trỏ tới gpfdist trên Greenplum

Trên giao diện dòng lệnh psql của Greenplum, tạo một bảng ngoài liên kết với địa chỉ của gpfdist:

SQL

CREATE READABLE EXTERNAL TABLE ext_fact_transactions (
    transaction_id BIGINT,
    user_id BIGINT,
    amount NUMERIC(12,2),
    created_at TIMESTAMP
) 
LOCATION ('gpfdist://etl-server-ip:8080/transactions_*.csv')
FORMAT 'TEXT' (DELIMITER ',' NULL '');

Bước 3: Nạp dữ liệu vào bảng chính chỉ bằng 1 câu lệnh SQL duy nhất

Bây giờ, bạn chỉ cần đổ dữ liệu từ bảng ngoài vào bảng đích chính thức (fact_transactions) với tốc độ cao nhất:

SQL

INSERT INTO fact_transactions 
SELECT * FROM ext_fact_transactions;

Ngay khoảnh khắc bạn ấn Enter, toàn bộ các Segment trong cụm sẽ đồng loạt "lao vào" gpfdist để kéo dữ liệu về nạp song song.

Tóm tắt Bài học 21

  • gpfdist là công cụ phân phối file chuyên dụng của Greenplum, giúp giải quyết triệt để nút thắt cổ chai của Master Node trong lệnh COPY truyền thống.

  • Hoạt động dựa trên mô hình HTTP Server nhẹ, cho phép tất cả các Segment đồng loạt kết nối song song để tự động kéo dữ liệu về phân tán.

  • Kết hợp giữa gpfdist và External Tables là tiêu chuẩn vàng trong các kiến trúc ETL hiện đại để nạp hàng Terabyte dữ liệu vào Greenplum với tốc độ tối đa của phần cứng.

Ở bài học tiếp theo (Bài học 22), chúng ta sẽ tìm hiểu sâu hơn về công cụ này qua bài học: External Tables (Readable & Writable): Truy vấn trực tiếp file CSV/Text bên ngoài mà không cần Import.

Bạn có muốn thử cấu hình một tiến trình gpfdist kèm theo tính năng ghi nhận dòng lỗi (Log Errors) để xử lý file CSV bẩn không?


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí