Triển khai Apache Phoenix để truy vấn HBase qua SQL
Bước đầu tiên là tải và giải nén Apache Phoenix để có thể thực thi các câu lệnh SQL trên dữ liệu HBase mà không cần viết code Java/Scala thủ công.
Tải bản Phoenix tương thích với HBase hiện tại (phiên bản 5.x cho HBase 2.x/3.x). Giải nén vào thư mục /opt để đồng bộ với cấu trúc Hadoop/HBase đã cài đặt ở các phần trước.
cd /opt
wget https://archive.apache.org/dist/phoenix/phoenix-5.2.5-HBase-2.x/apache-phoenix-5.2.5-HBase-2.x-bin.tar.gz
tar -xzf apache-phoenix-5.2.5-HBase-2.x-bin.tar.gz
mv apache-phoenix-5.2.5-HBase-2.x-bin phoenix
Thư mục /opt/phoenix được tạo với cấu trúc bin, lib, và docs. Kết quả mong đợi là không có lỗi về quyền truy cập hoặc thiếu gói tin.
Cấu hình Phoenix Client và khởi động Shell
Để Phoenix giao tiếp với cụm HBase, cần thiết lập biến môi trường HBASE_CONF_DIR trỏ đến thư mục cấu hình của HBase (thường là /etc/hbase/conf).
Thực thi lệnh export trong shell hiện tại hoặc thêm vào ~/.bashrc để lưu biến môi trường.
export HBASE_CONF_DIR=/etc/hbase/conf
/opt/phoenix/bin/sqlline.sh --server hbase://localhost:20445
Các biến môi trường được thiết lập. Kết quả mong đợi là xuất hiện prompt "0: jdbc:hbase://localhost:20445>" cho thấy Phoenix đã kết nối thành công đến HBase RegionServer.
Tạo Table và thực thi truy vấn SQL
Sử dụng Phoenix để tạo một bảng tương ứng với dữ liệu HBase đã có sẵn hoặc tạo mới hoàn toàn. Phoenix tự động ánh xạ các column family thành column trong SQL.
Thực thi lệnh CREATE TABLE với cú pháp SQL chuẩn, bao gồm định nghĩa Primary Key và các thuộc tính dữ liệu.
CREATE TABLE IF NOT EXISTS phoenix_users (
user_id VARCHAR PRIMARY KEY,
username VARCHAR,
email VARCHAR,
created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Bảng phoenix_users được tạo trong HBase với column family "DATA" (mặc định). Kết quả mong đợi là thông báo "SUCCESS" và có thể thực hiện lệnh SELECT ngay sau đó.
Chèn và đọc dữ liệu qua SQL
Sử dụng lệnh INSERT VALUES để chèn dữ liệu vào bảng đã tạo và SELECT để kiểm tra dữ liệu đã được lưu vào HBase chưa.
Thực hiện chèn 3 bản ghi mẫu và truy vấn toàn bộ bảng để xác minh tính nhất quán.
UPSERT INTO phoenix_users VALUES ('u001', 'alice', 'alice@example.com');
UPSERT INTO phoenix_users VALUES ('u002', 'bob', 'bob@example.com');
UPSERT INTO phoenix_users VALUES ('u003', 'charlie', 'charlie@example.com');
SELECT * FROM phoenix_users;
Dữ liệu được ghi vào HBase RegionServer. Kết quả mong đợi là hiển thị 3 dòng dữ liệu với các cột user_id, username, email và created_time.
Verify kết quả Phoenix
Để chắc chắn Phoenix đã ghi dữ liệu vào HBase thực sự, sử dụng shell HBase native để scan bảng và so sánh với kết quả SQL.
exit
hbase shell
scan 'phoenix:phoenix_users'
Trong shell HBase, bạn sẽ thấy dữ liệu dưới dạng raw key-value. Kết quả mong đợi là nội dung dữ liệu khớp 100% với kết quả SELECT từ Phoenix, chứng minh việc tích hợp hoạt động chính xác.
Tích hợp Spark với HBase để xử lý Big Data
Apache Spark cung cấp khả năng xử lý song song lớn trên dữ liệu HBase. Cần cài đặt gói kết nối HBase cho Spark (hbase-spark) vào thư mục lib của Spark.
Tải dependency tương thích với phiên bản Spark và HBase đang chạy. Giả sử Spark đang chạy phiên bản 3.x và HBase 2.x.
cd /opt/spark/jars
wget https://repo1.maven.org/maven2/org/apache/hbase/hbase-spark/1.0.0/hbase-spark-1.0.0.jar
File jar được tải về thư mục /opt/spark/jars. Kết quả mong đợi là file có kích thước khoảng 100MB+ và không bị lỗi checksum.
Viết mã Spark (Python/PySpark) để đọc ghi dữ liệu
Sử dụng PySpark để tạo DataFrame từ HBase và ghi ngược lại HBase. Cần cấu hình tham số đọc ghi (scan settings) để chỉ định bảng và các column cần xử lý.
Tạo file script python tên là hbase_spark_integration.py với nội dung đầy đủ dưới đây.
cat > /opt/scripts/hbase_spark_integration.py
File script được tạo tại /opt/scripts/. Kết quả mong đợi là không có lỗi cú pháp Python.
Thực thi Spark Job trên cụm
Chạy script Python đã tạo thông qua spark-submit. Đảm bảo biến môi trường HBASE_CONF_DIR vẫn được set để Spark tìm thấy cấu hình HBase.
export HBASE_CONF_DIR=/etc/hbase/conf
/opt/spark/bin/spark-submit \
--master yarn \
--deploy-mode cluster \
--conf spark.yarn.dist.jars=/opt/spark/jars/hbase-spark-1.0.0.jar \
/opt/scripts/hbase_spark_integration.py
Job Spark được gửi lên YARN ResourceManager. Kết quả mong đợi là xuất hiện Application ID và log "Completed successfully" khi job kết thúc.
Verify kết quả Spark
Kiểm tra dữ liệu đã được Spark ghi vào bảng mới (phoenix_users_spark) bằng Phoenix Shell để xác nhận quá trình đọc-ghi thành công.
cd /opt/phoenix/bin
./sqlline.sh --server hbase://localhost:20445
SELECT * FROM phoenix_users_spark;
Dữ liệu trong bảng phoenix_users_spark hiển thị cột "status" đã được chuyển thành chữ hoa. Kết quả mong đợi là thấy dữ liệu đã được biến đổi đúng theo logic trong script Spark.
So sánh hiệu năng truy vấn SQL và HBase Native
Thực hiện benchmark đơn giản để so sánh tốc độ truy vấn giữa Phoenix SQL và HBase Shell native trên cùng một lượng dữ liệu lớn.
Chuẩn bị dữ liệu mẫu bằng cách chèn 10,000 bản ghi vào bảng phoenix_benchmark và đo thời gian thực thi query.
# Tạo bảng benchmark trong Phoenix
/opt/phoenix/bin/sqlline.sh --server hbase://localhost:20445
CREATE TABLE IF NOT EXISTS phoenix_benchmark (
id BIGINT PRIMARY KEY,
data VARCHAR(1000)
);
-- Chèn dữ liệu mẫu (sử dụng script batch hoặc loop trong sqlline nếu cần)
-- Giả sử dữ liệu đã có sẵn, ta chỉ đo query
SELECT COUNT(*) FROM phoenix_benchmark;
Bảng được tạo và dữ liệu được chuẩn bị. Kết quả mong đợi là query COUNT(*) trả về số lượng bản ghi chính xác.
Đo thời gian truy vấn Phoenix SQL
Sử dụng lệnh thời gian (time) trong shell để đo thời gian thực thi câu lệnh SELECT phức tạp trên Phoenix.
cd /opt/phoenix/bin
time ./sqlline.sh --server hbase://localhost:20445 -e "SELECT * FROM phoenix_benchmark WHERE id > 5000 AND id < 6000;" 2>&1 | grep "real"
Thời gian thực thi được in ra dòng "real". Kết quả mong đợi là một giá trị thời gian cụ thể (ví dụ: 0m 1.500s).
Đo thời gian truy vấn HBase Native
Thực hiện cùng một phép lọc dữ liệu (row key range) nhưng sử dụng lệnh scan của HBase Shell để so sánh hiệu năng trực tiếp.
time hbase shell -e "scan 'phoenix:phoenix_benchmark', {FILTER => \"PrefixFilter('5')\"}" 2>&1 | grep "real"
Lưu ý: Cú pháp filter trong HBase shell khác với SQL. Kết quả mong đợi là một giá trị thời gian thường nhanh hơn Phoenix do bỏ qua lớp giải tích SQL (SQL parser) và ánh xạ schema.
Phân tích kết quả so sánh
Phoenix SQL thường chậm hơn HBase native khoảng 20-30% cho các truy vấn đơn giản do chi phí chuyển đổi cú pháp SQL sang HBase protocol.
Tuy nhiên, Phoenix cung cấp lợi ích lớn về khả năng tối ưu hóa (optimizer), chỉ mục (index) và join, giúp hiệu năng vượt trội trong các truy vấn phức tạp mà HBase native khó thực hiện.
echo "Kết quả so sánh:"
echo "Phoenix SQL: [Thời gian đo được]"
echo "HBase Native: [Thời gian đo được]"
echo "Kết luận: Phoenix phù hợp cho truy vấn phức tạp, HBase Native phù hợp cho point-query tốc độ cao."
Bài học rút ra là lựa chọn công cụ truy vấn dựa trên use-case cụ thể. Kết quả mong đợi là có được số liệu thực tế để đưa vào báo cáo hiệu năng hệ thống.
Điều hướng series:
Mục lục: Series: Triển khai Database phân tán với Apache HBase trên Ubuntu 24.04
« Phần 5: Quản lý Table, Schema và các thao tác dữ liệu nâng cao
Phần 7: Bảo mật HBase: Kerberos, ACL và mã hóa dữ liệu »