Tải và giải nén bản phân phối Apache HBase
Bước đầu tiên là tải phiên bản ổn định nhất của Apache HBase về server. Chúng ta sẽ sử dụng phiên bản 2.5.x (hoặc mới nhất hiện có) để đảm bảo tương thích tốt với JDK 17 trên Ubuntu 24.04.
Tại sao: Sử dụng bản release chính thức từ Apache mirror đảm bảo tính toàn vẹn và bảo mật, tránh các bản fork không rõ nguồn gốc.
Kết quả mong đợi: Thư mục cài đặt HBase được tạo thành công và các file jar cần thiết nằm trong thư mục lib.
Thực hiện tải về và giải nén vào thư mục /opt/hbase.
sudo mkdir -p /opt/hbase
cd /opt
wget https://archive.apache.org/dist/hbase/2.5.1/hbase-2.5.1-bin.tar.gz
sudo tar -xzf hbase-2.5.1-bin.tar.gz -C /opt/hbase --strip-components=1
sudo chown -R $USER:$USER /opt/hbase
Verify: Kiểm tra cấu trúc thư mục và phiên bản.
ls /opt/hbase/bin
/opt/hbase/bin/hbase version
Chuẩn biến biến môi trường HBASE_HOME
Cần thêm biến môi trường HBASE_HOME vào file ~/.bashrc để có thể gọi lệnh hbase từ bất kỳ đâu mà không cần gõ đường dẫn đầy đủ.
echo 'export HBASE_HOME=/opt/hbase' >> ~/.bashrc
echo 'export PATH=$PATH:$HBASE_HOME/bin' >> ~/.bashrc
source ~/.bashrc
Cấu hình file hbase-env.sh
File hbase-env.sh là nơi quan trọng nhất để chỉ định đường dẫn tới JDK (JAVA_HOME) và Hadoop (HADOOP_HOME). Nếu cấu hình sai ở đây, HBase sẽ không thể khởi động hoặc không thể kết nối với HDFS.
Tại sao: HBase là một ứng dụng Java thuần, nó cần biết chính xác vị trí của JRE để chạy. Ngoài ra, trong chế độ Pseudo-Distributed, nó cần tìm thấy các file jar của Hadoop để thực hiện I/O lên HDFS.
Kết quả mong đợi: File cấu hình được cập nhật, các biến môi trường HBASE_OPTS và HBASE_MANAGES_JAVA được điều chỉnh đúng.
Chỉnh sửa file /opt/hbase/conf/hbase-env.sh. Dưới đây là nội dung cần thêm hoặc sửa đổi (các dòng quan trọng được đánh dấu bằng chú thích).
sudo nano /opt/hbase/conf/hbase-env.sh
Sửa các dòng sau trong file (tham khảo cấu hình chuẩn cho Ubuntu 24.04 với JDK 17 và Hadoop 3.x đã cài ở Phần 2):
# Set JAVA_HOME, HADOOP_HOME, HBASE_HOME if not set
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export HADOOP_HOME=/opt/hadoop
export HBASE_HOME=/opt/hbase
# HBase specific settings
export HBASE_HEAPSIZE=2G
export HBASE_MANAGES_JAVA="true"
# For Pseudo-Distributed mode, ensure HDFS is available
export HBASE_OPTS="-XX:+UseG1GC"
Verify: Kiểm tra xem biến môi trường đã được nhận diện chưa bằng lệnh echo.
echo $JAVA_HOME
echo $HADOOP_HOME
Cấu hình file hbase-site.xml cho chế độ Pseudo-Distributed
Đây là bước chuyển đổi HBase từ Standalone (chỉ lưu trên disk local) sang Pseudo-Distributed (lưu trữ dữ liệu trên HDFS). Chúng ta cần cấu hình để HBase sử dụng HDFS làm backend storage thay vì LocalFileSystem.
Tại sao: Trong môi trường sản xuất, dữ liệu phải được phân tán và dư thừa (replication) trên các node khác nhau. Pseudo-Distributed mô phỏng điều này trên 1 node duy nhất bằng cách sử dụng HDFS.
Kết quả mong đợi: File hbase-site.xml được tạo mới với các property định nghĩa backend storage là hdfs:// và đường dẫn zookeeper.
Thay thế toàn bộ nội dung file /opt/hbase/conf/hbase-site.xml bằng cấu hình dưới đây. Lưu ý: Thay thế bằng hostname thực tế của server (ví dụ: `hbase-node1` hoặc `localhost` nếu dùng loopback).
sudo nano /opt/hbase/conf/hbase-site.xml
Nội dung hoàn chỉnh của file hbase-site.xml:
hbase.rootdir
hdfs://:9000/hbase
The base directory for HBase files on HDFS.
hbase.cluster.distributed
true
Set to true for distributed mode (Pseudo-Distributed).
hbase.zookeeper.quorum
The hosts in the Zookeeper ensemble.
hbase.zookeeper.property.clientPort
2181
Port for Zookeeper clients.
hbase.master.info.port
16010
Web UI port for HBase Master.
hbase.regionserver.info.port
16030
Web UI port for RegionServer.
hbase.tmp.dir
/tmp/hbase
Temporary directory for HBase.
Verify: Đảm bảo file XML hợp lệ và các tag đóng mở đúng.
xmllint --noout /opt/hbase/conf/hbase-site.xml
Thay thế bằng hostname thực tế của máy (lệnh `hostname` để lấy).
hostname
sed -i "s//$HOSTNAME/g" /opt/hbase/conf/hbase-site.xml
Khởi động HBase và kiểm tra Shell giao diện dòng lệnh
Trước khi khởi động HBase, chúng ta cần đảm bảo HDFS đã chạy (như đã làm ở Phần 2). Sau đó, khởi động cụm HBase bằng lệnh start.sh. Trong chế độ Pseudo-Distributed, HBase sẽ tự động khởi tạo Master, RegionServer và Zookeeper (nếu chưa có).
Tại sao: Lệnh start.sh sẽ đọc các file cấu hình ở trên để khởi tạo các tiến trình cần thiết. Nếu HDFS chưa chạy, HBase sẽ lỗi khi cố gắng tạo thư mục hbase.rootdir.
Kết quả mong đợi: Các tiến trình hbase-master, hbase-regionserver xuất hiện trong danh sách process, và log không có lỗi (Error).
Kiểm tra trạng thái HDFS trước khi start HBase.
jps | grep -E "NameNode|DataNode"
Khởi động HBase.
$HBASE_HOME/bin/start-hbase.sh
Kiểm tra các tiến trình đang chạy của HBase.
jps | grep -E "HBase|ZooKeeper"
Kết quả mong đợi: Bạn sẽ thấy các tiến trình như: HMaster, HRegionServer, QuorumPeerMain (Zookeeper).
Khởi động HBase Shell để tương tác trực tiếp với database.
$HBASE_HOME/bin/hbase shell
Kết quả mong đợi: Giao diện prompt thay đổi thành `hbase(main):000:0>` và không có lỗi kết nối.
Tạo table mẫu và thực hiện các thao tác CRUD cơ bản
Sau khi vào shell, chúng ta sẽ thực hiện các thao tác cơ bản: Tạo bảng (Create), Chèn dữ liệu (Put), Truy vấn (Get/Scan), và Xóa (Delete). Đây là bước xác nhận HBase đã hoạt động chính xác với HDFS backend.
Tại sao: Thao tác này kiểm tra toàn bộ luồng: Client -> Master -> RegionServer -> HDFS. Nếu dữ liệu được ghi và đọc thành công, nghĩa là hệ thống phân tán đã vận hành tốt.
Kết quả mong đợi: Table được tạo, dữ liệu được lưu, và truy vấn trả về đúng giá trị đã nhập.
Thực hiện các lệnh sau trong giao diện `hbase shell` (đã mở ở bước trước):
1. Tạo table tên là 'users' với 2 column families: 'info' và 'logs'.
create 'users', 'info', 'logs'
Kết quả mong đợi: Thông báo `Table 'users' created`.
2. Chèn dữ liệu vào bảng (Put). Cú pháp: `put '
', '', ':', ''`.
put 'users', 'user001', 'info:name', 'Nguyen Van A'
put 'users', 'user001', 'info:age', '30'
put 'users', 'user001', 'logs:last_login', '2024-05-20T10:00:00Z'
Kết quả mong đợi: Không có output (hoặc thông báo thành công tùy phiên bản), prompt quay lại.
3. Lấy dữ liệu theo RowKey (Get).
get 'users', 'user001'
Kết quả mong đợi: Trả về 3 dòng dữ liệu tương ứng với 3 lệnh put ở trên.
4. Quét toàn bộ dữ liệu trong bảng (Scan).
scan 'users'
Kết quả mong đợi: Liệt kê tất cả row và column family có trong bảng.
5. Cập nhật dữ liệu (Put lại với cùng rowkey và qualifier).
put 'users', 'user001', 'info:age', '31'
get 'users', 'user001', 'info:age'
Kết quả mong đợi: Giá trị age trả về là '31'.
6. Xóa dữ liệu (Delete) và xóa cả Row (DeleteRow).
delete 'users', 'user001', 'logs:last_login'
get 'users', 'user001'
delete 'users', 'user001'
scan 'users'
Kết quả mong đợi: Sau lệnh delete row, scan 'users' trả về kết quả rỗng.
7. Xóa bảng (Drop) để dọn dẹp.
disable 'users'
drop 'users'
Kết quả mong đợi: Table 'users' được xóa khỏi hệ thống.
Thoát khỏi shell HBase.
exit
Đ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 2: Triển khai Hadoop HDFS làm nền tảng lưu trữ cho HBase
Phần 4: Triển khai HBase Distributed Mode trên cụm đa node »