1. Nhập dữ liệu trực tiếp bằng INSERT và LOAD STREAM
Đối với lượng dữ liệu nhỏ hoặc các thao tác thử nghiệm nhanh, việc sử dụng câu lệnh SQL chuẩn hoặc tải trực tiếp qua HTTP là phương án tối ưu nhất để kiểm tra tính khả thi của mô hình dữ liệu.
Sử dụng lệnh INSERT trực tiếp
Thực hiện lệnh INSERT để đưa dữ liệu mẫu vào bảng đã tạo ở phần 4. Cách này đơn giản nhưng không khuyến khích cho dữ liệu lớn do chi phí overhead cao của giao dịch.
Trước khi chạy, đảm bảo bạn đã có kết nối MySQL Client hoặc MySQL Shell đến Frontend (FE) của Doris trên cổng 9030.
mysql -h -P 9030 -u root -p
Kết quả mong đợi: Bạn thấy prompt của MySQL (mysql>) và có thể thực thi lệnh SQL.
Thực hiện lệnh INSERT vào bảng sales_data (giả định bảng từ phần 4 có cấu trúc id, date, amount, category):
INSERT INTO sales_data VALUES (1, '2024-01-01', 150.50, 'Electronics');
INSERT INTO sales_data VALUES (2, '2024-01-02', 200.00, 'Clothing');
INSERT INTO sales_data VALUES (3, '2024-01-03', 75.25, 'Books');
Kết quả mong đợi: MySQL trả về thông báo Query OK, 3 rows affected cho mỗi lệnh.
Verify kết quả INSERT
Chạy lệnh SELECT để xác nhận dữ liệu đã được ghi vào bảng Columnar và có thể đọc được ngay lập tức.
SELECT COUNT(*) FROM sales_data;
SELECT * FROM sales_data WHERE id = 1;
Kết quả mong đợi: Lệnh COUNT trả về số lượng dòng tăng lên, và lệnh SELECT trả về chi tiết dòng vừa nhập.
2. Stream Load: Nhập dữ liệu từ file CSV/JSON
Stream Load là phương thức chuẩn để nhập dữ liệu từ file (CSV, JSON, Avro, Parquet) vào Doris với thông lượng cao. Cơ chế này gửi file qua HTTP PUT trực tiếp đến Backend (BE) node.
Chuẩn bị file dữ liệu mẫu
Tạo một file CSV đơn giản trên máy client (hoặc trên server BE nếu bạn chạy thử nghiệm) để dùng làm nguồn dữ liệu.
cat > /tmp/sales_stream.csv
Kết quả mong đợi: File /tmp/sales_stream.csv được tạo thành công.
Cấu hình Stream Load bằng cURL
Sử dụng công cụ curl để gửi yêu cầu HTTP PUT. Bạn cần cấu hình các tham số quan trọng: label (độc nhất cho mỗi lần load), column_separator (phân cách cột), và strip_outer_quotes (xử lý dấu ngoặc nếu có).
Tham số label là bắt buộc và phải duy nhất trên toàn cluster để đảm bảo tính idempotent (chạy lại cùng label sẽ không tạo dữ liệu trùng).
curl --location-trusted \
-u root: \
-H "label:stream_load_$(date +%s)" \
-H "column_separator:," \
-H "strip_outer_quotes:true" \
-T /tmp/sales_stream.csv \
http://:8030/api/test_db/sales_data/_stream_load
Kết quả mong đợi: JSON trả về với "status": "Success", "number_of_rows": 5 và "number_of_rows_in_file": 5. Nếu lỗi, kiểm tra "messages" trong JSON.
Verify kết quả Stream Load
Kiểm tra tổng số dòng trong bảng để đảm bảo 5 dòng từ file CSV đã được thêm vào thành công bên cạnh các dòng từ INSERT trước đó.
mysql -h -P 9030 -u root -p -e "SELECT COUNT(*) FROM sales_data;"
Kết quả mong đợi: Số lượng dòng bằng tổng của 3 dòng (INSERT trước) + 5 dòng (Stream Load) = 8 dòng.
3. Bulk Load từ HDFS và S3
Đối với dữ liệu lớn (Big Data), việc tải file qua HTTP Stream Load sẽ gây nghẽn mạng. Bulk Load thông qua các External Catalog (HDFS, AWS S3, Aliyun OSS) cho phép Doris tự động đọc dữ liệu từ kho lưu trữ phân tán vào BE nodes.
Cấu hình External Catalog (HDFS)
Trước khi load từ HDFS, bạn cần tạo một External Catalog trong Doris để định nghĩa kết nối tới HDFS NameNode.
CREATE EXTERNAL CATALOG hdfs_catalog
PROPERTIES (
"type" = "hdfs",
"hdfs_namenode_url" = "hdfs://:8020",
"hdfs_principal_name" = "",
"hdfs_keytab_path" = ""
);
Kết quả mong đợi: Lệnh chạy thành công, không có lỗi. Bạn có thể kiểm tra bằng SHOW CREATE CATALOG hdfs_catalog;.
Lưu ý: Nếu không dùng Kerberos, để trống hdfs_principal_name và hdfs_keytab_path.
Thực hiện lệnh INSERT OVERWRITE từ HDFS
Sử dụng câu lệnh INSERT OVERWRITE hoặc INSERT INTO với source là HDFS. Doris sẽ tự động parallel read từ HDFS vào các BE.
INSERT INTO sales_data
FROM HDFS
PROPERTIES (
"path" = "hdfs://:8020/data/sales/*.csv",
"format" = "csv",
"column_separator" = ",",
"strip_outer_quotes" = "true",
"column_mapping" = "id,date,amount,category"
);
Kết quả mong đợi: Lệnh trả về Query OK. Dữ liệu từ tất cả file trong path HDFS được import vào bảng.
Cấu hình và Load từ AWS S3
Tương tự với S3, bạn cần tạo External Catalog trỏ đến AWS S3, sau đó thực hiện lệnh INSERT.
CREATE EXTERNAL CATALOG s3_catalog
PROPERTIES (
"type" = "s3",
"aws_access_key_id" = "",
"aws_secret_access_key" = "",
"aws_s3_region" = "us-west-2"
);
Kết quả mong đợi: Catalog S3 được tạo thành công.
Thực hiện lệnh load từ bucket S3:
INSERT INTO sales_data
FROM S3
PROPERTIES (
"path" = "s3://my-data-bucket/sales_data/*.csv",
"format" = "csv",
"column_separator" = ",",
"column_mapping" = "id,date,amount,category"
);
Kết quả mong đợi: Dữ liệu từ S3 được tải vào bảng Doris.
Verify kết quả Bulk Load
So sánh số lượng dòng trong bảng với số lượng file hoặc tổng dòng trong HDFS/S3 để đảm bảo không có dòng bị lỗi hoặc bỏ sót.
SELECT COUNT(*) FROM sales_data;
SHOW LOAD WHERE db="test_db" AND table="sales_data" LIMIT 10;
Kết quả mong đợi: Số lượng dòng tăng vọt. Lệnh SHOW LOAD hiển thị trạng thái FINISHED với số lượng row thành công.
4. Tối ưu tham số nhập liệu để đạt thông lượng cao nhất
Để đạt được throughput tối đa (hàng triệu dòng/giây), bạn cần tinh chỉnh các tham số của Stream Load và cấu hình session của Doris.
Tối ưu Stream Load với nhiều file và Parallelism
Thay vì gửi 1 file lớn, hãy chia nhỏ thành nhiều file (mỗi file khoảng 10MB - 100MB) và gửi đồng thời nhiều request Stream Load khác nhau. Doris có cơ chế merge tự động.
Cấu hình tham số timeout để tránh timeout khi xử lý file lớn, và max_filter_ratio để quyết định tỷ lệ lỗi cho phép.
curl --location-trusted \
-u root: \
-H "label:bulk_stream_$(date +%s)_0" \
-H "column_separator:," \
-H "timeout:600" \
-H "max_filter_ratio:0.01" \
-T /tmp/part_0.csv \
http://:8030/api/test_db/sales_data/_stream_load
Kết quả mong đợi: Thời gian upload giảm đáng kể so với file đơn lẻ lớn. Tỷ lệ lỗi thấp hơn nhờ max_filter_ratio.
Điều chỉnh tham số BE (Backend) trong config
Chỉnh sửa file be.conf trên các node Backend để tăng cường khả năng xử lý nhập liệu song song.
Đường dẫn file: /opt/apache-doris/be/conf/be.conf (hoặc thư mục cài đặt tương ứng của bạn).
cat >> /opt/apache-doris/be/conf/be.conf
Kết quả mong đợi: File config được cập nhật. Cần restart BE để (có thể dùng lệnh systemctl restart doris-be hoặc reload config nếu version hỗ trợ).
Verify hiệu năng sau tối ưu
Thực hiện một lần Stream Load với file lớn hoặc nhiều file song song, sau đó kiểm tra Web UI (Port 8040) hoặc lệnh SHOW LOAD để xem Load Duration và Rows Per Second.
SHOW LOAD WHERE db="test_db" AND table="sales_data" ORDER BY create_time DESC LIMIT 1;
Kết quả mong đợi: Trạng thái FINISHED, cột Rows cao, và Load Duration ngắn hơn so với cấu hình mặc định.
Điều hướng series:
Mục lục: Series: Triển khai Database Columnar với Apache Doris trên Ubuntu 24.04
« Phần 4: Tạo Database và Table với mô hình dữ liệu Columnar
Phần 6: Tối ưu hóa truy vấn và phân tích dữ liệu Columnar »